Files
homelab-infra/ops/restore-tests/authelia-plan.md
T

5.6 KiB

Authelia Restore Test Plan

Ziel

Nachweisen, dass die Authelia-Konfiguration aus dem produktiven Borg-Archiv in einer isolierten Testumgebung wieder lauffaehig ist und der HTTP-Health-Endpunkt antwortet, ohne dass dabei produktive Secrets, produktives Postgres oder produktiver SMTP-Versand beruehrt werden.

Bewusst nicht Teil dieses Tests:

  • Restore mit produktiven Authelia-Secrets. Der Test nutzt ausschliesslich Wegwerf-Werte fuer AUTHELIA_JWT_SECRET, AUTHELIA_SESSION_SECRET, AUTHELIA_STORAGE_ENCRYPTION_KEY, AUTHELIA_STORAGE_POSTGRES_PASSWORD, AUTHELIA_NOTIFIER_SMTP_PASSWORD. Eine Echtsession auf produktiven Daten waere fachlich nicht sinnvoll.
  • SMTP-Realanruf an GMX. Notifier wird in der Test-Konfiguration auf Filesystem umgebogen.
  • Forward-Auth gegen Traefik. Test laeuft nur auf 127.0.0.1:19091, keine Traefik-Route.
  • WebAuthn-/Duo-/OIDC-Identity-Provider-Endpunkte. Smoke prueft /api/health.

Quelle

  • Backup-Quelle: produktives Borg-Archiv (hetzner_borg_appdata_critical)
  • fachlich relevante Pfade im Archiv:
    • local/appdata/authelia/config (verpflichtend)
    • local/borg-dumps/latest/postgresql17-authelia.dump (optional, wenn vorhanden)
  • produktive Secrets unter /mnt/user/appdata/secrets/authelia_*.txt werden nicht gemountet

Test-Ziel

  • Restore-Lab: /mnt/user/backups/restore-lab/authelia
  • Testdatenpfade:
    • /mnt/user/backups/restore-lab/authelia/config (restaurierte configuration.yml.original + erzeugte configuration.restoretest.yml)
    • /mnt/user/backups/restore-lab/authelia/postgres (Test-Postgres-Datadir)
    • /mnt/user/backups/restore-lab/authelia/dumps/latest/postgresql17-authelia.dump (falls extrahiert)
    • /mnt/user/backups/restore-lab/authelia/config/notifier/notifications.txt (Filesystem-Notifier-Ausgabe)
  • Testcontainer:
    • restoretest-authelia (Image-Pin wie Produktion)
    • restoretest-authelia-postgres (postgres:18.4, gleiche Major wie shared Postgres)
  • Testport: 127.0.0.1:19091:9091
  • Report-Ziel: /mnt/user/backups/restore-reports/authelia-YYYY-MM-DD.md

Schutzregeln

  • produktive Pfade /mnt/user/appdata/authelia/* werden nicht beschrieben
  • produktive Secret-Dateien /mnt/user/appdata/secrets/authelia_*.txt werden nicht gemountet
  • produktive shared PostgreSQL 18 wird nicht angesprochen (configuration.restoretest.yml zwingt storage auf Test-Postgres)
  • echter SMTP-Versand wird nicht ausgeloest (configuration.restoretest.yml zwingt notifier auf Filesystem)
  • produktive Domain auth.kaleschke.info wird nicht uebernommen
  • Testcontainer publishen nur auf 127.0.0.1, keine LAN-/Tailscale-Bindung
  • Borg-Passphrase wird aus /mnt/user/appdata/secrets/borg_repo_passphrase.txt gelesen und nirgendwo geloggt

Geplanter Ablauf

  1. Restore-Lab-Pfade leer anlegen
  2. local/appdata/authelia/config aus dem aktuellsten Borg-Archiv extrahieren
  3. optional local/borg-dumps/latest/postgresql17-authelia.dump extrahieren; wenn nicht im Archiv vorhanden, weiter ohne DB-Restore
  4. configuration.restoretest.yml aus der restaurierten configuration.yml erzeugen: produktive storage/notifier/session/JWT-Bloecke entfernen und Test-Werte anhaengen
  5. Test-Postgres mit ops/restore-tests/authelia-compose.test.yml hochfahren
  6. optional Dump per pg_restore -Fc --clean --if-exists --no-owner --no-privileges einspielen (mit transientem Retry wie im Immich-/Paperless-Test)
  7. authelia config validate gegen configuration.restoretest.yml laufen lassen
  8. restoretest-authelia starten und HTTP-Health http://127.0.0.1:19091/api/health pollen
  9. Report unter /mnt/user/backups/restore-reports/authelia-YYYY-MM-DD.md schreiben
  10. Testcontainer stoppen und Restore-Lab bereinigen (--keep-data ueberschreibt)

Smoke-Test

Minimal erfolgreich:

  • Borg-Extract der Authelia-Config gelingt
  • Test-Postgres startet healthy
  • authelia config validate laeuft ohne Fehler durch
  • HTTP 200 auf /api/health innerhalb 120 s

Optional spaeter:

  • vollstaendigen Auth-Flow gegen Test-User aus users_database.yml durchspielen
  • WebAuthn-Endpunkt /api/secondfactor/webauthn pruefen
  • ForwardAuth-Pfad gegen Mock-Backend testen

Bekannte Komplikationen

Risiko Beschreibung Mitigation
Sanitizing-Konflikt mit Originalkonfiguration configuration.yml definiert neue produktive Sections, die ersetzt werden muessen bei config validate-Fehler configuration.yml.original zum Vergleich pruefen; Strip-Liste oder Test-Block im Skript erweitern
SMTP-Startup-Check blockiert Start Wenn Authelia trotz disable_startup_check SMTP probiert Container-Logs lesen, ggf. Notifier-Block weiter haerten
Postgres-Schema-Drift nach Major-Update Authelia migriert Schema beim Start; Dump aus 17er-Cluster kann unter 18er andere Indexe brauchen Smoke ist DB-Schema-tolerant; bei Validierung Logs auf migration pruefen
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