Stack-health audit — find what's actually broken #15
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
As of 2026-05-26 these issues observed in passing; full audit needed:
/var/lib/node_exporter/walg-metrics.promno longer exists on CT 113. Was set up 2026-05-23. Either path moved or cron broke. Prometheus alertWalgArchiveStalewill fire (or has).Quick win: daily systemd timer on nuc that pings every healthcheck, notifies Gotify on regressions.
Arcane / Nextcloud AIO conflict — fixed
Finding: Arcane was auto-updating
nextcloud-aio-watchtowerand other AIO containers. The AIO stack manages its own container lifecycle vianextcloud-aio-watchtower; external update tools interfere with this orchestration.Fix: Updated
autoUpdateExcludedContainersin/opt/stacks/arcane/data/arcane.db(CT 109) via sqlite3 to exclude all 11 AIO containers:Note: Arcane uses
com.getarcaneapp.arcane.updater=falselabel (not the Watchtower label) for per-container opt-out. Name-based exclusion is correct here since AIO containers lack the Arcane label.Still open in this audit:
gitea-mcprestart-looping every ~3 min on CT 104 (real issue — needs log investigation)mcp-proxmox,paperless-mcp,coder-mcpreporting unhealthy — false positive from bad healthcheck (GET /mcpreturns 406; MCP protocol requires POST)/var/lib/node_exporter/walg-metrics.promabsent — WAL-G backup hook not writing metrics)Audit completed 2026-05-27
Worked through across two sessions (2026-05-26 → 2026-05-27). Findings per checklist item:
✅ mcp-proxmox + coder-mcp unhealthy (covers "paperless-mcp + gitea-mcp" item)
Root cause: Healthcheck used
python3 -c "socket.create_connection((localhost,8000),2)"—localhostwas an unquoted Python name (NameError), so every check failed.Fix: Replaced with
bash -c 'echo > /dev/tcp/localhost/8000'in/opt/stacks/ai/proxmox-mcp.ymlandcoder-mcp.yml. Both containers now healthy.Verified: Full MCP tool listing confirmed — mcp-proxmox exposes ~40 tools (get_nodes, get_vms, get_containers, snapshots, backups, etc.); coder-mcp exposes workspace/template tools.
✅ Immich showing onboarding wizard (found during broader audit)
Root cause:
DB_DATA_LOCATION=./postgresin.env→ Portainer git-backed stack resolved this to/data/compose/53/<hash>/immich/postgres(empty fresh DB) instead of/opt/stacks/immich/postgres(814 MB real data).Fix: Changed to absolute path
/opt/stacks/immich/postgresin.envand Portainer stored env. Force-recreated postgres container. Immich healthy, real data restored.Bonus: Three other Immich env vars (
IMMICH_API_KEY,IMMICH_URL,EXTERNAL_IMMICH_URL) had inline comments and quotes ingested by the Portainer migration parser — cleaned up. Fixedread_env_remote()inportainer-migrate.pyto strip inline comments and surrounding quotes.✅ Relative bind-mount audit across all stacks
Scanned CT 104 + CT 109 for
./paths in all compose files. Findings:aistack (searxng, bifrost, open-webui) has relative paths +env_file: .env— not broken becauseaiis excluded from Portainer (multi-fileinclude:stack, managed directly). Relative paths resolve correctly from/opt/stacks/ai/.alloyandn8n(CT 104) already fixed in previous session (absolute paths for config.alloy and hooks.js).⏳ WAL-G textfile metrics missing (CT 113)
Not investigated this session. Still open — check
/var/lib/node_exporter/walg-metrics.promon CT 113 and verify cron.⏳ AdGuard YAML brittle
Not addressed this session. Noted: always use
python3 + yamloryqfor AdGuard config edits, neversedwith newline insertion.⏳ Grafana panel for container health across all CTs
Not built this session. Quick-win systemd timer idea also deferred.
Closing — remaining items (WAL-G metrics, AdGuard, Grafana panel) tracked separately or via n8n-flows issues.