# Restore Test Schedule ## Ziel Regelmaessige Restore-Tests mit wenig Handarbeit und klaren Nachweisen. ## Intervalle Woechentlich: - Backup-/Dump-Frische pruefen - keine echten Restore-Container starten - pruefen: - Dump-Dateien vorhanden - Dump-Dateien nicht zu alt - letzte Reports vorhanden Monatlich: - `vaultwarden` Mini-Restore - `gitea` Mini-Restore, versetzt zum Vaultwarden-Lauf Alle 2 Monate: - `paperless` Mini-Restore Quartalsweise: - Restore-/DR-Sanity-Check - `immich` Restore-Smoke-Test (DB + UI, ohne produktive Foto-Mounts; Erstlauf 2026-05-27 erfolgreich) - pruefen: - Restore-Lab-Struktur - Reports - Skripte und Pfade - Doku noch passend Quartals-Belegung: | Quartal | Mini-Restore | Sanity-Fokus | |---|---|---| | Q1 | `paperless` | Tier-1-Reihenfolge, Posture-Check, Borg-Frische | | Q2 | `immich` | Komodo-Bootstrap, Gitea-Bundles, Secrets-Inventur | | Q3 | `mealie` oder `nextcloud` | DNS-Pfad und Cert-Expiry-Sicht | | Q4 | `vaultwarden` oder `gitea` | Externe Abhaengigkeiten, Hetzner, GitHub-Mirror | Bestaetigte Mini-Restores: Vaultwarden, Gitea und Paperless am 2026-05-07; Immich am 2026-05-27; Paperless erneut am 2026-05-31; Authelia am 2026-06-03 (Config-Smoke ohne produktiven Dump-Restore). ## Konkreter Kalender - Jeden Montag, 06:30: - `check-restore-freshness.sh` - Jeden 1. Samstag im Monat, 07:00: - `vaultwarden` - Jeden 3. Samstag im Monat, 07:00: - `gitea` - Jeden 2. Samstag in ungeraden Monaten, 08:00: - `paperless` - Jeden 2. Samstag in geraden Monaten, 07:30: - `authelia` - Jeden 1. des Monats, 09:00: - `monthly-random-restore.sh` - Quartalsweise am 1. Werktag des Quartals: - DR-/Restore-Sanity-Check - Quartalsweise am 2. Sonntag im zweiten Quartalsmonat, 08:30: - `immich` ## Unraid User Scripts Cron Vixie-Cron (Unraid) verknuepft `day-of-month` und `day-of-week` mit **OR**, sobald beide gesetzt sind. "n-ter Samstag im Monat" laesst sich deshalb nicht direkt im Cron-Ausdruck ausdruecken. Wir triggern stattdessen an **jedem** Samstag/Sonntag und filtern den Monatstag im User-Script per Shell-Guard. | Script | Cron | Shell-Guard (zusaetzlich) | Bedeutung | |---|---|---|---| | `restore-freshness-weekly` | `30 6 * * 1` | - | jeden Montag 06:30 | | `restore-vaultwarden-monthly` | `0 7 * * 6` | `[ "$(date +%-d)" -le 7 ]` | erster Samstag im Monat 07:00 | | `restore-gitea-monthly` | `15 7 * * 6` | `d=$(date +%-d); [ "$d" -ge 15 ] && [ "$d" -le 21 ]` | dritter Samstag im Monat 07:15 | | `restore-paperless-bimonthly` | `0 8 * * 6` | `m=$(date +%-m); d=$(date +%-d); case "$m" in 1\|3\|5\|7\|9\|11) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac` | zweiter Samstag in ungeraden Monaten 08:00 | | `restore-authelia-bimonthly` | `30 7 * * 6` | `m=$(date +%-m); d=$(date +%-d); case "$m" in 2\|4\|6\|8\|10\|12) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac` | zweiter Samstag in geraden Monaten 07:30 | | `restore-immich-quarterly` | `30 8 * * 0` | `m=$(date +%-m); d=$(date +%-d); case "$m" in 2\|5\|8\|11) [ "$d" -ge 8 ] && [ "$d" -le 14 ];; *) false;; esac` | zweiter Sonntag in Feb/Mai/Aug/Nov 08:30 | | `monthly-random-restore` | `0 9 1 * *` | - | erster Kalendertag im Monat 09:00 | **Warum so**: ein frueheres Schema wie `0 7 1-7 * 6` haette in Vixie-Cron die OR-Semantik ausgeloest und an jedem Tag 1-7 zusaetzlich zu jedem Samstag gefeuert (~11 Laeufe statt 1 pro Monat). Die obige Trennung Cron-Trigger + Shell-Guard ist die einzige robuste Loesung in Standard-Cron. ## Betriebsmodus - V1: - Bash-Jobs laufen hostseitig manuell oder per User Script - `ntfy`-Wrapper ist vorhanden; Erfolg geht nach `homelab-info`, Fehler nach `homelab-alerts` - Hermes wertet spaeter optional Reports aus - V2: - fester Host-Schedule - `ntfy` bei Erfolg/Fehler ueber `run-restore-job-with-ntfy.sh` - Hermes erzeugt Zusammenfassungen und Overviews ## Automatisierung Automatisch: - Testpfad vorbereiten - Restore in `restore-lab` - Testcontainer `restoretest-*` starten - Smoke-Test ausfuehren - Markdown-Report schreiben - `ntfy` Erfolg/Fehler senden - alte Testartefakte bereinigen Manuell: - neue Testfaelle einfuehren - riskante oder produktionsnahe Sondertests - Aenderungen an Restore-Logik - Freigabe fuer den ersten echten Restore je Dienst ## Ablage - Quelle: `/mnt/user/backups/borg` - Restore-Lab: `/mnt/user/backups/restore-lab` - Reports: `/mnt/user/backups/restore-reports` ## Quartals-Sanity Kurz pruefen: - `docs/DISASTER_RECOVERY.md` Phase 1-5 passt noch zum Repo. - `docs/RESTORE_MATRIX.md` Tier-Klassifizierung und letzte Restore-Erfolge stimmen. - `docs/SECRETS_MAP.md` enthaelt die noetigen Secret-Pfade ohne Werte. - Gitea-Bundles sind frisch und klonbar. - GitHub-Mirror ist erreichbar und aktuell. - ntfy-Testnachricht an `homelab-info` kommt an. - Offline-Kopie der Borg-Passphrase ist auffindbar. - Capacity-Stand passt zu `docs/CAPACITY_AND_LIFECYCLE.md`. ## Erfolgsregel Ein Test gilt erst dann als erfolgreich, wenn: - Restore abgeschlossen ist - Testcontainer startet - definierter Smoke-Test erfolgreich ist - Report geschrieben wurde Nur "Container laeuft" reicht nicht.