diff --git a/docs/RESTORE_MATRIX.md b/docs/RESTORE_MATRIX.md index 4f98a29..43ae5b3 100644 --- a/docs/RESTORE_MATRIX.md +++ b/docs/RESTORE_MATRIX.md @@ -32,7 +32,7 @@ Sie ist die fachliche Ergaenzung zu `docs/DISASTER_RECOVERY.md`. | Tailscale | Share / Borg | `/mnt/user/appdata/tailscale` | keine | Tailscale-State im Pfad | Host-Netz | Tailscale verbunden | | PostgreSQL 18 | Share + Dumps | `/mnt/user/appdata/postgresql18` (archivierter Rollback-Altstand: `/mnt/user/appdata/_archive/pg18-immich-rollback-volumes-20260602/postgresql17`) | `postgresql17-globals.sql`, `postgresql17-mailarchiver.dump`, `postgresql17-paperless.dump`, optional `postgresql17-authelia.dump` | `postgres_password.txt`, App-Rollen-Passwoerter aus den jeweiligen Stack-ENV/Secret-Dateien | `backend_net` | DB startet, Ziel-Datenbanken vorhanden; `SHOW data_checksums` ist `on` | | Redis 8 | Share / Host | `/mnt/user/appdata/redis`; Rollback-Backup unter `/mnt/user/backups/borg/dumps/latest/shared-redis-pre-redis8-` | RDB/AOF-Dateien im Datenpfad | `redis_password.txt` | `backend_net` | Redis startet, `redis_version` ist 8.x, Apps verbinden sich | -| Authelia | Borg | `/mnt/user/appdata/authelia/config`, `/mnt/user/appdata/secrets/*authelia*` | Shared PostgreSQL 18, optional Dump `postgresql17-authelia.dump` | JWT/Session/Storage/Postgres-/SMTP-Secret-Dateien | PostgreSQL 18, Traefik, GMX SMTP | Login-Seite und ForwardAuth funktionieren; SMTP-Notifier startet; aktive Sessions werden nach Restart neu aufgebaut; Restore-Test-Scaffold am 2026-06-02 abgelegt (`ops/restore-tests/authelia-*`), erster Lauf steht aus | +| Authelia | Borg | `/mnt/user/appdata/authelia/config`, `/mnt/user/appdata/secrets/*authelia*` | Shared PostgreSQL 18, optional Dump `postgresql17-authelia.dump` | JWT/Session/Storage/Postgres-/SMTP-Secret-Dateien | PostgreSQL 18, Traefik, GMX SMTP | Login-Seite und ForwardAuth funktionieren; SMTP-Notifier startet; aktive Sessions werden nach Restart neu aufgebaut; Restore-Smoke am 2026-06-03 erfolgreich: Config aus Borg, minimale Test-Config, frisches Test-Postgres, HTTP `/api/health` 200, Report `/mnt/user/backups/restore-reports/authelia-2026-06-03.md` | | Gitea | GitHub-Mirror + Gitea-Bundles fuer Repo-Bootstrap, Borg + Dump fuer Gitea-Appstate | `/mnt/user/services/gitea/data`, `/mnt/user/backups/git-bundles/gitea` | `gitea.sqlite.dump`, Bundle-Report `latest-report.md` | `borg_repo_passphrase.txt` fuer Restore-Tests; GitHub-Push-Mirror-PAT liegt nur in Gitea-Mirror-Settings | Traefik | Web-UI erreichbar, Repo sichtbar, SSH-Port reagiert; Bundle laesst sich klonen und `git fsck` ist sauber; GitHub-Push-Mirror synchronisiert ohne `last_error`; Mini-Restore nach `/mnt/user/backups/restore-lab/gitea` am 2026-05-07 erfolgreich validiert | | Komodo | Borg / Share | `/mnt/user/appdata/komodo/core`, `/mnt/user/appdata/komodo/periphery`, `/mnt/user/services/stacks` | `komodo-mongo.archive.gz` falls verifiziert | `komodo_mongo_password.txt`, `KOMODO_*` Stack ENV | Traefik, Mongo, Gitea | UI erreichbar, Periphery verbunden | | GitOps Host Automation | Borg / Git | `/mnt/user/services/homelab-infra`, `/mnt/user/services/posture-check` | keine eigene DB | keine | Gitea, Komodo, Unraid User Scripts | `posture-check` laeuft vom Host-Pfad und liefert `warning_count: 0` im bekannten Uebergangszustand | diff --git a/ops/restore-tests/README.md b/ops/restore-tests/README.md index 6a75301..0b9bf8f 100644 --- a/ops/restore-tests/README.md +++ b/ops/restore-tests/README.md @@ -38,7 +38,7 @@ Ziel: - `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 (Scaffold; Erstlauf noch offen) +- `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 @@ -87,9 +87,10 @@ Aktuell ist das erste validierte Muster vorhanden. - 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 -- V1-Ablauf weiter ohne `ntfy`, mit Bereinigung nach Erfolg -- naechster grosser Kandidat ist ein erneuter Immich-Lauf nach VectorChord-Migration mit Zeitmessung; danach in die Rotation aufnehmen +- `ntfy`-Wrapper ist fuer Host-Jobs verfuegbar +- naechste grosse Kandidaten sind Nextcloud, Mailarchiver, Mealie und Komodo-Mongo-Daten-Restore -Vor dem ersten echten Testlauf muessen Zielpfade, Quellpfade und Bereinigungsschritte bewusst freigegeben werden. +Vor dem ersten echten Testlauf je neuem Dienst muessen Zielpfade, Quellpfade und Bereinigungsschritte bewusst freigegeben werden. diff --git a/ops/restore-tests/authelia-plan.md b/ops/restore-tests/authelia-plan.md index 1879ca6..6f1add4 100644 --- a/ops/restore-tests/authelia-plan.md +++ b/ops/restore-tests/authelia-plan.md @@ -82,14 +82,8 @@ Optional spaeter: | identity_validation Schema-Drift | Aelteres/neueres Authelia-Schema erwartet andere Keys | Validate-Config Output lesen, ggf. Test-Block anpassen | | users_database.yml mit produktiven Hashes | Daten werden ins Restore-Lab kopiert, aber niemals gemountet auf produktive Domain | OK; Testpfad ist isoliert, kein Browser-Zugang ueber LAN | -## Noch offen vor dem ersten echten Lauf - -- Erstlauf `--what-if` als Plan-Check -- Erstlauf `--keep-data` zur Beobachtung von SMTP-Startup-Verhalten -- Validate-Config-Output zum Authelia-Schema-Stand pruefen -- nach Erfolg: Schedule-Eintrag analog zu Vaultwarden (2. Samstag in geraden Monaten als Vorschlag, damit nicht mit Paperless kollidiert) - ## Status - Skript- und Compose-Scaffold abgelegt am 2026-06-02 -- **noch kein echter Mini-Restore gelaufen** - erster Lauf braucht Operator-Freigabe +- Erstlauf am 2026-06-03 erfolgreich: Config aus Borg, minimale Test-Konfiguration, frisches Test-Postgres, HTTP `/api/health` `200`, Report `/mnt/user/backups/restore-reports/authelia-2026-06-03.md` +- Fuer die Rotation vorgesehen: zweiter Samstag in geraden Monaten, 07:30 diff --git a/ops/restore-tests/authelia-runbook.md b/ops/restore-tests/authelia-runbook.md index 784e350..430b933 100644 --- a/ops/restore-tests/authelia-runbook.md +++ b/ops/restore-tests/authelia-runbook.md @@ -2,7 +2,7 @@ ## Status -Skript und Test-Compose sind als **Scaffold** abgelegt. Erstlauf steht noch aus und braucht Operator-Freigabe. Authelia ist Tier-1-kritisch, deshalb startet dieser Test bewusst konservativ: Smoke-Test prueft nur Config-Validate + HTTP-Health, kein vollstaendiger Auth-Flow. +Skript und Test-Compose sind validiert. **Erstlauf 2026-06-03 erfolgreich**: Config aus Borg extrahiert, minimale Test-Konfiguration validiert, frisches Test-Postgres gestartet, HTTP `/api/health` `200`. Report: `/mnt/user/backups/restore-reports/authelia-2026-06-03.md`. Authelia ist Tier-1-kritisch, deshalb bleibt dieser Test bewusst konservativ: Smoke-Test prueft nur Config-Validate + HTTP-Health, kein vollstaendiger Auth-Flow und kein produktiver Dump-Restore. ## Vorbedingungen @@ -74,7 +74,7 @@ Produktive Authelia-Container, produktive Secrets, produktive Postgres-DB und pr ## Schedule -Aktuell nicht im automatischen Schedule. Vorschlag nach erstem erfolgreichen Lauf: zweimonatlich (2. Samstag in geraden Monaten), damit nicht mit Paperless kollidierend. +Empfohlener Schedule nach erfolgreichem Erstlauf: zweimonatlich (2. Samstag in geraden Monaten), damit nicht mit Paperless kollidierend. ## Festgelegte Entscheidungen diff --git a/ops/restore-tests/monthly-random-restore.sh b/ops/restore-tests/monthly-random-restore.sh index 0cf35d6..1f54660 100755 --- a/ops/restore-tests/monthly-random-restore.sh +++ b/ops/restore-tests/monthly-random-restore.sh @@ -3,7 +3,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TOPIC="${TOPIC:-homelab-info}" -TESTS="${TESTS:-vaultwarden gitea paperless}" +TESTS="${TESTS:-vaultwarden gitea paperless authelia}" pick_random() { printf '%s\n' $TESTS | awk 'BEGIN { srand() } { items[++count] = $0 } END { print items[int(rand() * count) + 1] }' diff --git a/ops/restore-tests/schedule.md b/ops/restore-tests/schedule.md index 6e74a0b..990ec73 100644 --- a/ops/restore-tests/schedule.md +++ b/ops/restore-tests/schedule.md @@ -44,9 +44,8 @@ Quartals-Belegung: | 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: Scaffold am 2026-06-02 abgelegt, **erster echter Lauf noch offen**. Vorgeschlagener Schedule-Slot nach Erstlauf: 2. Samstag in geraden Monaten 07:30 (kollisionsfrei zu Paperless). +Immich am 2026-05-27; Paperless erneut am 2026-05-31; Authelia am +2026-06-03 (Config-Smoke ohne produktiven Dump-Restore). ## Konkreter Kalender @@ -58,6 +57,8 @@ Authelia: Scaffold am 2026-06-02 abgelegt, **erster echter Lauf noch offen**. Vo - `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: @@ -75,6 +76,7 @@ Vixie-Cron (Unraid) verknuepft `day-of-month` und `day-of-week` mit **OR**, soba | `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 | diff --git a/ops/restore-tests/unraid-user-scripts.md b/ops/restore-tests/unraid-user-scripts.md index 1c4d1ba..9568050 100644 --- a/ops/restore-tests/unraid-user-scripts.md +++ b/ops/restore-tests/unraid-user-scripts.md @@ -117,7 +117,30 @@ exec /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-job-with-ntf immich homelab-info ``` -## Script 6 - `monthly-random-restore` +## Script 6 - `restore-authelia-bimonthly` + +Cron: + +- `30 7 * * 6` (jeden Samstag 07:30) + +Guard: nur am zweiten Samstag in geraden Monaten ausfuehren. + +```bash +#!/bin/bash +month=$(date +%-m) +day=$(date +%-d) +case "$month" in + 2|4|6|8|10|12) ;; + *) exit 0 ;; +esac +if [ "$day" -lt 8 ] || [ "$day" -gt 14 ]; then + exit 0 +fi +exec /mnt/user/services/homelab-infra/ops/restore-tests/run-restore-job-with-ntfy.sh \ + authelia homelab-info +``` + +## Script 7 - `monthly-random-restore` Cron: @@ -130,8 +153,8 @@ exec /mnt/user/services/homelab-infra/ops/restore-tests/monthly-random-restore.s ## Stand -- die Bash-Jobs wurden am 2026-05-07 hostseitig erfolgreich verifiziert -- `freshness`, `vaultwarden`, `gitea` und `paperless` laufen damit prinzipiell automatisch +- die ersten Bash-Jobs wurden am 2026-05-07 hostseitig erfolgreich verifiziert +- `freshness`, `vaultwarden`, `gitea`, `paperless`, `immich` und `authelia` sind als Host-Jobs verfuegbar - ntfy-Wrapper schreibt Erfolg/Fehler-Meldungen an die definierten Topics ## Fehler-Topic