Files
homelab-infra/ops/restore-tests
Micha 53c34dca0e fix(restore): nextcloud-test disable check_data_directory_permissions
Erster Lauf am 2026-06-03 lief sauber durch alle Phasen (Borg-Extract,
pg_restore, Container alle gesund), schlug aber im HTTP-Smoke mit 503 fehl.
Ursache (aus dem preserved /mnt/user/backups/restore-lab/_failed/...):
- OC_Util.php:486 prueft die Permissions der data-Dir
- Skript hatte chmod -R a+rwX gesetzt (0777, letzte Stelle 7)
- Nextcloud versucht selbst chmod(0770) als www-data im Container
- Unraids shfs/FUSE lehnt chmod von Non-Root ab
- Nextcloud meldet "data directory readable by other people" -> 503

Fix: in der gepatchten config.php zusaetzlich
'check_data_directory_permissions' => false setzen. Nextcloud bietet
das in OC_Util:480 explizit als Opt-out an, fuer den isolierten Smoke
mit Wegwerf-Daten ist das vertretbar (kein Public, kein Traefik).
Produktiv bleibt der Check natuerlich an.

Patching erfolgt im bestehenden PHP-Injection-Block; idempotent (laeuft
keine Aenderung wenn beide Keys schon im config.php sind). Fallback-
sed-Pfad fuer Hosts ohne php ebenfalls erweitert.
2026-06-03 19:23:08 +02:00
..

Restore Tests

Kontrollierte Restore-Tests fuer homelab-infra.

Ziel:

  • Backups durch echte Test-Restores verifizieren
  • produktive Pfade nicht beschreiben
  • Testlaeufe spaeter weitgehend automatisieren

Grundregeln

  • Restore-Quelle bleibt im Backup-Bereich, z. B. /mnt/user/backups/borg
  • Test-Restores laufen nur in /mnt/user/backups/restore-lab
  • Reports landen in /mnt/user/backups/restore-reports
  • Test-Container nutzen das Praefix restoretest-
  • keine produktiven Volumes schreibend mounten
  • keine produktiven Domains fuer Testinstanzen uebernehmen

Geplante Struktur

  • schedule.md: Intervalle und Verantwortlichkeiten

  • common.sh: gemeinsame Helfer fuer Borg-Lookup, Borg-Extract und Compose-Cleanup; prueft vor Borg-Operationen auch borg-ui:/data/borg.db und borg-ui:/local/secrets/borg_repo_passphrase.txt

  • vaultwarden-restore-test.ps1: erster Mini-Restore-Ablauf

  • vaultwarden-restore-test.sh: hosttauglicher Vaultwarden-Restore-Job

  • vaultwarden-plan.md: konkreter Vaultwarden-Testplan

  • vaultwarden-compose.test.yml: isolierte Testinstanz fuer Vaultwarden

  • gitea-restore-test.ps1: Gitea-Mini-Restore-Ablauf

  • gitea-restore-test.sh: hosttauglicher Gitea-Restore-Job

  • gitea-plan.md: konkreter Gitea-Testplan

  • gitea-compose.test.yml: isolierte Testinstanz fuer Gitea

  • paperless-restore-test.ps1: Paperless-Mini-Restore-Ablauf

  • paperless-restore-test.sh: hosttauglicher Paperless-Restore-Job

  • paperless-plan.md: konkreter Paperless-Testplan

  • paperless-compose.test.yml: isolierte Testinstanz fuer Paperless inkl. Test-Postgres und Test-Redis

  • immich-restore-test.ps1: Immich-Mini-Restore-Ablauf als Plan-/Windows-Scaffold

  • immich-restore-test.sh: hosttauglicher Immich-Restore-Job, erster echter Lauf noch offen

  • immich-plan.md: konkreter Immich-Testplan

  • immich-runbook.md: Operator-Runbook fuer den ersten Immich-Lauf

  • immich-compose.test.yml: isolierte Testinstanz fuer Immich inkl. VectorChord/pgvector-Test-Postgres und Test-Redis

  • authelia-restore-test.sh: Authelia-Restore-Job (Config-Smoke; Erstlauf 2026-06-03 erfolgreich)

  • authelia-compose.test.yml: isolierte Testinstanz fuer Authelia inkl. Test-Postgres, Filesystem-Notifier (kein echter SMTP-Versand)

  • authelia-plan.md: konkreter Authelia-Testplan

  • authelia-runbook.md: Operator-Runbook fuer den ersten Authelia-Lauf

  • nextcloud-restore-test.sh: Nextcloud-Restore-Job (Scaffold; blockiert durch Unraid shfs-chmod-Inkompatibilitaet - siehe unten)

  • nextcloud-compose.test.yml: isolierte Testinstanz fuer Nextcloud inkl. Test-Postgres und Test-Redis

  • check-restore-freshness.ps1: woechentlicher Frische-Check fuer Dumps und Reports

  • run-restore-checks.ps1: einfacher Dispatcher fuer Restore-Jobs

  • check-restore-freshness.sh: hosttauglicher Frische-Check

  • run-restore-checks.sh: hosttauglicher Dispatcher

  • common.sh: gemeinsame Host-Helferfunktionen

  • automation-plan.md: Host-Job- und Automatisierungsmodell

