Add explicit stages A-F to docs/SERVICES_RECOVERY.md: host/docker baseline, repo source, secrets order, Komodo start, web/GitOps validation, tier stack rollout. Recovery anchor is ops/komodo/ docker-compose.yml; the self-stack is explicitly not the anchor. Link DISASTER_RECOVERY Phase 4 stage 3 to the new bootstrap section and the stack-env-only secrets section in SECRETS_MAP. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
16 KiB
Disaster Recovery - KalliLab CORE
Dieses Dokument beschreibt den kontrollierten Wiederanlauf nach einem Totalausfall des Unraid-Hosts.
Es ist bewusst repo-genau fuer dieses Homelab geschrieben und ersetzt keine Backup-Dokumentation im engeren Sinn.
Verwandte Dokumente:
docs/ROLLBACK.md- Rueckweg bei Fehlern im laufenden GitOps-Betriebdocs/RESTORE_MATRIX.md- Restore-Quellen und Verifikationsregeln pro Dienstdocs/RESTORE_HANDBOOK.md- praktische Restore-Betriebsanleitungdocs/SERVICES_RECOVERY.md- Recovery-kritische/mnt/user/services-Pfade, Gitea-Mirror und Komodo-Bootstrapdocs/EXTERNAL_DEPENDENCIES.md- externe Provider/Konten und Ausfall-Szenarienops/borg-ui/BACKUP_SCOPE.md- Zielbild des Borg-Scopes
1. Ziel und Geltungsbereich
Dieses Runbook behandelt primaer den Fall:
- Unraid-Host war ausgefallen oder musste neu aufgesetzt werden
- Array / Shares sind wieder verfuegbar
- Daten auf den Festplatten sind grundsaetzlich noch lesbar oder koennen aus Borg wiederhergestellt werden
Es behandelt nicht im Detail:
- den Rueckweg einzelner Fehl-Deployments im laufenden Betrieb
- eine spontane Live-Reparatur an einem einzelnen Service
- einen kompletten Datenverlust ohne verfuegbares Borg- oder Share-Material
2. Zwei verschiedene Ernstfaelle
Diese beiden Szenarien muessen sauber getrennt werden:
A. Host-/Systemausfall, aber Daten auf den Shares sind noch da
Das ist der wahrscheinlichere und einfachere Fall.
Dann muessen in vielen Bereichen keine Daten aus Borg extrahiert werden. Es reicht oft:
- Unraid sauber neu aufzusetzen
- Shares wieder einzubinden
- Repo / Secrets / Laufzeitpfade zu pruefen
- Stacks in der richtigen Reihenfolge wieder hochzufahren
B. Daten muessen wirklich aus Borg wiederhergestellt werden
Das ist der schwerere Fall.
Dann muessen gezielt die in docs/RESTORE_MATRIX.md beschriebenen Pfade, Dumps und Secrets aus Borg oder anderen Restore-Quellen zurueckgeholt werden.
Merksatz: Erst klaeren, ob wir nur den Host wiederbeleben oder echte Nutz-/App-Daten aus Backups zurueckholen muessen.
3. Voraussetzungen vor einem Ernstfall
Diese Punkte sollten vor einem echten Ausfall geklaert sein:
| Thema | Sollzustand |
|---|---|
| Repo-Zugang ausserhalb von Gitea | privater GitHub-Push-Mirror michaelkaleschke-spec/homelab-infra und lokaler aktueller Clone vorhanden |
| Unraid USB-/Flash-Backup | unraid-flash-config.tar.gz wird vor Borg unter /mnt/user/backups/borg/dumps/latest erzeugt und nach Hetzner/Borg gesichert; Unraid-Connect-Cloud-Backup optional zusaetzlich |
| Borg-Ziel | nicht nur lokal auf demselben Ausfallpfad |
| Borg-Passphrase | Host-Secret-Datei vorhanden und fuer Borg-Zugriff verifiziert; externe Offline-Hinterlegung vom Operator am 2026-05-26 bestaetigt |
| Secrets-Dateien | ueber Borg bzw. Restore-Quellen abgedeckt |
| Komodo Stack ENV-Werte | extern dokumentiert, z. B. Vaultwarden |
| Services-Recovery | docs/SERVICES_RECOVERY.md gepflegt, insbesondere Gitea-Repo-Mirror und Komodo-Bootstrap |
| Hardware-/Netzwerkdaten | docs/HARDWARE_INVENTORY.md und docs/NETWORK_INVENTORY.md mit echten Werten gefuellt |
| Restore-Smoke-Tests | fuer mindestens 1-2 kritische Dienste nachgewiesen |
Wichtig: Dieses Dokument ist nur so gut wie die Vorbereitung ausserhalb des Repos.
4. Phase 0 - Repo-Zugang sicherstellen
Nach einem Totalausfall kann es sein, dass gitea selbst noch nicht laeuft.
Deshalb gilt:
- Wenn moeglich, Repo ueber einen externen Mirror oder einen lokalen aktuellen Clone holen.
- Nur wenn
giteabereits wieder verfuegbar ist, direkt ausgit.kaleschke.infoklonen.
Verfuegbare Wege:
- externer Push-Mirror:
https://github.com/michaelkaleschke-spec/homelab-infra - lokaler Bare-Clone auf dem PC
- normaler lokaler Arbeits-Clone auf dem PC
Wenn weder GitHub-Mirror noch lokaler Repo-Clone verfuegbar sind, ist services/gitea/data selbst ein kritischer Restore-Pfad.
5. Phase 1 - Unraid und Shares wiederherstellen
5.1 Unraid-Grundzustand
- Unraid USB/Flash wiederherstellen oder neu aufsetzen
- Lizenz / Device-Zuordnung sauber herstellen
- Array wieder zuweisen und starten
- Grundlegende Shares pruefen
Primaere lokale/off-site Restore-Quelle fuer die bestehende Flash-Konfiguration ist das Borg-Artefakt unraid-flash-config.tar.gz aus /mnt/user/backups/borg/dumps/latest. Dieses Archiv enthaelt /boot/config und muss wie Secret-Material behandelt werden.
5.2 Erwartete Shares / Pfade
Mindestens diese Pfade muessen wieder verfuegbar sein:
/mnt/user/appdata/mnt/user/backups/mnt/user/services/mnt/user/documents/mnt/user/photos
Je nach Dienst zusaetzlich:
/mnt/user/finance/mnt/remotes/...fuer externe Backup-Ziele
Wenn diese Pfade nicht sauber da sind, keine Stacks starten.
6. Phase 2 - Secrets und kritische Restore-Pfade pruefen
Bevor produktive Dienste hochfahren, muessen die wichtigsten Secret- und Konfigurationspfade verifiziert werden.
6.1 Zentrale Secrets
Erwartete Basis unter /mnt/user/appdata/secrets/:
authelia_jwt_secret.txtauthelia_postgres_password.txtauthelia_session_secret.txtauthelia_smtp_password.txtauthelia_storage_encryption_key.txtimmich_postgres_password.txtkomodo_mongo_password.txtmealie_postgres_password.txtnextcloud_admin_password.txtnextcloud_admin_user.txtnextcloud_postgres_password.txtpostgres_password.txtredis_password.txtborg_repo_passphrase.txtvaultwarden_admin_token.txthermes_runner_id_ed25519
Weitere relevante Secret-Pfade:
/mnt/user/appdata/traefik/secrets/cloudflare_dns_api_token/mnt/user/appdata/code-server/secrets/password
6.2 Stack-ENV-Werte ausserhalb von Datei-Secrets
Diese Werte sind vor dem Start der betroffenen Dienste zu pruefen bzw. wieder in Komodo zu hinterlegen:
PAPERLESS_DBPASSPAPERLESS_REDISIMMICH_DB_PASSWORDMAILARCHIVER_DB_CONNECTIONMAILARCHIVER_AUTH_PASSWORDHERMES_DASHBOARD_HOST- Hermes Host-
.envfuer Provider-/API-/Home-Assistant-Tokens KOMODO_SECRET_KEYKOMODO_WEBHOOK_SECRETKOMODO_JWT_SECRETKOMODO_MONGO_PASSWORDKOMODO_PERIPHERY_PASSKEYAPP_KEYundADMIN_PASSWORDfuerspeedtest-tracker
Zusaetzlich rebuildbar (keine kritische Recovery-Quelle, koennen aus Provider-/App-UIs neu erzeugt werden):
GLANCE_IMMICH_API_KEY,GLANCE_ADGUARD_USERNAME,GLANCE_ADGUARD_PASSWORD,GLANCE_SPEEDTEST_API_KEYfuerglanceCommunity-/Live-Widgets
6.2.1 Restore-Quellen fuer Stack-ENV-Werte
Stack-ENV-Werte liegen nicht im Repo und nicht als Datei-Secret unter /mnt/user/appdata/secrets/. Sie sind nur an drei Stellen erreichbar; bei Recovery in dieser Reihenfolge pruefen:
- Komodo-Mongo-Dump
komodo-mongo.archive.gzunter/mnt/user/backups/borg/dumps/latest/. Solange Komodo selbst noch nicht laeuft, ist der Mongo-Dump die kanonische Quelle. Restore in eine Test-Mongo-Instanz, anschliessend Werte aus derstack-Collection lesen. Niemals Werte in andere Dokumente kopieren. - Vaultwarden Eintrag "Komodo Stack ENV / KalliLab CORE" (bzw. der entsprechende Eintrag pro Stack). Voraussetzung: Vaultwarden ist bereits restauriert (
docs/RESTORE_MATRIX.md). - Externe Operator-Notiz (versiegelter Umschlag, Bankschliessfach, oder analoge Sicherung neben der Borg-Passphrase). Nur als Notfall-Quelle, wenn weder Komodo-Mongo noch Vaultwarden verfuegbar sind.
Reihenfolge-Konsequenz fuer den Bootstrap-Pfad in Phase 4 (Stufe 4 weiter unten):
- Vor dem Start von
apps/paperless/,apps/immich/,apps/mail-archiver/undops/speedtest/muessen die jeweiligen Stack-ENV-Werte in Komodo wieder hinterlegt sein. - Wenn
komodo-mongo.archive.gzfrisch ist, koennen die Werte beim Komodo-Restart aus dem Dump zurueckgespielt werden, ohne dass jemand sie sieht. - Wenn Vaultwarden vor Komodo restauriert wird (was hier nicht der Standardweg ist), kann auch von dort gelesen werden.
Paperless ist die wichtigste bewusste Ausnahme: PAPERLESS_DBPASS und PAPERLESS_REDIS sind seit der Hardening-Phase bewusst Stack-ENV (Paperless unterstuetzt _FILE fuer DB-Pass nicht). Ein Komodo-Mongo-Dump-Verlust ist daher fuer Paperless gleichbedeutend mit Re-Initialisierung der App-DB; in diesem Fall hilft nur ein Restore aus Vaultwarden oder externer Notiz.
Regel: Konkrete Werte werden nirgendwo im Repo, in Logs, in Doku-Kommentaren oder in ntfy-Meldungen wiedergegeben. Auch dieses Dokument haelt nur Variablennamen, Quellen und Reihenfolge fest, keine Werte.
6.3 Rechte
Nach einem Restore oder manuellem Rueckkopieren:
- Secret-Dateien wieder auf sinnvolle restriktive Rechte setzen
- keine produktiven Dienste starten, solange offensichtliche Secret-Dateien fehlen
7. Phase 3 - Was wirklich aus Borg kommen muss
Nicht alles muss in jedem Fall aus Borg zurueckgespielt werden.
7.1 Typischer Host-Ausfall ohne Datenverlust
In diesem Fall meist kein kompletter Borg-Extract notwendig.
Stattdessen:
- Shares und Pfade pruefen
- Secrets pruefen
- Dumps unter
/mnt/user/backups/borg/dumps/latestpruefen - Stacks kontrolliert hochfahren
7.2 Wenn echte Daten aus Borg benoetigt werden
Dann nur gezielt die in docs/RESTORE_MATRIX.md beschriebenen Pfade wiederherstellen.
Besonders kritisch:
/mnt/user/appdata/secrets/mnt/user/appdata/traefik/mnt/user/services/homelab-infra/mnt/user/services/stacks/mnt/user/services/posture-check- Details zu
/mnt/user/services/und Komodo/Gitea-Bootstrap stehen indocs/SERVICES_RECOVERY.md /mnt/user/services/gitea/data/mnt/user/appdata/authelia/config/mnt/user/appdata/komodo/core/mnt/user/appdata/komodo/periphery/mnt/user/backups/borg/dumps/latest/mnt/user/backups/borg/dumps/latest/unraid-flash-config.tar.gz- dienstspezifische App- und Nutzdatenpfade
Nicht blind alles extrahieren, wenn nur einzelne Pfade oder Dienste betroffen sind.
8. Phase 4 - Bootstrap-Reihenfolge der Stacks
Nie alle Stacks gleichzeitig starten.
Stufe 1 - Netz und Zugang
traefik/host-services/Adguard/host-services/tailscale/
Ziel:
- Web-Einstieg funktioniert
- DNS/Resolver-Basis ist da
- Remote-Zugang ist wieder verfuegbar
Stufe 2 - Gemeinsame Backends und Identity
infra/postgresql17/security/authelia/infra/redis/core/gitea/
Ziel:
- gemeinsame DB verfuegbar
- zentrale Auth laeuft; Authelia nutzt bewusst kein Redis-Session-Backend
- Authelia SMTP-Notifier kann GMX erreichen
- Redis verfuegbar als App-Cache fuer Paperless (
infra/redisist historisch als "shared" angelegt, wird faktisch nur von Paperless genutzt) - Git-Zugriff wiederhergestellt
Stufe 3 - Deploy-System
ops/komodo/- Kaltstart-Anker, kein Auto-Deploy
Komodo wird in dieser Stufe bewusst nicht ueber Gitea-Webhook deployed. Der vollstaendige Bootstrap-Pfad ist in docs/SERVICES_RECOVERY.md Abschnitt "Komodo Bootstrap" als lineare Stufen A-F dokumentiert. Hier in der DR-Reihenfolge gilt der Einstiegspunkt:
- Recovery-Anker ist
ops/komodo/docker-compose.ymlaus dem Repo (lokaler Clone, GitHub-Mirror oderhomelab-infra.bundle-Restore). - Komodo-Stack-ENV-Werte (
KOMODO_*) sind Stack-ENV-only und werden aus Vaultwarden oder externer Notiz wiederhergestellt (siehedocs/SECRETS_MAP.mdAbschnitt "Stack-ENV-only Secrets - Restore-Wege"). - Erst nach erfolgreicher Validierung der Komodo-Web-UI und Periphery-Verbindung werden in den naechsten Stufen die produktiven Stacks aufgenommen.
Ziel:
- Komodo Core und Mongo laufen
- Periphery verbindet sich wieder
- Stacks koennen wieder aus Git konsumiert werden
Stufe 4 - Kritische Anwendungen
security/vaultwarden/apps/paperless/apps/immich/apps/mealie/apps/mail-archiver/apps/nextcloud/
Stufe 5 - Restliche Apps und Ops
apps/ntfy/apps/paperless-gpt/apps/bentopdf/ops/glance/ops/borg-ui/ops/filebrowser/ops/glances/ops/scrutiny/ops/speedtest/monitoring/ops/hermes-agent/infra/ddns-updater/
Regel: Nach jeder Stufe kurz pruefen, bevor die naechste beginnt.
9. Phase 5 - Verifikation nach dem Wiederanlauf
9.1 Fundament
traefik.kaleschke.infoerreichbar- Authelia-Login funktioniert
- AdGuard beantwortet DNS-Anfragen
- Tailscale ist verbunden
9.2 GitOps
git.kaleschke.infoerreichbar- Repo vorhanden
komodo.kaleschke.infoerreichbar- Periphery verbunden
9.3 Kritische Apps
- Vaultwarden startet und ist erreichbar
- Paperless startet und sieht Dokumente
- Immich startet und sieht Medien
- Mealie startet
- Mail-Archiver startet
- Nextcloud startet und sieht Dateien
9.4 Backup-/Beobachtungsebene
- Borg UI startet und kennt sein Repo noch
- aktuelle Dump-Artefakte sind vorhanden
- Glance / Monitoring / ntfy sind wieder da
- Hermes Gateway und Dashboard starten;
hermes.kaleschke.infoleitet anonym zu Authelia weiter
10. Bekannte Sonderregeln
Traefik dynamic/
traefik/dynamic/* bleibt eine dokumentierte manuelle Ausnahme.
Das bedeutet:
- Git allein reicht hier nicht
- die Dateien unter
/mnt/user/appdata/traefik/dynamic/muessen real vorhanden sein - nach einem Restore oder Neuaufbau diesen Pfad explizit pruefen
paperless-ngx
paperless-ngx bleibt bewusst bei Stack Environment Variables fuer:
PAPERLESS_DBPASSPAPERLESS_REDIS
Nach einem Komodo-Neuaufbau muessen diese Werte vor dem Start des Stacks wieder gesetzt sein.
authelia
Authelia nutzt GMX SMTP fuer Identity-/2FA-Benachrichtigungen.
Vor dem Start muessen vorhanden sein:
/mnt/user/appdata/secrets/authelia_smtp_password.txt- SMTP-Zugang fuer
michideheld@gmx.de
Beim Smoke-Test muss authelia validate-config erfolgreich sein; der SMTP-Startup-Check darf den Start nicht blockieren.
nextcloud
nextcloud ist bewusst kein AIO-Stack, sondern ein klassischer App-/PostgreSQL-/Redis-Stack.
Vor dem Start muessen vorhanden sein:
/mnt/user/appdata/secrets/nextcloud_admin_user.txt/mnt/user/appdata/secrets/nextcloud_admin_password.txt/mnt/user/appdata/secrets/nextcloud_postgres_password.txt
Zusaetzlich muss der Nutzdatenpfad /mnt/user/documents/nextcloud-data erreichbar sein.
Borg-Dumps
Die Dump-Erzeugung ist host-seitig gedacht, nicht als Borg-UI-Inline-Hook.
Relevant:
- Dump-Ziel:
/mnt/user/backups/borg/dumps/latest - Skript:
ops/borg-ui/scripts/pre-backup-dumps.sh - Unraid-Flash-Artefakt:
unraid-flash-config.tar.gzplus.sha256und Manifest im selben Zielpfad
Hermes Agent
Hermes nutzt einen lokalen Build und hostseitige Runtime-Daten.
Vor dem Start muessen vorhanden sein:
/mnt/user/appdata/hermes-agent/data/mnt/user/appdata/hermes-agent/ssh/mnt/user/appdata/secrets/hermes_runner_id_ed25519- die hostseitige Hermes
.envmit Provider-/API-/Home-Assistant-Tokens
Smoke-Test: hermes-gateway healthcheck ist gruen, hermes.kaleschke.info leitet fuer anonyme Requests zu Authelia weiter.
Gitea
Micha/homelab-infra wird als privater GitHub-Push-Mirror gespiegelt. Dieser Mirror ist der bevorzugte Repo-Bootstrap, falls Gitea selbst nach einem Ausfall noch nicht laeuft. Wenn weder GitHub-Mirror noch lokaler Clone verfuegbar sind, ist services/gitea/data selbst Teil des kritischen Wiederanlaufs.
11. Offene Vorbereitungs-To-dos
- Unraid-USB-/Flash-Backup regelmaessig ueber
unraid-flash-config.tar.gzund optional Unraid Connect pruefen - Borg-Passphrase ist laut Operator-Bestaetigung vom 2026-05-26 extern/offline hinterlegt; bei Reviews nur Existenz/Lesbarkeit der Offline-Kopie pruefen, nie den Wert dokumentieren
- Komodo Stack-ENV-Werte zentral ausserhalb von Komodo dokumentieren
- regelmaessige automatisierte Restore-Smoke-Tests fuer Vaultwarden, Gitea und Paperless etablieren
komodo-mongo-Dump nach Major-Upgrades gezielt kontrollieren
12. Kurzform fuer den Ernstfall
Wenn es schnell gehen muss:
- Unraid und Shares sauber wiederherstellen
- Repo-Zugang sichern
- Secrets und Stack-ENV-Werte pruefen
- Stacks in der festgelegten Reihenfolge hochfahren
- Kritische Apps testen
- Nur bei echtem Datenbedarf gezielt aus Borg wiederherstellen
Dieses Dokument soll Ruhe in den Ablauf bringen, nicht Hektik erzeugen.