diff --git a/ops/restore-tests/immich-restore-test.sh b/ops/restore-tests/immich-restore-test.sh index 62d9fdf..f8b643c 100755 --- a/ops/restore-tests/immich-restore-test.sh +++ b/ops/restore-tests/immich-restore-test.sh @@ -97,15 +97,47 @@ done # gewuenschte Datenbank noch im Entrypoint entsteht. Der Smoke-Test legt # die isolierte Test-DB deshalb defensiv an und akzeptiert nur das Rennen, # in dem die DB parallel bereits erzeugt wurde. -docker exec restoretest-immich-postgres sh -lc \ - 'createdb -U immich immich 2>/tmp/immich-createdb.err || grep -q "already exists" /tmp/immich-createdb.err' +db_ok=0 +for attempt in $(seq 1 12); do + if docker exec restoretest-immich-postgres sh -lc \ + 'createdb -U immich immich 2>/tmp/immich-createdb.err || grep -q "already exists" /tmp/immich-createdb.err'; then + db_ok=1 + break + fi + sleep 5 +done -# Stufe 2: Dump in Test-Postgres importieren -# Hinweis: pg_restore mit --clean --if-exists, damit die Operation idempotent ist. -# --no-owner / --no-privileges, weil im Test-Postgres kein produktiver User existiert. -docker exec -i restoretest-immich-postgres \ - pg_restore -U immich -d immich --clean --if-exists --no-owner --no-privileges \ - < "$RESTORE_ROOT/dumps/latest/immich.dump" +if [ "$db_ok" -ne 1 ]; then + docker exec restoretest-immich-postgres sh -lc 'cat /tmp/immich-createdb.err >&2' || true + exit 1 +fi + +# Stufe 2: Dump in Test-Postgres importieren. +# Der Postgres-Entrypoint kann kurz nach "ready" noch vom Init-Server auf +# den finalen Server wechseln; pg_restore toleriert deshalb nur transiente +# Start-/Shutdown-Fehler und versucht danach erneut. +restore_ok=0 +for attempt in $(seq 1 12); do + if docker exec -i restoretest-immich-postgres \ + pg_restore -U immich -d immich --clean --if-exists --no-owner --no-privileges \ + < "$RESTORE_ROOT/dumps/latest/immich.dump" 2>/tmp/immich-pg-restore.err; then + restore_ok=1 + break + fi + + if grep -qiE "starting up|shutting down|connection refused|database .* does not exist" /tmp/immich-pg-restore.err; then + sleep 5 + continue + fi + + cat /tmp/immich-pg-restore.err >&2 + exit 1 +done + +if [ "$restore_ok" -ne 1 ]; then + cat /tmp/immich-pg-restore.err >&2 + exit 1 +fi # Stufe 3: Immich-Server starten (ohne ML) docker compose -f "$COMPOSE_FILE" up -d restoretest-immich-server >/dev/null