24 KiB
Changelog
All notable infrastructure / service / doc changes. Newest first.
2026-05-23
Observability stack (CT 109 "ops")
-
CT 109 ("ops") fully provisioned: Debian 13, Docker 29.5.2. Stack
/opt/stacks/monitoring/running Prometheus (:9090), Grafana (:3000 LAN-only, admin/tapirnase), node-exporter, Loki, Alloy, pve-exporter, and Gotify-bridge. CT info updated inct-inventory.md. -
Loki deployed on CT 109: log aggregation at
:3100, 30-day retention, TSDB v13 schema, filesystem storage at./loki/data/.limits_configsetreject_old_samples_max_age: 168h(7 days) to handle log backfill from HA restart. Grafana datasource auto-provisioned viaprovisioning/datasources/loki.yml. Grafana Loki datasource UID:P8E80F9AEF21F6940. -
Prometheus remote_write receiver enabled:
--web.enable-remote-write-receiveradded to CT 109 Prometheus. Required for HA Alloy add-on to push metrics directly. -
prometheus-pve-exporter deployed:
prompve/prometheus-pve-exporter:lateston CT 109; credentials in./pve-exporter/pve.yml(chmod 644 — container runs non-root). PVEmonitor@pveservice user + API tokenc4be45dc-...created withPVEAuditorrole on/. Prometheus scrapes:9221/pve?target=192.168.1.20. Metrics: per-VM/CT CPU, memory, disk, network I/O. -
HA prometheus integration added:
prometheus:block in HAconfiguration.yaml; HA exposes ~9211hass_*entity-level metrics at:8123/api/prometheus. CT 109 Prometheus scrapes with bearer token (HA long-lived token),scrape_interval: 60s. This is distinct from Alloy host-level metrics — both needed. -
Grafana Alloy deployed across all 12 hosts: Alloy v1.16.1 from Grafana apt repo. River-syntax configs ship Docker + journal log scraping with host labels to
http://192.168.1.8:3100/loki/api/v1/push. Deployment breakdown:- Docker Compose (CT 101, 104, 105, 110, 111, 112, 113): container with docker socket + journal mounts,
group_add: ["999"]for journal access. - Binary + systemd (CT 102, 103, 108, nuc): apt install
alloy, config at/etc/alloy/config.alloy,systemctl enable --now alloy. Journal-only (no Docker socket on these hosts). - HA add-on (VM 100):
wymangr/hassos-addonsGrafana Alloy v0.0.8 — config fills inprometheus_remote_writeto CT 109 + Loki endpoint. Distinct host labelhomeassistant. - All configs stored in
/opt/homelab-configs/alloy/(see homelab-configs repo below).
- Docker Compose (CT 101, 104, 105, 110, 111, 112, 113): container with docker socket + journal mounts,
-
5 Grafana dashboards provisioned:
- Node Exporter Full (Grafana ID 1860) — imported for all hosts
- LiteLLM (custom-built) —
/d/.../litellm; panels: request rate, error rate, token throughput, model split, p95 latency - Home Assistant (Grafana ID 12481 + custom panels) — power/energy, climate (temp/humidity/CO₂), home activity, device health/battery
- Loki / log explorer — imported
- Prometheus target health — imported
-
3 Grafana alert rules created via
/api/v1/provisioning/alert-rules(folderalerts-folder):Node disk > 85%— per-instance mountpoint disk usage, 5m windowPrometheus target down—count(up == 0) > 0, 5m windowLiteLLM error rate > 5%— 10m rate window, 5m pending
Homarr (CT 109)
-
Homarr v1 deployed:
ghcr.io/homarr-labs/homarr:lateston CT 109:7575. Data at./data/, docker socket bind-mounted read-only for auto-discovery. LAN-only (no Zoraxy route). -
homelab-configs Gitea repo: private repo
fkrebs/homelab-configsatgit.nuclide.systems; cloned to/opt/homelab-configson CT 109. Daily cron at 03:00 syncs: Alloy configs per host, Homarr docker-compose, Homarr SQLite dump. Script at/usr/local/bin/sync-homelab-configs. Commit + push on any diff.
Pocket-ID OIDC (wired via API)
-
Homarr OIDC: client
63a94e30created via Pocket-ID API. Redirect URIhttp://192.168.1.8:7575/api/auth/callback/oidc. Homarr compose updated (AUTH_PROVIDER=oidc,AUTH_OIDC_CLIENT_ID,AUTH_OIDC_CLIENT_SECRET,AUTH_OIDC_ISSUER, etc.), force-recreated. SSO active 2026-05-23. -
Grafana OIDC: client
92d987d5created via Pocket-ID API with PKCE enabled. Redirect URIhttp://192.168.1.8:3000/login/generic_oauth. Grafana compose updated withGF_AUTH_GENERIC_OAUTH_*vars, force-recreated. SSO active 2026-05-23; role mapping:adminsgroup → Admin, else Viewer.
Arcane + Dozzle migrated to CT 109; headless agents on all hosts
- Arcane server moved CT 104 → CT 109: stack at
/opt/stacks/arcane/docker-compose.ymlon CT 109,APP_URL=http://192.168.1.8:10002. Zoraxy proxy route forarcane.nuclide.systemsupdated to192.168.1.8:10002. Old CT 104 arcane container stopped (renamed decommissioned). - Dozzle server moved CT 104 → CT 109: stack at
/opt/stacks/dozzle/docker-compose.yml(:10001). Remote agents configured for all 7 Docker hosts (CT 101, 104, 105, 110, 111, 112, 113). - Headless agents deployed on CT 101, 104, 105, 110, 111, 112 via
/opt/stacks/ops-agents/docker-compose.yml(Arcane agent + Dozzle agent). CT 113 already had Arcane agent; updatedMANAGER_API_URLto CT 109 and added Dozzle agent. - docs-server migrated CT 111 → CT 109:
mkdocs.ymlsite_url fixed, nav expanded. docs-server now athttp://192.168.1.8:13080.
HAOS KVM OOM protection
- Root cause identified: karakeep_chrome (CT 104,
gcr.io/zenika-hub/alpine-chrome:123) triggered host-level OOM. Linux OOM killer chose HAOS KVM (PID 588858, 10.3 GB RSS) as largest victim. HA was not crashing internally — it was being killed externally. - shm_size: '512m' added to karakeep chrome service and force-recreated to reduce Chrome shared memory pressure.
- oom_score_adj=-300 set on HAOS KVM PID (protects it from OOM killer — minimum score = hardest to kill).
- Persistence via systemd timer (
protect-haos-kvm.timeron nuc): fires 60s after boot then every 5 min. Checks if KVM PID for VM 100 has oom_score_adj=-300; sets it if not.
n8n flow tracking
- Gitea repo
fkrebs/n8n-flowscreated: exports all n8n workflows as individual JSON files. Daily cron (CT 104, 03:30) syncs vian8n export:workflow --all→ split → commit + push. - IDEAS.md: 10 automation ideas documented with node designs (health check flow, Backrest notify, Docling pipeline, HA alerts, Gitea digest, WAL-G monitor, etc.).
- 10 Gitea issues filed on
fkrebs/n8n-flowsfor each idea — tracked in memory. - Homelab health check (bash/systemd): interim implementation on nuc (
/usr/local/bin/homelab-health,homelab-health.timer, every 1h). Checks: container status per host via SSH, HA VM status, disk usage, key HTTP endpoints. Auto-fix:docker startfor stopped containers,docker prunefor CT104 /tmp >80%. Escalates to Gotify (homelab-healthapp, tokenAz9NpC-m1jjf571) for crash loops/disk critical. Migration to n8n tracked as issue #1.
CT 104 ai repo cleanup
- lobehub/data/ untracked: Postgres data dir was accidentally tracked in git.
git rm --cached -r lobehub/data/+ added to.gitignore. Committed alongside: litellm-config/config.yaml, mcp-gateway updates (litellm_sync.py, model_assignments.json, models.html, server.py), lobehub.yml (claude-* models).
Docs
README.mdexpanded: monitoring quick-links table (Homarr, Grafana, Prometheus, Loki, Alloy UI), public services table by category, operator-only LAN links, related repos table (homelab-configs, klipper-config, n8n-flows).infra/portmap.mdupdated: added Loki :3100, pve-exporter :9221, Alloy :12345, Homarr :7575; Alloy deployment notes across all 12 hosts; updated monitoring section.services/homelab-architecture.mdCT 109 description updated to reflect full stack.services/pocket-id.mdcreated: OIDC endpoints, client creation walkthrough, per-service env var patterns (Homarr, Grafana, Gitea, Coder, Generic), current client registry, backup notes.
2026-05-22
-
Pocket-ID backup wired into Backrest: CT 110 SQLite-only (no Postgres). Pre-backup hook script at
/opt/backrest/scripts/pocketid-prestage.shon CT 103: SSHs to CT 110, runspocket-id exportinside container,docker cps ZIP to host, scp's ZIP + signing keys to/mnt/pve/unas/services/pocketid-backup/.services-backup-plansnapshots staging → jottacloud. Verified: hook fires before snapshot, snapshot includes Pocket-ID data. -
Vaultwarden data → local zfs: Moved
/mnt/pve/unas/services/vaultwardento/opt/stacks/vaultwarden/data(local NVMe). DB was already on CT 113 postgres; onlyrsa_key.pem,config.json,attachments/remain in the data dir. Staledb.sqlite3deleted. NFS copy atservices/vaultwarden/is now orphaned and can be cleaned up. -
WAL-G backup script fixed (CT 104): All nightly postgres backups were failing silently. Three bugs fixed: (1)
set -ecausing script abort whenshared-postgrescontainer not found (it was migrated to CT 113); (2) missing-u postgreson alldocker execcalls — WAL-G requires the postgres role; (3) missing explicit data path/var/lib/postgresql/dataonbackup-push.shared-postgrescommented out (CT 113 has its own WAL-G cron).immich_postgresandlobe-postgresnow back up successfully to Garage S3. -
apps/ directory decommissioned (CT 104):
/opt/stacks/apps/contained dead duplicate compose files for gotify, karakeep, memos, paperless-ngx, traccar, vaultwarden, shared-db — all without.envfiles, never running. Renamed to.DECOMMISSIONED-2026-05-22following established pattern. The canonical stacks at/opt/stacks/<service>/are unaffected. -
ComfyUI
--async-offloadremoved: Flag caused full CPU fallback on GGUF img2img with XPU (3.5 min/step instead of ~7 s/step) and pure-noise output. Removed fromai/comfyui.yml. Current args:--listen 0.0.0.0 --enable-cors-header --use-pytorch-cross-attention --disable-smart-memory --force-fp16. Seeinfra/proxmox-memory-audit.md. -
CT 105 Nextcloud CIFS → NFS: Nextcloud was crash-looping ("Appdata is not present") because
unas_smbCIFS mount (//192.168.1.31/storage) was not mounted on the host. Root cause: fstab entry was missing_netdev; mount dropped after a host event and was never re-established. Fixed by migrating CT 105mp0from/mnt/pve/unas_smbto/mnt/pve/unas(same NFS share all other CTs use). CIFS entry removed from fstab. All 9 Nextcloud containers healthy post-restart. -
arr stack started:
vpn_gluetun,shelfarr(:13004),rdtclient(via VPN,:13001),prowlarr(:13002),audiobookshelf(:13003). Fixed emptylabels:in VPN compose. -
claude-max-bridge: new service on CT 104 (
ai-internal, no host port). FastAPI shim wrappingclaudeCLI as an OpenAI-compatible/v1/chat/completionsendpoint. Enables LiteLLM to route to Claude Max subscription at zero API cost. Key details:--strict-mcp-config(no MCP servers),--input-format stream-json(multi-turn),--include-partial-messages(real streaming deltas). Bind-mounts/usr/local/bin/claude+/root/.claude(rw for OAuth token refresh). Source atgit.nuclide.systems/fkrebs/claude-max-bridge. -
LiteLLM Claude models:
claude-sonnet-4-6,claude-opus-4-7,claude-haiku-4-5+ short aliases (sonnet,opus,haiku) + effort variants (claude-sonnet-4-6-high,claude-opus-4-7-high) added viaopenai/provider pointing atclaude-max-bridge:8000/v1. Priced at Anthropic list rates for cost-visibility — actual cost $0 (Max). Bridge features: temperature→effort mapping,extra_body.effortoverride,extra_body.fallback_model,x_claude_cost_usdandx_claude_rate_limitin responses. -
claude-max-bridge v2: additional CLI parameter mappings:
extra_body.system_prompt_mode(replace/append→--system-prompt/--append-system-prompt),extra_body.max_turns→--max-turns,extra_body.max_budget_usd→--max-budget-usd,response_format.json_schema→--json-schema,extra_body.exclude_dynamic_system_prompt_sections→--exclude-dynamic-system-prompt-sections. Build context moved from/tmp/to/opt/stacks/ai/claude-max-bridge/(survives reboots). Source committed to Gitea ata781abb. -
Shepard MongoDB pinned to 8.0.4:
mongo:8.0(latest) introduced a fatal kernel-version check in 8.0.5+ that rejects Proxmox's7.0.2-5-pvekernel string (parsed as major version 7 ≥ 6.19). Pinned tomongo:8.0.4in/opt/shepard/infrastructure/docker-compose.yml. Track MongoDB bug SERVER-121912 for a patched upstream release before unpinning. -
ComfyUI XPU optimisation: removed
--lowvram+--reserve-vram 1.0; added--async-offload(Intel-patched XPU streams, ~10% speedup) +--force-fp16; memory limit 20 G → 24 G (FLUX peaks ~22 GB in shared XPU RAM).--disable-smart-memorykept sinceget_free_memory()returns the full 58 GB shared pool on Arc — smart eviction is blind to the cgroup limit. Seeinfra/proxmox-memory-audit.md. -
WaveSpeed FBC workflow:
ApplyFBCacheOnModel(residual_diff_threshold=0.12)+FluxGuidance(guidance=3.5)+BasicGuider+SamplerCustomAdvancedadded to FLUX.1-schnell pipeline. Workflow saved at/mnt/pve/unas/services/comfyui/input/flux-schnell-wavespeed.json. Estimated 30–50% additional speedup by caching first-block activations. WaveSpeed FBCache confirmed device-agnostic (no CUDA guards);torch.compilenode must NOT be used on XPU. -
LiteLLM benchmark:
bench.pyat/opt/stacks/ai/benchmark/measures TTFT + TPS for all configured models using streaming requests; renders xychart diagrams via internal Kroki (http://kroki:8000). First run results: Mistral fastest TTFT (43 ms), Claude bridge competitive at 101–143 ms. Seeservices/llm-benchmark.md. -
MCP gateway: added
git,gitlab(DLR,--pass-environmentfix for mcp-proxy env passthrough bug),paper-search(Docker catalog image replaces inlinepython:3.12-slim);UNPAYWALL_EMAILwired into paper-search. Removed duplicatepapersearchcontainer. Updatedservices/mcp-gateway.md. -
Nextcloud MCP re-enabled:
cbcoutinho/nextcloud-mcp-serverrunning insingle_user_basicmode withNEXTCLOUD_VERIFY_SSL=false. App-password generated non-interactively viaocc user:add-app-password. Gateway patched: (1)NEXTCLOUD_VERIFY_SSL/MCP_DEPLOYMENT_MODEnow baked into hardcoded SERVERS env; (2) startup overlay extended to persistenabledflag; (3) proxy route bypasses per-user credential provisioning whenMCP_DEPLOYMENT_MODE=single_user_basic. 26 servers healthy. -
CT 109 renamed
observe→ops: updatedct-inventory.md,homelab-architecture.md,proxmox-state.md(IP changed to.8after conflict resolution). -
CT 101 Shepard disk expanded: 100 GiB → 500 GiB (ZFS online resize, no restart).
-
CT 112 Infisical marked live:
ct-inventory.mdandportmap.mdupdated; LAN-only, no Zoraxy route. -
litellm DB password rotated: placeholder
litellm_password_herereplaced in bothai/.envandlitellm-config/config.yaml(config.yaml takes precedence over env var). Container restarted, healthy. -
UNAS migration dumps cleaned: 7 ×
*-migration-20260521.sql(~492 MB) deleted from/mnt/pve/unas/dump/. -
Arcane OIDC secret rotated: new secret updated in Pocket-ID SQLite DB (bcrypt, cost 10) and
/opt/stacks/arcane/docker-compose.yml. Container restarted. -
n8n OIDC secret rotated: Pocket-ID DB bcrypt update; secret applied to
/opt/stacks/n8n/docker-compose.yml(authoritative stack)./opt/stacks/apps/n8n/was a dead duplicate (no.env, never ran) — compose renamed.DECOMMISSIONED-2026-05-22. -
n8n encryption key rotated:
N8N_ENCRYPTION_KEY+N8N_USER_MANAGEMENT_JWT_SECRETreplaced with 32-byte hex values in/opt/stacks/n8n/.envand/opt/stacks/n8n/data/config. Container restarted, healthy. Any previously stored workflow credentials are now invalid and must be re-entered. -
Backrest repo passwords rotated:
tapirnase(weak placeholder) replaced on bothmedia-repoandservices-repo(JottaCloud). Usedrestic key add+restic key remove;config.jsonupdated; daemon restarted. -
Obsidian MCP (
mcpvault): new server added.bitbonsai/mcpvaultbridged viamcp-proxystdio→HTTP in a custommcp-obsidian-bridgeimage (Node 3.12-Alpine + mcp-proxy). Vault: NextcloudNotizen/folder at/mnt/pve/unas/services/nextcloud/fkrebs@nucli.de/files/Notizen, bind-mounted read-write. 15 tools: read/write/patch/search/tags/frontmatter/stats. TTL cache 30s. Registered in Claude Code settings.json and LobeHub for both users. -
LobeHub MCP sync: all 27 gateway servers synced into
user_installed_pluginsfor both users; stalepapersearchentry removed; all manifests updated to long-livedmcp_*gateway token. Skipped:crawl4ai(no/mcpendpoint inunclecode/crawl4ai:latest),n8n(uses own auth). -
CT 109 plan updated: IP conflict noted (
.6taken by CT 113); RAM 8 GiB, disk 50 GiB; Loki added; sshwifty added (multi-tab web SSH); Alloy replaces Promtail on all hosts; sidecar table expanded to CT 103/111/113. -
Portmap: CT 113 (
db,.6) section added; QNAP TS-251D (Klipper/Mainsail) section added. -
New docs:
services/backrest.md,services/databases.md,services/arcane.md.
2026-05-21
Docs & docs infrastructure
- Mermaid diagrams now rendering in mkdocs Material site — was missing
custom_fencesconfig inpymdownx.superfences. Fixed indocs-server/mkdocs.ymland rebuilt container. site_urlcorrected tohttp://192.168.1.111:13080(docs are LAN-only; no Zoraxy route exists).- Docs restructured: "Stacks (CT 104)" chapter dissolved; PORTMAP, Storage, Volumes, Docker networks moved to
infra/section. TODO items migrated into CHANGELOG + ideas. - Secrets manager design doc added at
services/secrets-manager.md— recommends Infisical on a new CT 112.
Storage / S3
s3.nuclide.systemsZoraxy route fixed —EnableWebsocketCustomHeaders,DisableHopByHopHeaderRemoval,EnableAutoHTTPSall set. Garage S3 API now reachable externally.chat-artifactsGarage S3 bucket created — public-read viahttps://chat-artifacts.s3.nuclide.systems/<key>. Credentials at/root/garage-chat-artifacts.creds(not git-tracked).
MCP surface
upload-artifactMCP server deployed (port 18011, CT 104). Tools:upload_text,upload_base64,list_artifacts,get_url,delete_artifact. Registered in gateway (now 24 servers). Source:git.nuclide.systems/fkrebs/mcp-upload-artifact.- ComfyUI MCP now auto-uploads completed images to
chat-artifactsS3 and includes the public URL alongside the inline base64 image. - DAYTONA_API_KEY removed from CT 104
ai/.env(Daytona decommissioned 2026-05-20).
Dev environment
savefigdotfiles helper added tofkrebs/dotfiles— uploads any file tochat-artifactsusinguv run --with boto3; reads credentials from env vars.- Coder
python-uvtemplate updated withCHAT_ARTIFACTS_*env vars baked in; template pushed to Coder server.
Gitea repos
- New repos created:
mcp-comfyui,mcp-docling,mcp-shepard,mcp-upload-artifact,home-assistant-config— all atgit.nuclide.systems/fkrebs/. - HAOS config (
192.168.1.60, VM 100) has a Gitea upstream ready. Manual push needed from HA terminal (seeservices/secrets-manager.mdfor SSH access notes).
Planned
- CT 112 "secrets" — Infisical deployment (see
services/secrets-manager.md) - Renovate Bot via Gitea Actions — dependency updates for MCP server repos (Dockerfiles + requirements.txt)
- Vaultwarden OIDC SSO wiring (client created in Pocket-ID 2026-05-21; auth flow not yet configured)
- LobeHub Artifacts → S3 patch (TypeScript, ~3-4h, deferred)
2026-05-20
Auth / Identity (single sign-on lockdown)
- Pocket-ID migrated CT 104 → CT 110 "id" (
192.168.1.5:11000). Authoritative writes now on CT 110; old data dir on CT 104 is a stale snapshot. Compose on CT 104 renamed.MIGRATED-TO-CT110-2026-05-20. Zoraxy upstream forid.nuclide.systemsflipped. - Pocket-ID 2.7.0 uses bcrypt for OIDC client secrets — previously some clients (Gitea, Coder) had raw 64-char SHA-256 hex in
oidc_clients.secret, which silently failed every token exchange. Regenerated both with proper bcrypt hashes; audit also surfaced an orphaned Daytona client and the empty-secretvscoderow. - Gitea SSO via Pocket-ID wired with bcrypt fix + correct
Scopes(openid,profile,email) +two_factor_policy=skip+ACCOUNT_LINKING=auto+ENABLE_AUTO_REGISTRATION=true+USERNAME=preferred_username. Local password sign-in form disabled (GITEA__service__ENABLE_PASSWORD_SIGNIN_FORM=false); legacy OpenID 2.0 button hidden (GITEA__openid__ENABLE_OPENID_SIGNIN=false). - Coder SSO via Pocket-ID wired. User row flipped
login_type=password → oidc.CODER_DISABLE_PASSWORD_AUTH=true+CODER_OAUTH2_GITHUB_DEFAULT_PROVIDER_ENABLE=false. Workspace-side GitHub external_auth left on (for repo cloning).
Dev environment (new CT 111 "dev", 192.168.1.42)
- New LXC stood up with Coder + Gitea + their Postgres companions.
- Templates pushed to Coder:
python-uv(persistent, GPU, code-server, baked LiteLLM + Anthropic env, Claude Code auto-install) andmcp-sandbox(ephemeral, sci stack pre-baked). - GPU passthrough confirmed:
/dev/dri/by-path/pci-0000:00:02.0-renderexposed; CT 111-level symlink at/dev/dri/renderD128(systemd-tmpfiles) so the Docker provider's path parser is happy. dotfilesrepo created atfkrebs/dotfileson Gitea — oh-my-zsh, LiteLLM model picker (models.env), docker alias set,~/.claude/settings.jsonpermissions allowlist, global PythonCLAUDE.md,.gitignore_global, VSCodium settings + extensions.txt.mkprojhelper appends[tool.coder]workspace+owner block to newpyproject.toml, copies pre-commit config +.gitignore, installs dev deps, initial commit.
Reverse proxy
- Zoraxy WebSocket forwarding enabled for
dev.,git.,mcp.nuclide.systems(EnableWebsocketCustomHeaders=true+HeaderRewriteRules.DisableHopByHopHeaderRemoval=true). Coder agent / Gitea live updates / streamable-MCP all need this. Backups at/tmp/zoraxy-backup-2026-05-20/on CT 108.
MCP gateway
daytonaremoved,coderadded in/opt/stacks/ai/mcp-gateway/config.json. Themorning-briefingscheduled agent's server list updated. Built a smallcoder-mcpimage (multi-stage fromghcr.io/coder/coder:latest+uv:bookworm-slim+uv tool install mcp-proxy) thatcoder logins once then runscoder exp mcp serverbehind streamable-HTTP.- Coder MCP exposes tools
coder_create_task+ workspace lifecycle fromCoder Agent v1.27.1.
Decommissions
- Daytona (
/opt/stacks/daytona/+/opt/stacks/ai/daytona-mcp.ymlon CT 104) — containers stopped + removed; compose files renamed.DECOMMISSIONED-2026-05-20. Coder replaces it.
Docs / governance
/CLAUDE.mdcreated on host — operator doctrine for any agent SSHing in: keep things running, enforce consistency, plan rollback at medium-risk+, services AI-accessible by default, test before declaring done, generate slash commands for recurring tasks, inventory skills/commands/MCPs at session start./docsis now a git repo, baseline at04d54ac.- Doc reorg into
infra/ services/ history/ ideas/. Traefik guides moved tohistory/(Zoraxy is permanent).mcp-gateway-requirements.mdandscrubbing-list-2026-05-17.mdalso archived.
2026-05-19
- Garage moved off NFS-on-UNAS to local zfs on CT 104 (
/opt/stacks/shared-db/garage/{meta,data}) after a WAL-G outage. Tier-1 (SQLite) databases off NFS as a follow-up; UNAS reserved for bulk media + workspace home dirs. - n8n reverted to local SQLite after a Postgres migration attempt failed.
2026-05-17
- MCP gateway design frozen. Implementation in
services/mcp-gateway.md; design rationale archived ashistory/mcp-gateway-requirements.md. - Per-stack scrubbing pass (see
history/scrubbing-list-2026-05-17.mdfor the inventory at that snapshot).
2026-05-16
- Traefik abandoned, Zoraxy is the production reverse proxy. Two migration guides preserved in
history/for context only.