Responder findings (04:12, outage mode). NO restart/up/exec performed.
Root cause: the coatrack app container (image dragonhive-coatrack-coatrack) is crash-looping (restarts=40, exit 1, oomkilled=false). Every start fails in /app/migrate.py -> sqlalchemy create_engine with "ModuleNotFoundError: No module named 'psycopg'". The DATABASE_URL uses SQLAlchemy's psycopg (v3) dialect, but the built image doesn't include the psycopg package. This most likely comes from upstream commit 660060ce -> 25369277, which was pulled and built at 03:34 (a dependency/driver change in requirements or the DB URL). The rollback at 03:40 didn't recover: the restored container still fails the same way. Either the rollback reused the newly built image tag, or it didn't rebuild from the previous commit.
Postgres (coatrack-postgres) is up and healthy. The app reaches it fine ("PostgreSQL is ready!"). There are no disk, OOM or DB problems.
Why I didn't act: a restart re-runs the same image and fails the same way. Emergency exec is out of scope (exec_services/host paths are empty). Installing packages into a running container would also be lost on recreation. Health checked twice: HTTP 000 / curl exit 60 (TLS certificate verification failure). This is probably the reverse proxy's fallback because the backend is down, but a human should confirm that the cert itself hasn't expired.
Human fix: in the dragonhive-coatrack source, add psycopg (e.g. psycopg[binary]) to requirements, or set DATABASE_URL to the installed driver (e.g. postgresql+psycopg2:// if psycopg2 is present). Then rebuild (docker compose build --no-cache coatrack && docker compose up -d). Alternatively, check out 660060ce, rebuild, and pin it until upstream is fixed. NOTE: the DB password is printed in plaintext in the app logs by migrate.py. Consider rotating it and reporting this upstream.