Files
homelab-infra/ops/restore-tests/schedule.md
T
2026-06-06 08:11:03 +02:00

148 lines
5.4 KiB
Markdown

# 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)
- `adguard` Restore-Smoke-Test (Config + HTTP/DNS, nach DNS-Aenderungen auch ausserhalb des Quartals)
- `redis` Restore-Smoke-Test (Pre-Cutover-Artefakt + Redis 8, vor/nach Major-Aenderungen auch ausserhalb des Quartals)
- 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); AdGuard Home am
2026-06-06 (Config + HTTP/DNS-Smoke); Redis 8 am 2026-06-06
(Pre-Cutover-Artefakt + PING/INFO/DBSIZE-Smoke).
## 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.