# Session Resume Last updated: 2026-05-23. Update this at the end of every session. ## Open items (urgency order) ### πŸ”΄ Critical β€” security risk or unrecoverable data loss - [ ] **Password rotation: `tapirnase`** β€” shared across WiFi PSK, LiteLLM root key (`sk-tapirnase`), D-Link admin, Backrest repo password. Single sniff = broad blast radius. Rotate per-service. See `services/homelab-architecture.md` Β§operational rules. - [ ] **UNAS personal data off-host** β€” ~820 GB Immich library partially covered by `media-backup-plan` in Backrest (last OK 2026-05-21 but failing/orphaned). `video-projects-plan` never completed. Backrest is the right vehicle β€” fix reliability first (see 🟠 Backrest item), then verify JottaCloud coverage. See `services/backrest.md` phase 1a. - [ ] **Nextcloud Borg passphrase β†’ Vaultwarden** β€” passphrase only in container env; CT 105 loss = unrecoverable backup. Move to Vaultwarden. See `services/backrest.md` blind spot #4b. ### 🟠 High β€” known broken / verification needed - [ ] **Arcane OIDC secret** β€” rotation done 2026-05-22 but Arcane has known OIDC issues. Verify it still authenticates. - [ ] **Backrest media-repo** β€” `video-projects-plan` has NEVER completed a successful snapshot. `media-backup-plan` last OK 2026-05-21; failed 2026-05-22 01:30; orphaned restic run in progress since 19:10 (Backrest restarted 21:23, orphaned it). Both plans next scheduled 2026-05-25 02:00/01:30. Monitor for completion; if they fail again, investigate rclone:jottacloud:media auth. - [ ] **AdGuard split-horizon DNS** β€” internal clients still resolve to public IPs. Rewrite rules audit. See `services/adguard-dns.md`. - [ ] **WAL-G monitoring** β€” silent stall went undetected for 13 h. Add textfile collector + alert for hung archiver. See `services/homelab-architecture.md` roadmap. - [ ] **Zoraxy audit** β€” CT 108 routes: WS headers, ACME coverage, decommissioned routes, auth consistency. See `services/zoraxy.md`. ### 🟑 Medium β€” incomplete migrations / cleanup debt - [ ] **Docker disk reclaim** β€” ~17 GB reclaimable on CT 104 (10.3 GB unused images, 6.9 GB build cache). `docker system prune -a` after confirming no needed images. See `infra/proxmox-state.md` Β§10c. - [ ] **Dormant stacks audit** β€” ~10 stacks defined but not running (homepage, dozzle, arr-stack, qdrant, etc.). Document: parked vs. abandoned. See `infra/proxmox-state.md` Β§10c. - [x] ~~**Config-to-git**~~ β€” deployed 2026-05-23. Scripts + daily 03:00 crons on CT 108, CT 102, PVE. Pushes to `fkrebs/zoraxy-conf`, `fkrebs/adguard-conf`, `fkrebs/pve-conf` (force-push). HA (`fkrebs/ha-config`) still pending β€” needs Git Pull addon on HAOS. - [ ] **D-Link hardening** β€” admin UI open to full LAN, SNMP unverified, HTTP-only. Enable trusted-host allowlist, harden SNMP, add TLS. See `services/homelab-architecture.md`. - [ ] **Vaultwarden OIDC SSO** β€” Pocket-ID client created 2026-05-21, auth flow not wired up. Confirmed no OIDC vars in `/opt/stacks/vaultwarden/.env` as of 2026-05-22. ### πŸ”΅ Planned β€” requires infrastructure or significant effort - [ ] **CT 109 "ops"** β€” LXC for Prometheus, Loki, Grafana, Alloy, Homarr, sshwifty, Gotify. Blocks monitoring stack + Arcane migration. See `infra/proxmox-state.md` Β§16. - [ ] **Second NVMe** β€” needed before rpool mirror + Postgres consolidation (CT 113). Blocks several items. - [ ] **Infisical secrets migration** β€” CT 112 deployed (`192.168.1.7:8200`, LAN-only). Phase 1 done. Remaining: - **Phase 2**: create project `homelab/ct104`, import `ai/.env` (~55 keys) via `infisical import`, add agent sidecars to compose stacks - **Phase 3**: replace hardcoded env vars in Coder `main.tf` (committed to Gitea β€” security risk) - **Phase 4**: OIDC SSO via Pocket-ID (low priority β€” convenience) See `services/secrets-manager.md`. - [x] ~~**Consolidate syncstack β†’ MCP gateway**~~ β€” done 2026-05-23. `litellm_sync.py` ported from syncstack, mounted into gateway. Gateway runs `run_sync()` every 15 min (120s startup delay). `/etc/cron.d/syncstack` deleted; `Dockerfile.syncstack` β†’ `.DECOMMISSIONED-2026-05-23`; `/opt/stacks/CLAUDE.md` updated. - [ ] **ZFS ARC tuning** β€” raise `zfs_arc_max` from 6.2 GiB β†’ 16 GiB once CT 101 memory right-sized. See `infra/proxmox-state.md` Β§3. - [ ] **Document ingestion n8n workflow** β€” Docling MCP deployed; n8n orchestration not built. Nextcloud/Paperless β†’ Docling β†’ embeddings β†’ LobeChat KB. See `services/doc-ingestion.md`. - [ ] **ComfyUI async queue** β€” MCP tool blocks 90–300 s. Job-queue pattern: `generate_image()` returns ID; `get_job_status()` polls. See `services/comfyui.md`. - [ ] **Additional MCP servers** β€” community MCPs exist for Gitea, Paperless, Karakeep, Vaultwarden, Proxmox-VE, Audiobookshelf. Evaluate + wire in. - [ ] **Arcane β†’ CT 109 migration** β€” blocked by CT 109. Procedure documented in `services/arcane.md`. - [x] ~~**crawl4ai SSE StreamConsumed**~~ β€” resolved 2026-05-22. Errors were from old code in log history; clean restart confirms no errors. Health: ok (7 tools), lobe-sync: 27/27 servers. ## Recently completed (2026-05-23) - **Config-to-git crons**: scripts + daily 03:00 crons deployed on CT 108 (Zoraxy β†’ `zoraxy-conf`), CT 102 (AdGuard β†’ `adguard-conf`), PVE (rsync `/etc/pve` β†’ `pve-conf`). Force-push. All three verified with initial push. - **Syncstack β†’ MCP gateway**: `litellm_sync.py` (ported from syncstack.py) mounted into gateway container. `_litellm_sync_loop()` runs every 15 min in gateway's asyncio loop. Cron `/etc/cron.d/syncstack` deleted. `Dockerfile.syncstack` decommissioned. `/opt/stacks/CLAUDE.md` updated. ## Recently completed (session continued Γ—2, 2026-05-22) - **crawl4ai MCP fixed**: was returning 404 on `/mcp` (streamable-HTTP). Current 0.8.6 image already has MCP over SSE at `/mcp/sse`. Added SSE transport support to `mcp-gateway/server.py`: per-request SSE round-trip with auto-initialize handshake; `transport: sse` in hardcoded SERVERS + config.json. Gateway health now shows crawl4ai ok; lobe-sync shows 27/27 servers. - **syncstack cron fixed**: missing `cd /opt/stacks/ai &&` prefix caused "no configuration file" every 15 min since ~May 18. Fixed. Manual run confirmed 60 models including 5 Claude models; LobeChat recreated. ## Recently completed (session continued, 2026-05-22) - **claude-max-bridge `/v1/responses` endpoint**: implemented OpenAI Responses API with `previous_response_id` chaining. Root cause of "session already in use": Claude CLI leaves session JSONL files in an un-resumable "dequeued" state after each `--print` run. Fix: maintain conversation history server-side as formatted text; inject into system prompt for continuations; always use `--no-session-persistence`. Also fixed: assistant turns in `--input-format stream-json` require `content` as array-of-blocks not string (JS error otherwise). Assistant content array format also fixed in `_parse_messages` / `_parse_responses_input`. - **LiteLLM pass-through for `/v1/responses`**: added `pass_through_endpoints` entry in `/opt/stacks/ai/litellm-config/config.yaml` β†’ `http://claude-max-bridge:8000/v1/responses`. LiteLLM appends its token hash to the response `id`, so `previous_response_id` chaining only works when calling the bridge directly (not through LiteLLM). ## Recently completed (this session, 2026-05-22) - **Pocket-ID backup**: pre-hook on CT 103 runs `pocket-id export` + scp keys β†’ UNAS staging; `services-backup-plan` snapshots β†’ jottacloud. Verified. - **Stale NFS vaultwarden dir deleted**: `/mnt/pve/unas/services/vaultwarden/` removed. - **Nextcloud CIFS β†’ NFS**: crash-loop fixed; CT 105 mp0 migrated from `/mnt/pve/unas_smb` to `/mnt/pve/unas`; CIFS fstab entry removed. - **Vaultwarden β†’ local zfs**: `/mnt/pve/unas/services/vaultwarden` β†’ `/opt/stacks/vaultwarden/data`; stale `db.sqlite3` deleted; DB already on CT 113 postgres. - **WAL-G fixed**: `immich_postgres` and `lobe-postgres` backups now succeed. Fixed: missing `-u postgres`, missing data path, `set -e` abort, dead `shared-postgres` reference. - **ComfyUI `--async-offload` removed**: caused CPU fallback + pure-noise output on GGUF img2img with XPU. - **apps/ decommissioned**: dead duplicate compose files in `/opt/stacks/apps/` renamed `.DECOMMISSIONED-2026-05-22`. - **Docs consolidated**: storage.md, volumes.md, homelab-architecture.md, proxmox-state.md, proxmox-memory-audit.md, ct-inventory.md, README.md all reconciled. ## Key system state | Host | IP | Role | |---|---|---| | nuc (PVE) | 192.168.1.20 | Proxmox host β€” SSH gateway to all CTs | | CT 104 docker | 192.168.1.40 | Main Docker host β€” AI/ML, media, ~65 containers | | CT 113 db | 192.168.1.6 | Shared Postgres 17 + WAL-G β†’ Garage S3 (cron 02:00) | | CT 110 id | 192.168.1.5 | Pocket-ID OIDC IdP | | CT 103 backrest | 192.168.1.3 | Backrest β€” jottacloud via rclone; UNAS at `/mnt/pve/unas` | | CT 111 dev | 192.168.1.42 | Coder + Gitea | | CT 108 zoraxy | 192.168.1.4 | Reverse proxy + ACME β€” **always confirm before changes** | ## Constraints to remember - Zoraxy (CT 108): always get explicit user confirmation before any config change. - Infisical (CT 112): LAN-only, no Zoraxy route β€” must not be internet-exposed. - CT 104 has a separate agent reconciling compose files β€” rename decommissioned files (don't just stop), update `/opt/stacks/CLAUDE.md`. - ComfyUI container limit: 24 G. Do not raise without measuring host impact. - Pocket-ID is SQLite-only β€” no Postgres migration possible.