Files
homelab-infra/docs/RESTORE_MATRIX.md
T
Micha cd650b19ac Close Gitea signup, dedup posture-check alerts, extend Borg scope
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>
2026-05-23 11:05:35 +02:00

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.sql
  • postgresql17-mailarchiver.dump
  • postgresql17-paperless.dump
  • postgresql17-authelia.dump (optional / wenn vorhanden)
  • mealie.dump
  • immich.dump
  • nextcloud.dump
  • gitea.sqlite.dump
  • vaultwarden.sqlite.dump
  • uptime-kuma.sqlite.dump
  • speedtest-tracker.sqlite.dump
  • filebrowser.bolt.dump
  • borg-ui.sqlite
  • grafana.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:

  1. mail-archiver
  2. paperless-ngx
  3. gitea
  4. vaultwarden

Sie liefern hohen Erkenntnisgewinn ohne den kompletten Homelab-Neuaufbau zu brauchen.