Forget against an --append-only rest-server fails every night (delete ops blocked). The resulting daily failure cluttered service status and logs without ever actually retiring old snapshots. Schedule is now removed from the forget block in all six profiles; the keep-daily / keep-weekly / keep-monthly / keep-yearly policy remains so manual invocations (during prune ceremonies, when --append-only is temporarily off) honor the intended retention. Files: configs/restic/ana-docker/profiles.yaml configs/restic/ana-ml2/profiles.yaml configs/restic/nh3-docker/profiles.yaml configs/restic/esh-docker-vm/profiles.yaml configs/restic/vm-esh-nas/profiles.yaml configs/restic/nh3-dev/profiles.yaml Each file has an inline comment marking why the schedule was dropped so a future reader doesn't re-add it thinking it was an oversight. STATUS.md: removed the "install Backrest nightly-restart timer" line item. User confirmed the UI timeout hits even at startup, so periodic restart wouldn't actually help. Root cause remains deferred.
7.7 KiB
Status + Open Issues
Last updated: 2026-04-21
Snapshot of fleet state and open work. Refresh this file when a pass of significant work lands — don't let it drift quietly.
What's in place
Backup coverage
- VM-level vzdump: 24/24 guests across pfi-pve, nh3-pve, esh-pve, esh-pve-nas.
- File-level restic: 6/6 hosts configured with systemd timers:
Host Target rest-server DB hooks ana-docker rest-server-ana (local) synapse, seafile, vaultwarden-pg, gitea (native dump), openwebui ana-ml2 rest-server-ana (cross-site) — (no DBs) nh3-docker rest-server-nh3 (local, Synology) — esh-docker-vm rest-server-ana (cross-site) paperless-pg, HA SQLite, CWA SQLite, pgadmin SQLite, uptime-kuma SQLite vm-esh-nas rest-server-ana (cross-site) — nh3-dev (workstation) rest-server-nh3 (local) —
Inventory
- 18 tracked hosts under
servers/(5 Docker + 4 Proxmox + 1 workstation + 6 PFI VMs + 3 SureFire tenant + 1 NH3-dev workstation... audit the actual count vs this when updating). - Homepage at http://10.0.50.45:5100 shows function-first layout with Main / Infrastructure / Toolchain tabs. Per-group icons, row-count layout, useEqualHeights.
- FortiGate + UniFi discovery scripts produce TSVs; gap analysis
against
servers/*for unmanaged IPs.
Tooling
scripts/server_inspect.sh+refresh-server-info.shfor Docker hosts.scripts/proxmox_inspect.sh+refresh-proxmox-info.shfor PVE nodes (reports VMs/LXCs/storage/backup-coverage).scripts/discover-fortigate.sh,scripts/discover-unifi.sh,scripts/discover-gaps.shfor network-level inventory discovery.scripts/deploy-stack.sh+scripts/sync-stacks.shfor compose push/pull.scripts/add-host.shfor new-host registration.
Open issues
🟥 Quick wins (do next)
-
Fix Backrest's
esh-docker-vmURI — Backrest is pointed at10.100.50.50(NH3 Synology) for that repo, while the actual backup writes go to10.250.50.70(rest-server-ana). Editconfig.jsonin the backrest container, swap the host portion. ~5 min. -
Verify SSH on the 9 newly-registered hosts and pull first snapshots:
scripts/refresh-server-info.sh --validate-only all scripts/refresh-server-info.sh pfi-ana-webhost ana-filebot pfi-pteradactyl \ pfi-tacticalrmm pfi-postgres ana-wgssh-target files were guessed (
lkraven@for VMs,root@for LXCs) — first run surfaces mismatches. -
Patch out
forgetschedules from all 6 restic profiles. They fail nightly against--append-onlyrest-servers. One-liner per host: comment outschedule:under theforgetblock in profiles.yaml; redeploy; runresticprofile unschedule forgeton each host. ~15 min.
- (removed — see note above)
🟧 Real work (dedicated session each)
-
Rotate exposed secrets (captured in session transcripts 2026-04-20/21):
vaultwardenPostgres password (on pfi-postgres)giteaPostgres password — currently literallygitea(trivially weak)paperless-ngPostgres password — currently literallypaperless-ng(trivially weak)ana-dockerrest-server htpasswd + repo passphraseana-ml2rest-server htpasswd (repo passphrase rotated during wipe/reinit)esh-docker-vmrest-server htpasswd + repo passphrase
For each: rotate at the source (DB
ALTER USER …/htpasswd/restic key add+restic key remove) → update consumer config files (/etc/restic/restic.env,/etc/restic/dbcreds.env, compose env files, Backrest config.json) → restart consumer services. ~45 min batched. -
Cross-site rsync between
rest-server-anadata dir (/mnt/backup/restic/repo/ana/) and NH3 Synology data dir. Planned since initial rest-server setup; not built. Needs Synology SSH access first (item 8). ~20 min once access is there. -
SureFire tenant backup plan decision. Three options documented in
servers/sfsrv-ana/README.md:- Tenant handles own backups
- PFI provides dedicated scoped repo on rest-server-ana
- Shared vzdump target
Blocks any actual SF backup work until the hosting-agreement side of this is clear.
🟨 Prereqs / polish
-
Synology SSH setup — tabled earlier. Unlocks: cross-site rsync (item 6), rest-server-nh3 healthcheck deploy, easier
.htpasswdedits on the NH3 side. -
scripts/restic-prune.sh— temporarily flip--append-onlyoff, run forget + prune across all hosts, flip back on. Needed quarterly for disk hygiene. Not urgent; blocks only the "I need to reclaim disk space now" scenario. -
Retire
offen/docker-volume-backupsidecars on esh-docker-vm once restic has ~1 week of clean runs. Paperless + pgadmin currently run offen sidecars that write tarballs to/mnt/backup/...redundantly. -
Clean up retired mattermost dir on ana-docker — compose dir at
/opt/docker/compose/mattermost/may still linger. Singlerm -rfwhen convenient.
🟩 Research / deferred / intermittent
-
Backrest UI intermittent timeout. Backend is confirmed healthy (direct
curl GetConfigreturns in 200ms). UI chokes on the same endpoint. Likely cause: SSE stream wedge in browser, or service worker stale. Workaround: Ctrl+Shift+R. Root cause investigation deferred. -
UniFi controller homepage cards (ESH-UDMPM at 10.0.0.1, PFI-UDMSE at 10.100.0.1). Auto-discovered via the Site Manager API; not yet linked as homepage cards.
-
Prune + credential-rotation scripts as repeatable tooling (vs per-incident manual work).
🟦 Memory / documentation housekeeping
-
docs/organization could use a pass — multiple READMEs and reference files in different spots. Not urgent. -
STATUS.md(this file) drift. Update whenever significant work lands. Consider ascripts/status-regen.shif manual updates slip.
Session milestones — 2026-04-20 / 2026-04-21
- Homepage reorganized to function-first with tabs (Main / Infrastructure / Toolchain).
- Per-group icons + equal-height layout + 4-column grids.
- Fleet-wide label sweep (function groups, Service Networking renamed from Wiring/Plumbing due to homepage-parser slash bug).
- 6 restic clients deployed end-to-end (client creds, repo init, profile install, systemd timers, first backups verified).
- 9 hosts registered under
servers/from gap-analysis (PFI VMs + SureFire tenant, with tenancy awareness). - Discovery scripts (FortiGate SSH + UniFi cloud API + TSV diff vs inventory).
- Proxmox inspect script + fleet-wide refresh wrapper.
- Calibre-Web-Automated migration replacing calibre + calibre-web pair.
- llama-swap Qwen3.6 stock + mradermacher abliterated, 128K ctx.
- Mattermost retired (not running, compose dir cleanup pending).
- FortiGate 101F at NH3 retired; homepage card removed.
Memory pointers (for future Claude sessions)
Relevant ~/.claude/.../memory/ entries:
server_split.md— host placement rulesfeedback_ssh_sudo.md— usessh -tfor remote sudofeedback_git_autonomous.md— handle git commits without askingfeedback_git_commits.md— no Claude attribution in commit messagesproject_backup_pipeline_gaps.md— user's explicit goal of "all hosts + configs + DBs backed up"project_surefire_tenant.md— SureFire tenancy boundary awarenessstorage_ana_nas.md— ana NAS is Debian, not TrueNAS