cd650b19ac
Operational hardening across several services after live incident analysis between 2026-05-18 and 2026-05-20: - Gitea: disable public registration and OpenID signup/signin to stop the external POST / 5xx bursts that triggered availability alerts. New repo-wide policy requires every productive Micha/homelab-infra Komodo stack to ship with an active Gitea->Komodo webhook on the current stack ID (documented in CLAUDE.md, AI_CONTEXT.md, WORKFLOW.md). - posture-check: extract the Disk1 fstype check into its own function so the documented Disk1 NTFS exception no longer raises ntfy warnings, skip POSIX inode checks on NTFS, and dedup ntfy alerts via a fingerprint state file with ALERT_REPEAT_SECONDS (default 24h). Repeat-spam on the same cause now suppressed. - docker-critical-events: parse the event JSON for container name, action, exit code and signal; drop `die exit=0` events (clean stops); ship a structured ntfy message instead of the raw event line. - Borg UI: mount /mnt/user/services into the backup container as /local/services:ro and include homelab-infra, stacks and posture-check in all-important-sources.txt. RESTORE_MATRIX and DISASTER_RECOVERY updated accordingly. - Unraid user scripts: document the new homelab-operations-report-daily cron job and the SMTP password file it expects on the host. - MIGRATION_LOG: capture the four live events from this window - Gitea 5xx burst + signup closure, Komodo webhook reconciliation, posture-check host-version verification, Borg scope extension, and Traefik 5xx alert detuning. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
11 KiB
11 KiB
Restore Matrix - KalliLab CORE
Diese Matrix beschreibt fuer die wichtigsten Dienste:
- was die fuehrende Restore-Quelle ist
- welche Pfade oder Dumps relevant sind
- welche Secrets gebraucht werden
- wovon der Dienst abhaengt
- wie ein sinnvoller Smoke-Test aussieht
Sie ist die fachliche Ergaenzung zu docs/DISASTER_RECOVERY.md.
Legende
- Fuehrende Quelle = die primaere Restore-Wahrheit fuer diesen Dienst
- Datei-Restore = relevante Verzeichnisse / Volume-Pfade
- Dump / DB = relevante Dump-Artefakte oder Datenbankabhaengigkeiten
- Secrets / ENV = Dinge, die vor dem Start wieder da sein muessen
- Smoke-Test = minimaler Nachweis, dass der Restore wirklich greift
Tier 1 - Kritisch fuer Wiederanlauf
| Dienst | Fuehrende Quelle | Datei-Restore | Dump / DB | Secrets / ENV | Abhaengigkeiten | Smoke-Test |
|---|---|---|---|---|---|---|
| Traefik | Share / Borg | /mnt/user/appdata/traefik, besonders dynamic/, letsencrypt, secrets |
keine eigene DB | cloudflare_dns_api_token |
frontend_net, backend_net |
https://traefik.kaleschke.info erreichbar, Dashboard ueber Authelia |
| AdGuard Home | Share / Borg | /mnt/user/appdata/adguard/conf |
keine | keine zusaetzlichen Repo-Secrets dokumentiert | dns_net, frontend_net |
DNS-Aufloesung funktioniert |
| Tailscale | Share / Borg | /mnt/user/appdata/tailscale |
keine | Tailscale-State im Pfad | Host-Netz | Tailscale verbunden |
| PostgreSQL 17 | Share + Dumps | /mnt/user/appdata/postgresql17 |
postgresql17-globals.sql, postgresql17-mailarchiver.dump, postgresql17-paperless.dump, optional postgresql17-authelia.dump |
postgres_password.txt |
backend_net |
DB startet, Ziel-Datenbanken vorhanden |
| Redis | Share / Host | /mnt/user/appdata/redis |
keine | redis_password.txt |
backend_net |
Redis startet, Apps verbinden sich |
| Authelia | Borg | /mnt/user/appdata/authelia/config, /mnt/user/appdata/secrets/*authelia* |
Shared PostgreSQL, optional Dump postgresql17-authelia.dump |
JWT/Session/Storage/Postgres-/SMTP-Secret-Dateien | PostgreSQL 17, Traefik, GMX SMTP | Login-Seite und ForwardAuth funktionieren; SMTP-Notifier startet; aktive Sessions werden nach Restart neu aufgebaut |
| Gitea | Borg + Dump | /mnt/user/services/gitea/data |
gitea.sqlite.dump |
borg_repo_passphrase.txt fuer Restore-Tests |
Traefik | Web-UI erreichbar, Repo sichtbar, SSH-Port reagiert; Mini-Restore nach /mnt/user/backups/restore-lab/gitea am 2026-05-07 erfolgreich validiert |
| Komodo | Borg / Share | /mnt/user/appdata/komodo/core, /mnt/user/appdata/komodo/periphery, /mnt/user/services/stacks |
komodo-mongo.archive.gz falls verifiziert |
komodo_mongo_password.txt, KOMODO_* Stack ENV |
Traefik, Mongo, Gitea | UI erreichbar, Periphery verbunden |
| GitOps Host Automation | Borg / Git | /mnt/user/services/homelab-infra, /mnt/user/services/posture-check |
keine eigene DB | keine | Gitea, Komodo, Unraid User Scripts | posture-check laeuft vom Host-Pfad und liefert warning_count: 0 im bekannten Uebergangszustand |
| Vaultwarden | Borg + Dump | /mnt/user/appdata/vaultwarden |
vaultwarden.sqlite.dump |
vaultwarden_admin_token.txt, borg_repo_passphrase.txt fuer Restore-Tests |
Traefik | Login-Seite erreichbar, Tresor-Daten sichtbar; Mini-Restore nach /mnt/user/backups/restore-lab/vaultwarden am 2026-05-07 erfolgreich validiert |
Tier 2 - Wichtige Anwendungen
| Dienst | Fuehrende Quelle | Datei-Restore | Dump / DB | Secrets / ENV | Abhaengigkeiten | Smoke-Test |
|---|---|---|---|---|---|---|
| Paperless-ngx | Borg + Dumps | /mnt/user/appdata/paperless-ngx/data, /mnt/user/documents/paperless, /mnt/user/documents/paperless/export, /mnt/user/documents/scans_inbox |
postgresql17-paperless.dump |
PAPERLESS_DBPASS, PAPERLESS_REDIS, borg_repo_passphrase.txt fuer Restore-Tests |
PostgreSQL 17, Redis, Traefik | Web-UI startet, Dokumente vorhanden; Mini-Restore nach /mnt/user/backups/restore-lab/paperless am 2026-05-07 erfolgreich validiert |
| Mealie | Borg + Dump | /mnt/user/appdata/mealie/data, optional /mnt/user/appdata/mealie/postgres bei lokalem Share-Weiterbetrieb |
mealie.dump |
mealie_postgres_password.txt |
mealie-postgres, Traefik |
UI startet, Rezepte vorhanden |
| Immich | Borg + Dump | /mnt/user/photos/immich, /mnt/user/photos/family_archive |
immich.dump |
IMMICH_DB_PASSWORD, immich_postgres_password.txt |
immich_postgres, immich_redis, Traefik |
UI startet, Medienbibliothek sichtbar |
| Mail-Archiver | Borg + Shared Dump | /mnt/user/appdata/mailarchiver/data-protection-keys |
postgresql17-mailarchiver.dump |
MAILARCHIVER_DB_CONNECTION, MAILARCHIVER_AUTH_PASSWORD |
PostgreSQL 17, Traefik, Authelia | Authelia-Weiterleitung greift; nach Login startet die Web-UI und das Archiv laesst sich oeffnen |
| Nextcloud | Borg + Dump | /mnt/user/appdata/nextcloud/html, /mnt/user/documents/nextcloud-data |
nextcloud.dump |
nextcloud_admin_user.txt, nextcloud_admin_password.txt, nextcloud_postgres_password.txt |
nextcloud-postgres, nextcloud-redis, Traefik |
Web-UI startet, Login funktioniert, Dateien sichtbar |
| Homepage | Borg / Share | /mnt/user/appdata/homepage |
keine | HOMEPAGE_VAR_* |
Traefik, Authelia | Dashboard startet, Widgets laden |
| ntfy | Borg / Share | /mnt/user/appdata/ntfy |
keine | keine besonderen Secret-Dateien dokumentiert | Traefik | UI und Push-Endpunkt erreichbar |
| Paperless-GPT | Borg / Share | /mnt/user/appdata/paperless-gpt |
keine eigene DB | PAPERLESS_API_TOKEN |
Traefik, Paperless | UI startet, Konfiguration vorhanden |
Tier 3 - Rebuildbar / Sekundaer
| Dienst | Fuehrende Quelle | Datei-Restore | Dump / DB | Secrets / ENV | Abhaengigkeiten | Smoke-Test |
|---|---|---|---|---|---|---|
| Borg UI | Borg + Dump | /mnt/user/appdata/borg-ui/data |
borg-ui.sqlite |
Borg-Repo-Creds in /data |
Traefik | UI startet, Repo-Verbindung bekannt |
| Uptime Kuma | Share / Fresh + Dump | /mnt/user/appdata/uptime-kuma |
uptime-kuma.sqlite.dump |
uptime_kuma_admin_password.txt bei Fresh-Rebuild |
Traefik, Authelia | UI startet, Admin-User vorhanden, Monitore ggf. neu anlegen |
| Filebrowser | Share / Fresh + Dump | /mnt/user/appdata/filebrowser |
filebrowser.bolt.dump |
filebrowser_admin_password.txt bei Fresh-Rebuild |
Traefik, Authelia | UI startet, Admin-User vorhanden |
| Glances | Rebuildbar | kein kritischer Zustand | keine | keine | Traefik, Authelia | UI startet |
| Scrutiny | Teilweise rebuildbar | /mnt/user/appdata/scrutiny falls gewuenscht |
InfluxDB bewusst nicht Teil des Critical-Scope | keine | Traefik, Authelia | UI startet, Laufwerke sichtbar |
| Speedtest Tracker | Share + Dump | /mnt/user/appdata/speedtest-tracker/config |
speedtest-tracker.sqlite.dump |
APP_KEY, ADMIN_PASSWORD |
Traefik, Authelia | UI startet |
| BentoPDF | Rebuildbar | keine kritische Persistenz; alte Stirling-PDF-Daten unter /mnt/user/appdata/stirling-pdf bis zur Abnahme behalten |
keine | keine separaten Secret-Dateien dokumentiert | Traefik, Authelia | UI startet, PDF-Tools verfuegbar, Office-Konvertierung ueber HTTPS funktioniert |
| Grafana | abgeloester Altstand | /mnt/user/appdata/grafana, inklusive provisioning/datasources/influxdb.yml |
grafana.sqlite |
grafana_admin_password.txt, grafana_influxdb_token.txt |
Traefik, Authelia, InfluxDB 3 Core | Nur als Rollback-/Migrationsreferenz behalten, wenn monitoring/ produktiv ist |
| InfluxDB 3 Core | abgeloester Altstand | /mnt/user/appdata/influxdb3/data, /mnt/user/appdata/influxdb3/plugins |
dateibasierter Object Store | influxdb3_admin_token.json |
internes grafana_influx_internal Netz |
Nach Migration nicht blind loeschen; Datenuebernahme zu monitoring-influxdb3-core separat pruefen |
| Loki / Alloy | abgeloester Altstand | /mnt/user/appdata/loki/config, /mnt/user/appdata/loki/data, /mnt/user/appdata/alloy/config |
keine primaere DB; Loki-Dateispeicher mit 30 Tagen Retention | keine zusaetzlichen Secrets | backend_net, Docker socket read-only, Grafana |
Durch monitoring-loki/monitoring-promtail ersetzen |
| Monitoring Stack | Rebuild + named volumes + InfluxDB-Appdata | prometheus_data, loki_data, promtail_positions, grafana_data; InfluxDB unter /mnt/user/appdata/influxdb3/data und /mnt/user/appdata/influxdb3/plugins; Provisioning aus monitoring/grafana/provisioning |
Prometheus-TSDB, Loki-Dateispeicher und InfluxDB-Dateistore; Diagnose-/Langzeitdaten, keine Tier-1-Restore-Quelle | monitoring_grafana_admin_password.txt, monitoring_grafana_influxdb_token.txt, influxdb3_admin_token.json |
monitoring_net, monitoring_influx_lan, frontend_net, Traefik, Authelia, Docker socket read-only fuer Promtail, Host-Mounts fuer node-exporter/cAdvisor |
https://monitoring.kaleschke.info leitet zu Authelia; Prometheus Targets sind up; Grafana-Datasources Prometheus, Loki und InfluxDB 3 Core funktionieren |
| Hermes Agent | VM-seitig offen | /mnt/user/appdata/hermes-agent/data, /mnt/user/appdata/hermes-agent/ssh |
keine eigene DB | Host-.env fuer Provider-/API-/Home-Assistant-Tokens, hermes_runner_id_ed25519, HERMES_DASHBOARD_HOST |
separate Hermes-VM/Runner, Traefik, Authelia, hermes_net |
NAS-Stack nicht starten, solange Runner-VM und echte .env fehlen |
| ddns-updater | Rebuildbar | geringe Persistenzrelevanz | keine | Provider-Zugang ueber Stack ENV | Internetzugang | Update-Job laeuft |
Dumps und Restore-Artefakte
Aktuell relevante Dump-Artefakte unter /mnt/user/backups/borg/dumps/latest:
postgresql17-globals.sqlpostgresql17-mailarchiver.dumppostgresql17-paperless.dumppostgresql17-authelia.dump(optional / wenn vorhanden)mealie.dumpimmich.dumpnextcloud.dumpgitea.sqlite.dumpvaultwarden.sqlite.dumpuptime-kuma.sqlite.dumpspeedtest-tracker.sqlite.dumpfilebrowser.bolt.dumpborg-ui.sqlitegrafana.sqlite- Monitoring-Stack: keine verpflichtenden Dump-Artefakte; Prometheus/Loki/Grafana named volumes sind Diagnose-/Dashboard-Zustand, keine primaere Restore-Quelle.
komodo-mongo.archive.gz(noch gesondert verifizieren)
Die Dump-Erzeugung ist host-seitig ueber ops/borg-ui/scripts/pre-backup-dumps.sh vorgesehen.
Praktische Restore-Regeln
- Nicht mehrere kritische Dienste gleichzeitig restaurieren.
- Erst die Abhaengigkeiten wiederherstellen, dann die App.
- Bei Unsicherheit zuerst in Testpfade oder Testinstanzen pruefen.
- Der minimale Erfolg ist nicht "Container startet", sondern "fachlicher Smoke-Test gelingt".
Validiertes Restore-Lab-Muster
- Restore-Quelle bleibt das produktive Borg-Repo
- Testziel liegt unter
/mnt/user/backups/restore-lab/<dienst> - Reports liegen unter
/mnt/user/backups/restore-reports - Borg-Zugriff kann ueber den vorhandenen
borg-ui-Container laufen - Borg-Passphrasen fuer Restore-Tests sollten aus Host-Secret-Dateien kommen, nicht aus UI-Interna
- Testinstanzen bekommen keine produktive Domain und keine Traefik-Route
Erste sinnvolle Referenz-Restores
Wenn weitere Restore-Uebungen dokumentiert werden sollen, sind diese Dienste besonders geeignet:
mail-archiverpaperless-ngxgiteavaultwarden
Sie liefern hohen Erkenntnisgewinn ohne den kompletten Homelab-Neuaufbau zu brauchen.