5.6 KiB
5.6 KiB
Immich Restore Test Plan
Ziel
Nachweisen, dass immich.dump aus dem produktiven Borg-Archiv in einer isolierten Testumgebung wieder einspielbar ist und Immich-Server damit anlaufen, einloggen und Asset-Metadaten anzeigen kann.
Bewusst nicht Teil dieses Tests:
- Wiederherstellung produktiver Foto-Dateien aus
/mnt/user/photos/immichund/mnt/user/photos/family_archive. Der Smoke-Test bleibt DB-/UI-zentriert. - Machine-Learning-Container. Spart Image-Pull-Zeit und Resource-Last; ML-Features sind im Smoke-Test nicht erforderlich.
- Echte Browser-Login-Sequenz. Smoke-Test prueft nur, dass die Login-Seite ausgeliefert wird und die DB-Tabellen
assetund"user"lesbar sind.
Quelle
- Backup-Quelle: produktives Borg-Archiv (
hetzner_borg_appdata_criticaloder lokales Mirror) - fachlich relevanter Dump im Archiv:
local/borg-dumps/latest/immich.dump
- Erzeuger:
ops/borg-ui/scripts/pre-backup-dumps.sh, Funktiondump_pg_db immich_postgres ... immich immichmitpg_dump -Fc - produktive Foto-Pfade werden im Smoke-Test bewusst nicht angefasst
Test-Ziel
- Restore-Lab:
/mnt/user/backups/restore-lab/immich - Testdatenpfade:
/mnt/user/backups/restore-lab/immich/postgres(Test-Postgres-Datadir)/mnt/user/backups/restore-lab/immich/upload(leeres Upload-Volume, Immich-Server braucht den Pfad nur als Mountpoint)/mnt/user/backups/restore-lab/immich/dumps/latest/immich.dump(extrahierter Dump)
- Testcontainer:
restoretest-immich-serverrestoretest-immich-postgres(ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0- identisch zur Produktion, weil VectorChord-Backups ein Image mit VectorChord brauchen)restoretest-immich-redis(redis:8.8.0-alpine, rebuildbar)
- Testport Web:
127.0.0.1:12283:2283 - Report-Ziel:
/mnt/user/backups/restore-reports/immich-YYYY-MM-DD.md
Schutzregeln
- produktive Pfade
/mnt/user/photos/immichund/mnt/user/photos/family_archivewerden nicht in den Test-Container gemountet - produktive Domain
immich.kaleschke.infowird nicht uebernommen - keine Traefik-Labels fuer die Testinstanz
- keine produktive
immich_postgres-/immich_redis-Instanz fuer den Test verwenden - ML-Container bleibt weg
- Testcontainer publishen nur auf
127.0.0.1, nicht auf LAN- oder Tailscale-Interface - Borg-Passphrase wird aus
/mnt/user/appdata/secrets/borg_repo_passphrase.txtgelesen und niemals in Logs, Reports oder Doku geschrieben
Geplanter Ablauf
- Restore-Ziel unter
/mnt/user/backups/restore-lab/immichvorbereiten (postgres, upload, dumps/latest) local/borg-dumps/latest/immich.dumpaus dem aktuellsten Borg-Archiv extrahieren- Test-Postgres (Immich-Postgres mit VectorChord) und Test-Redis mit
ops/restore-tests/immich-compose.test.ymlstarten immich.dumpin Test-Postgres importieren (pg_restore -Fc --clean --if-exists --no-owner --no-privileges)- Testinstanz
restoretest-immich-serverstarten - lokalen Smoke-Test gegen
http://127.0.0.1:12283ausfuehren und Asset/User-Count aus DB lesen - Report unter
/mnt/user/backups/restore-reports/immich-YYYY-MM-DD.mdschreiben - Testcontainer stoppen und Restore-Lab bereinigen
Smoke-Test
Minimal erfolgreich:
- Test-Postgres startet
healthy pg_restore -Fclaeuft ohne Fehler durch- Immich-Server liefert HTTP
200,302oder303auf/ - Response enthaelt mindestens einen der Marker
Immich,Login,Signin select count(*) from asset;undselect count(*) from "user";sind lesbar
Optional spaeter:
- Echte Login-Form via API ansprechen
- VectorChord-/pgvector-Extensions explizit per
\dxpruefen - Test mit gemountetem read-only Foto-Sample-Pfad und Thumbnail-Rendering
- Test inkl. ML-Container, sobald genug Test-Ressourcen verfuegbar
Bekannte Komplikationen
| Risiko | Beschreibung | Mitigation |
|---|---|---|
| Dump-Groesse unbekannt | pg_dump -Fc der Immich-DB kann je nach Asset-/Face-Tabellen mehrere GB sein |
Erster Lauf bewusst mit --what-if, anschliessend Operator-Test mit Zeitmessung |
pg_restore-Dauer unbekannt |
Index-/Constraint-Aufbau und VectorChord-Index-Build koennen lange dauern | Test-Postgres mit Health-Polling startet; Lauf nicht abbrechen ohne pg_restore-Exit |
| VectorChord-/pgvector-Extension-Mismatch | Wenn das Test-Postgres-Image nicht zu Produktion passt, kann der Restore oder Immich-Start fehlschlagen | Compose pinnt denselben Digest wie apps/immich/docker-compose.yml |
| Immich-Server-Migrations beim Start | Immich fuehrt beim ersten Start DB-Migrations aus; das kann nach Restore noch laufen, bevor Web-UI antwortet | Smoke-Test pollt HTTP bis zu 120 s, bevor er als Fehler markiert |
| Asset-Files fehlen | Der Test mountet kein Foto-Volume; Immich zeigt "missing" auf Asset-Detail-Seiten | Smoke-Test prueft nur Login-Page und DB-Counts, nicht Asset-Rendering |
| ML-Endpoint unreachable | Immich-Server kann ML-Endpoint nicht erreichen | IMMICH_MACHINE_LEARNING_URL zeigt bewusst auf einen nicht erreichbaren Hostnamen; Login bleibt funktional, ML-Features bleiben deaktiviert |
Noch offen vor dem ersten echten Lauf
- Dump-Groesse
immich.dumpauf dem Host bestimmen (ls -lh /mnt/user/backups/borg/dumps/latest/immich.dump) - Erwartete Restore-Dauer durch ersten Lauf mit
--keep-datamessen - Pruefen, ob die Immich-Tabellen
assets/usersim aktuellen Schema noch existieren (Schema-Drift bei Major-Update wuerde die Asset-Count-Query brechen, das Skript faengt das tolerant ab) - Schedule-Eintrag in
ops/restore-tests/schedule.md: aktuell ist Immich nur als "spaeter, eigener Sprint" gefuehrt. Erst nach erstem erfolgreichen Lauf in Schedule aufnehmen, z. B. quartalsweise.