Automatisierungsmodell

  • Ausfuehrung: Unraid User Script / Host-Job
  • Logik: Repo-Skripte in diesem Verzeichnis
  • Ergebnis: Markdown-Report
  • Meldung: ntfy
  • Hermes: optional nur fuer Zusammenfassung und Auswertung

Wichtig:

  • die Bash-Skripte *.sh sind die produktive Host-Variante
  • check-restore-freshness.ps1 und die *.ps1-Dateien bleiben als lokale Plan-/Hilfsvariante nutzbar
  • im Windows-Clone fehlen die /mnt/user/...-Pfade naturgemaess

Validiertes Grundmuster

Stand nach dem ersten echten Vaultwarden-Test:

  • Borg-Quelle bleibt das produktive Remote-Repo bei Hetzner
  • Borg-Zugriff laeuft praktisch ueber den vorhandenen borg-ui-Container
  • SSH-Trust wird ueber known_hosts im borg-ui-Container hergestellt
  • die Borg-Passphrase kommt fuer Restore-Tests aus einer Host-Secret-Datei
  • Restore-Ziel liegt immer getrennt unter /mnt/user/backups/restore-lab
  • Reports liegen unter /mnt/user/backups/restore-reports
  • Testinstanzen bekommen keine produktive Domain und keine Traefik-Route

Das ist das bevorzugte Muster fuer weitere dateibasierte Restore-Tests wie gitea.

Fuer datenbankgestuetzte Dienste wie paperless kommt zusaetzlich ein isolierter Dump-Restore in Test-Postgres dazu.

Status

Aktuell ist das erste validierte Muster vorhanden.

  • echter Vaultwarden-Restore am 2026-05-07 erfolgreich verifiziert
  • echter Gitea-Restore am 2026-05-07 erfolgreich verifiziert
  • echter Paperless-Restore am 2026-05-07 erfolgreich verifiziert
  • Immich-Restore-Test am 2026-05-27 erfolgreich verifiziert; Test-Postgres wurde nach der VectorChord-Migration am 2026-05-31 auf das produktive Immich-Postgres-Image umgestellt
  • Authelia-Restore-Smoke am 2026-06-03 erfolgreich verifiziert; bewusst ohne produktiven Dump-Restore wegen Storage-Encryption-Key-Kopplung
  • Bash-Dispatcher und Bash-Restore-Jobs am 2026-05-07 erfolgreich hostseitig verifiziert
  • Restore-Lab und Report-Pfade auf dem Host angelegt
  • ntfy-Wrapper ist fuer Host-Jobs verfuegbar
  • Nextcloud-Restore-Test: Scaffold existiert, aber blockiert. Nextcloud 33 fuehrt zur Laufzeit chmod() auf Dateien unter /var/www/html aus (OC_Util.php:486). Auf Unraids FUSE/shfs User-Shares ist chmod strukturell nicht moeglich, was zu permanenter 503 fuehrt. Loesungsoptionen: (a) Restore-Lab auf ein Cache-Drive statt User Share legen, (b) Docker-Volumes statt Bind-Mounts verwenden, (c) tmpfs-Mount fuer html/ + rsync der Borg-Daten hinein. Bis dahin ist Nextcloud als Backlog-Item dokumentiert.
  • Komodo-Mongo-Daten-Restore am 2026-06-03 erfolgreich: 86904 Dokumente (inkl. 32 Stacks), Report /mnt/user/backups/restore-reports/komodo-mongo-restore-2026-06-03.md
  • naechste grosse Kandidaten sind Mailarchiver und Mealie; Nextcloud bleibt blockiert (shfs-chmod)

Vor dem ersten echten Testlauf je neuem Dienst muessen Zielpfade, Quellpfade und Bereinigungsschritte bewusst freigegeben werden.