Files
homelab-infra/ops/restore-tests/README.md
T
Micha 1fcdb68221 docs: consolidate restore documentation into ops/restore-tests
- merge RESTORE_HANDBOOK.md into ops/restore-tests/README.md (single
  operations doc; restore status lives only in RESTORE_MATRIX maturity
  table)
- RESTORE_MATRIX.md: extract embedded runbook drafts (261 -> 141 lines);
  unraid-flash and tailscale stubs become ops/restore-tests runbooks,
  adguard/redis checklists superseded by validated scripts
- delete six historical pre-first-run *-plan.md files (runbook + script
  are the source of truth since the validated first runs)
- SERVICES_RECOVERY: drop completed task table; DISASTER_RECOVERY:
  point related docs and section 11 to MASTER_TODO/schedule

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 07:11:16 +02:00

4.4 KiB

Restore-Tests - Betrieb und Werkzeuge

Typ: Runbook/Tool-Doku · Stand: 2026-06-11 · Status: aktiv

Kontrollierte Restore-Tests fuer homelab-infra. Dieses Dokument ist das einzige Betriebsdokument fuer Restore-Tests (das fruehere docs/RESTORE_HANDBOOK.md ist hierin aufgegangen). Verwandt:

  • docs/RESTORE_MATRIX.md - Restore-Quellen, Secrets, Smoke-Tests und Test-Reifegrad je Dienst (einziger Status-Ort)
  • docs/DISASTER_RECOVERY.md - echter Wiederanlauf
  • schedule.md - Kadenz, Cron-Ausdruecke und Shell-Guards
  • unraid-user-scripts.md - Unraid-User-Script-Vorlagen fuer die Host-Jobs

Grundregeln

  • Restore-Quelle bleibt das produktive Borg-Repo bei Hetzner; Zugriff ueber den vorhandenen borg-ui-Container
  • Passphrase kommt aus /mnt/user/appdata/secrets/borg_repo_passphrase.txt, nie aus UI-Interna
  • Testdaten landen nur unter /mnt/user/backups/restore-lab/<dienst>; bei Fehlschlag wird nach _failed/ verschoben statt geloescht
  • Reports landen unter /mnt/user/backups/restore-reports
  • Testcontainer nutzen das Praefix restoretest-, localhost-Ports, keine produktive Domain, keine Traefik-Route
  • keine produktiven Volumes schreibend mounten, keine produktiven Pfade beschreiben
  • keine Restore-Automatik fuer neue Dienste ohne bewusste Freigabe

Erfolgskriterien

Ein Restore-Test gilt nur dann als erfolgreich, wenn Quelle lesbar war, Daten im Restore-Lab ankamen, der Testcontainer startete, der fachliche Smoke-Test gelang und ein Report geschrieben wurde. "Container laeuft" allein reicht nicht.

Aufbau des Verzeichnisses

Pro Dienst existieren bis zu drei Artefakte:

  • <dienst>-restore-test.sh - automatisierter Host-Job (produktive Wahrheit)
  • <dienst>-compose.test.yml - isolierte Testinstanz
  • <dienst>-runbook.md - manueller Ablauf bzw. Besonderheiten

Dazu zentrale Helfer:

  • run-restore-checks.sh - Dispatcher (Host), run-restore-checks.ps1 (lokale Planvariante)
  • run-restore-job-with-ntfy.sh - Wrapper: Erfolg -> homelab-info, Fehler -> homelab-alerts
  • check-restore-freshness.sh / .ps1 - woechentlicher Frische-Check fuer Dumps und Reports (prueft pg-Dumps per pg_restore --list)
  • negative-freshness-alert-test.sh - sicherer Negativtest des Alarmwegs (synthetischer Leerpfad, quartalsweise)
  • common.sh - gemeinsame Borg-/Compose-Helfer
  • automation-plan.md - Host-Job- und Automatisierungsmodell

Betriebsmodus

Stand 2026-06-11 ist der Betrieb auf V1+ (validierte Bash-Host-Jobs mit ntfy):

  • Host-Jobs laufen als Unraid User Scripts vom Repo-Spiegel /mnt/user/services/homelab-infra
  • Kadenz und Cron-Ausdruecke: schedule.md (woechentlicher Frische-Check, monatliche/quartalsweise Dienst-Rotation, monatlicher Zufalls-Restore)
  • Job-Vorlagen: unraid-user-scripts.md

Schnellstart

# Frische-Check
bash /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-checks.sh freshness

# Dienst-Restore-Check (vaultwarden|gitea|paperless|immich|authelia|adguard|redis|komodo-bootstrap|nextcloud)
bash /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-checks.sh <dienst>

# Negativtest des Alarmwegs (quartalsweise)
bash /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-checks.sh freshness-negative

# Mit ntfy-Meldung
bash /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-job-with-ntfy.sh freshness homelab-info

Status je Dienst

Einziger Status-Ort ist die Reifegrad-Tabelle in docs/RESTORE_MATRIX.md (letzter Test, Typ, naechster Lauf). Hier nur Besonderheiten:

  • Nextcloud: Test am 2026-06-03 erfolgreich, aber mit Unraid-shfs-Eigenheit: Nextcloud fuehrt chmod() unter /var/www/html aus, was auf FUSE/shfs scheitert. Das Skript patcht check_data_directory_permissions: false und legt den .ncdata-Marker an.
  • Authelia: bewusst Config-Smoke ohne produktiven Dump-Restore (Storage-Encryption-Key-Kopplung).
  • Immich: Foto-Dateien-Restore ist bewusst nicht Teil des Smokes (separater DR-Drill); Test-Postgres nutzt das produktive VectorChord-Image.
  • Unraid-Flash / Tailscale: noch ohne vollstaendigen Erstlauf - unraid-flash-runbook.md, tailscale-runbook.md; offene Schritte in docs/MASTER_TODO.md.

Naechste Ausbaustufen

  1. Hermes-Zusammenfassung ueber vorhandene Reports (geparkt mit Hermes)
  2. Report-Rotation: Reports werden dauerhaft aufbewahrt; bei wachsender Anzahl jaehrlich nach _archive/YYYY/ verschieben. Der Frische-Check warnt ab MAX_REPORT_AGE_DAYS=45, loescht aber nie automatisch.