fix(restore): generate minimal authelia smoke config
This commit is contained in:
@@ -7,7 +7,7 @@ Nachweisen, dass die Authelia-Konfiguration aus dem produktiven Borg-Archiv in e
|
|||||||
Bewusst **nicht** Teil dieses Tests:
|
Bewusst **nicht** Teil dieses Tests:
|
||||||
|
|
||||||
- Restore mit produktiven Authelia-Secrets. Der Test nutzt ausschliesslich Wegwerf-Werte fuer `AUTHELIA_SESSION_SECRET`, `AUTHELIA_STORAGE_ENCRYPTION_KEY` und `AUTHELIA_STORAGE_POSTGRES_PASSWORD`. SMTP- und Legacy-JWT-Env-Werte werden bewusst nicht gesetzt, damit Authelia keinen `notifier.smtp`-Block oder deprecated `jwt_secret` aus Env erzeugt.
|
- Restore mit produktiven Authelia-Secrets. Der Test nutzt ausschliesslich Wegwerf-Werte fuer `AUTHELIA_SESSION_SECRET`, `AUTHELIA_STORAGE_ENCRYPTION_KEY` und `AUTHELIA_STORAGE_POSTGRES_PASSWORD`. SMTP- und Legacy-JWT-Env-Werte werden bewusst nicht gesetzt, damit Authelia keinen `notifier.smtp`-Block oder deprecated `jwt_secret` aus Env erzeugt.
|
||||||
- SMTP-Realanruf an GMX. Notifier wird in der Test-Konfiguration auf Filesystem umgebogen.
|
- SMTP-Realanruf an GMX. Die minimale Test-Konfiguration setzt nur den Filesystem-Notifier.
|
||||||
- Forward-Auth gegen Traefik. Test laeuft nur auf `127.0.0.1:19091`, keine Traefik-Route.
|
- 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`.
|
- WebAuthn-/Duo-/OIDC-Identity-Provider-Endpunkte. Smoke prueft `/api/health`.
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ Bewusst **nicht** Teil dieses Tests:
|
|||||||
- Restore-Lab: `/mnt/user/backups/restore-lab/authelia`
|
- Restore-Lab: `/mnt/user/backups/restore-lab/authelia`
|
||||||
- Testdatenpfade:
|
- Testdatenpfade:
|
||||||
- `/mnt/user/backups/restore-lab/authelia/config` (restaurierte Originalkonfiguration + `configuration.yml.original`)
|
- `/mnt/user/backups/restore-lab/authelia/config` (restaurierte Originalkonfiguration + `configuration.yml.original`)
|
||||||
- `/mnt/user/backups/restore-lab/authelia/test-config` (Runtime-Mount mit sanitizter `configuration.yml`)
|
- `/mnt/user/backups/restore-lab/authelia/test-config` (Runtime-Mount mit minimaler Test-`configuration.yml`)
|
||||||
- `/mnt/user/backups/restore-lab/authelia/postgres` (Test-Postgres-Datadir)
|
- `/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/dumps/latest/postgresql17-authelia.dump` (falls extrahiert)
|
||||||
- `/mnt/user/backups/restore-lab/authelia/test-config/notifier/notifications.txt` (Filesystem-Notifier-Ausgabe)
|
- `/mnt/user/backups/restore-lab/authelia/test-config/notifier/notifications.txt` (Filesystem-Notifier-Ausgabe)
|
||||||
@@ -38,8 +38,8 @@ Bewusst **nicht** Teil dieses Tests:
|
|||||||
|
|
||||||
- produktive Pfade `/mnt/user/appdata/authelia/*` werden **nicht** beschrieben
|
- produktive Pfade `/mnt/user/appdata/authelia/*` werden **nicht** beschrieben
|
||||||
- produktive Secret-Dateien `/mnt/user/appdata/secrets/authelia_*.txt` werden **nicht** gemountet
|
- produktive Secret-Dateien `/mnt/user/appdata/secrets/authelia_*.txt` werden **nicht** gemountet
|
||||||
- produktive shared PostgreSQL 18 wird **nicht** angesprochen (`test-config/configuration.yml` zwingt `storage` auf Test-Postgres)
|
- produktive shared PostgreSQL 18 wird **nicht** angesprochen (`test-config/configuration.yml` definiert nur Test-Postgres)
|
||||||
- echter SMTP-Versand wird **nicht** ausgeloest (`test-config/configuration.yml` zwingt `notifier` auf Filesystem)
|
- echter SMTP-Versand wird **nicht** ausgeloest (`test-config/configuration.yml` definiert nur Filesystem-Notifier)
|
||||||
- produktive Domain `auth.kaleschke.info` wird **nicht** uebernommen
|
- produktive Domain `auth.kaleschke.info` wird **nicht** uebernommen
|
||||||
- Testcontainer publishen nur auf `127.0.0.1`, keine LAN-/Tailscale-Bindung
|
- 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
|
- Borg-Passphrase wird aus `/mnt/user/appdata/secrets/borg_repo_passphrase.txt` gelesen und nirgendwo geloggt
|
||||||
@@ -49,7 +49,7 @@ Bewusst **nicht** Teil dieses Tests:
|
|||||||
1. Restore-Lab-Pfade leer anlegen
|
1. Restore-Lab-Pfade leer anlegen
|
||||||
2. `local/appdata/authelia/config` aus dem aktuellsten Borg-Archiv extrahieren
|
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
|
3. optional `local/borg-dumps/latest/postgresql17-authelia.dump` extrahieren; wenn nicht im Archiv vorhanden, weiter ohne DB-Restore
|
||||||
4. `test-config/configuration.yml` aus der restaurierten `configuration.yml` erzeugen: produktive `storage`/`notifier`/`session`/JWT-Bloecke entfernen und Test-Werte anhaengen
|
4. minimale `test-config/configuration.yml` erzeugen; restaurierte Begleitdateien wie `users_database.yml` bleiben im Runtime-Mount, produktive externe Abhaengigkeiten werden nicht uebernommen
|
||||||
5. Test-Postgres mit `ops/restore-tests/authelia-compose.test.yml` hochfahren
|
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)
|
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 `test-config/configuration.yml` laufen lassen
|
7. `authelia config validate` gegen `test-config/configuration.yml` laufen lassen
|
||||||
@@ -76,7 +76,7 @@ Optional spaeter:
|
|||||||
|
|
||||||
| Risiko | Beschreibung | Mitigation |
|
| 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 |
|
| Testkonfig-Schema-Drift | Authelia erwartet nach Upgrade andere Keys in der Minimal-Konfig | bei `config validate`-Fehler Test-Block im Skript anpassen |
|
||||||
| SMTP-Startup-Check blockiert Start | Wenn Authelia trotz `disable_startup_check` SMTP probiert | Container-Logs lesen, ggf. Notifier-Block weiter haerten |
|
| 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 |
|
| 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 |
|
| identity_validation Schema-Drift | Aelteres/neueres Authelia-Schema erwartet andere Keys | Validate-Config Output lesen, ggf. Test-Block anpassen |
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ set -euo pipefail
|
|||||||
#
|
#
|
||||||
# Nicht-destruktiver Restore-Smoke-Test fuer Authelia.
|
# Nicht-destruktiver Restore-Smoke-Test fuer Authelia.
|
||||||
# - extrahiert die Authelia-Config aus dem produktiven Borg-Archiv
|
# - extrahiert die Authelia-Config aus dem produktiven Borg-Archiv
|
||||||
# - patcht in einer Restore-Lab-Kopie der configuration.yml die
|
# - erzeugt eine minimale Test-Konfiguration, die restaurierte Begleitdateien
|
||||||
# externen Abhaengigkeiten (storage = lokales Test-Postgres,
|
# wie users_database.yml nutzt, aber produktive externe Abhaengigkeiten
|
||||||
# notifier = Filesystem-Notifier, identity_validation auf Test-Werte)
|
# durch Test-Backends ersetzt
|
||||||
# - importiert optional den shared-Postgres-Dump fuer Authelia
|
# - importiert optional den shared-Postgres-Dump fuer Authelia
|
||||||
# - validiert die gepatchte Konfiguration mit `authelia config validate`
|
# - validiert die Test-Konfiguration mit `authelia config validate`
|
||||||
# - startet einen isolierten Authelia-Container ohne Traefik
|
# - startet einen isolierten Authelia-Container ohne Traefik
|
||||||
# - prueft den HTTP-Health-Endpunkt
|
# - prueft den HTTP-Health-Endpunkt
|
||||||
# - bereinigt anschliessend
|
# - bereinigt anschliessend
|
||||||
@@ -112,10 +112,10 @@ if borg_extract "/restore/authelia-extract" "local/borg-dumps/latest/postgresql1
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Stufe 3: configuration.yml im Restore-Lab gezielt fuer den Test sanitizen.
|
# Stufe 3: Minimale Test-Konfiguration erzeugen.
|
||||||
# Wir entfernen produktive Top-Level-Bloecke, die im Test andere Backends
|
# Die restaurierte Originalkonfig bleibt als Diagnosematerial erhalten. Der
|
||||||
# brauchen, und haengen danach Test-Definitionen an. So verlassen wir uns
|
# Smoke nutzt bewusst eine neu geschriebene Test-Config, damit keine produktiven
|
||||||
# nicht darauf, dass ein Overlay alte Map-Keys wie notifier.smtp loescht.
|
# Blocks (SMTP, echtes Postgres, Session/JWT-Altkeys) hineinmergen koennen.
|
||||||
ORIGINAL_CONFIG_FILE="$RESTORED_CONFIG_DIR/configuration.yml"
|
ORIGINAL_CONFIG_FILE="$RESTORED_CONFIG_DIR/configuration.yml"
|
||||||
TEST_CONFIG_FILE="$TEST_CONFIG_DIR/configuration.yml"
|
TEST_CONFIG_FILE="$TEST_CONFIG_DIR/configuration.yml"
|
||||||
if [ ! -f "$ORIGINAL_CONFIG_FILE" ]; then
|
if [ ! -f "$ORIGINAL_CONFIG_FILE" ]; then
|
||||||
@@ -124,33 +124,52 @@ if [ ! -f "$ORIGINAL_CONFIG_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Kopiere alle Begleitdateien (z. B. users_database.yml) in einen separaten
|
# Kopiere alle Begleitdateien (z. B. users_database.yml) in einen separaten
|
||||||
# Runtime-Mount. Die produktive configuration.yml selbst wird dort durch die
|
# Runtime-Mount. configuration.yml wird danach vollstaendig neu geschrieben.
|
||||||
# sanitizte Testkonfiguration ersetzt, damit Authelia keine Default-Config mit
|
|
||||||
# produktivem notifier.smtp nachladen kann.
|
|
||||||
cp -a "$RESTORED_CONFIG_DIR/." "$TEST_CONFIG_DIR/"
|
cp -a "$RESTORED_CONFIG_DIR/." "$TEST_CONFIG_DIR/"
|
||||||
cp "$ORIGINAL_CONFIG_FILE" "$RESTORED_CONFIG_DIR/configuration.yml.original"
|
cp "$ORIGINAL_CONFIG_FILE" "$RESTORED_CONFIG_DIR/configuration.yml.original"
|
||||||
|
|
||||||
# Entferne produktive Blocks, die der Restore-Smoke bewusst ersetzt.
|
cat > "$TEST_CONFIG_FILE" <<'YAML'
|
||||||
awk '
|
---
|
||||||
/^[A-Za-z_][A-Za-z0-9_]*:/ {
|
# Minimal-Konfiguration nur fuer den Restore-Smoke.
|
||||||
key = $0
|
|
||||||
sub(/:.*/, "", key)
|
|
||||||
skip = (key == "storage" || key == "notifier" || key == "session" || key == "identity_validation" || key == "jwt_secret")
|
|
||||||
}
|
|
||||||
!skip { print }
|
|
||||||
' "$ORIGINAL_CONFIG_FILE" > "$TEST_CONFIG_FILE"
|
|
||||||
|
|
||||||
cat >> "$TEST_CONFIG_FILE" <<'YAML'
|
theme: dark
|
||||||
|
|
||||||
# Restore-Smoke-Test-Backends. Produktive externe Abhaengigkeiten sind oben
|
server:
|
||||||
# entfernt und werden hier mit isolierten Test-Werten ersetzt.
|
address: tcp://0.0.0.0:9091
|
||||||
|
|
||||||
|
log:
|
||||||
|
level: info
|
||||||
|
|
||||||
|
authentication_backend:
|
||||||
|
file:
|
||||||
|
path: /config/users_database.yml
|
||||||
|
password:
|
||||||
|
algorithm: argon2id
|
||||||
|
iterations: 3
|
||||||
|
key_length: 32
|
||||||
|
salt_length: 16
|
||||||
|
memory: 65536
|
||||||
|
parallelism: 4
|
||||||
|
|
||||||
|
access_control:
|
||||||
|
default_policy: bypass
|
||||||
|
|
||||||
|
regulation:
|
||||||
|
max_retries: 3
|
||||||
|
find_time: 2m
|
||||||
|
ban_time: 5m
|
||||||
|
|
||||||
|
totp:
|
||||||
|
issuer: kaleschke.info
|
||||||
|
period: 30
|
||||||
|
skew: 1
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
postgres:
|
postgres:
|
||||||
address: tcp://restoretest-authelia-postgres:5432
|
address: tcp://restoretest-authelia-postgres:5432
|
||||||
database: authelia
|
database: authelia
|
||||||
username: authelia
|
username: authelia
|
||||||
# Passwort kommt ueber AUTHELIA_STORAGE_POSTGRES_PASSWORD ENV
|
# Passwort kommt ueber AUTHELIA_STORAGE_POSTGRES_PASSWORD ENV.
|
||||||
|
|
||||||
notifier:
|
notifier:
|
||||||
disable_startup_check: true
|
disable_startup_check: true
|
||||||
@@ -207,7 +226,7 @@ if [ "$dump_available" -eq 1 ]; then
|
|||||||
dump_status="restored"
|
dump_status="restored"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Stufe 6: config validate im Container-Kontext, gegen sanitizte Test-Config
|
# Stufe 6: config validate im Container-Kontext, gegen minimale Test-Config
|
||||||
validate_status="ok"
|
validate_status="ok"
|
||||||
if ! docker run --rm \
|
if ! docker run --rm \
|
||||||
-e AUTHELIA_SESSION_SECRET=restoretest-authelia-session-secret-placeholder-32 \
|
-e AUTHELIA_SESSION_SECRET=restoretest-authelia-session-secret-placeholder-32 \
|
||||||
|
|||||||
@@ -56,10 +56,10 @@ Minimal erwartet im Report:
|
|||||||
|
|
||||||
| Symptom | Ursache | Massnahme |
|
| Symptom | Ursache | Massnahme |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `config validate` failt mit `notifier` Block | Produktive Notifier-Map wurde nicht sauber aus der Testkonfig entfernt | Originalkonfig pruefen unter `restore-lab/authelia/config/configuration.yml.original`; Strip-Liste oder Test-Block im Skript anpassen |
|
| `config validate` failt mit `notifier` Block | Testkonfig enthaelt mehr als einen Notifier | `test-config/configuration.yml` pruefen; Minimal-Test-Block im Skript anpassen |
|
||||||
| `config validate` failt mit `session.domain` | aelteres/neueres Schema | Test-`session:`-Block an reales Authelia-Schema anpassen |
|
| `config validate` failt mit `session.domain` | aelteres/neueres Schema | Test-`session:`-Block an reales Authelia-Schema anpassen |
|
||||||
| HTTP-Timeout 120 s | Authelia haengt in Postgres-Schema-Migration | `docker logs --tail 200 restoretest-authelia` lesen, ggf. Wartezeit erhoehen |
|
| HTTP-Timeout 120 s | Authelia haengt in Postgres-Schema-Migration | `docker logs --tail 200 restoretest-authelia` lesen, ggf. Wartezeit erhoehen |
|
||||||
| SMTP-Connect im Log | Produktiver Notifier-Block wurde nicht sauber entfernt | `test-config/configuration.yml` auf `smtp:` pruefen und Strip-Liste haerten |
|
| SMTP-Connect im Log | Testkonfig oder Env erzeugt unerwartet SMTP | `test-config/configuration.yml` und `AUTHELIA_*SMTP*` Env pruefen |
|
||||||
| `pg_restore` failt mit Schema-Drift | Dump aus 17er-Cluster, 18er Image braucht andere Initialisierung | Schritt als optional dokumentiert; Smoke ohne Dump akzeptieren und Issue nachverfolgen |
|
| `pg_restore` failt mit Schema-Drift | Dump aus 17er-Cluster, 18er Image braucht andere Initialisierung | Schritt als optional dokumentiert; Smoke ohne Dump akzeptieren und Issue nachverfolgen |
|
||||||
|
|
||||||
## Cleanup
|
## Cleanup
|
||||||
|
|||||||
Reference in New Issue
Block a user