From 1a57f33606c0d6bdad131648ea30003272686f6f Mon Sep 17 00:00:00 2001 From: busya Date: Tue, 26 May 2026 19:58:31 +0300 Subject: [PATCH] fix: handle legacy databases in entrypoint Alembic migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three-way detection in entrypoint: - alembic_version exists → normal incremental upgrade - no tables → fresh upgrade from scratch - tables exist but no alembic_version → stamp head (legacy DB created by create_all(), mark all migrations as current without running them) This fixes 'relation already exists' errors when Alembic tries to CREATE TABLE on databases that already have tables from previous deployments. --- docker/backend.entrypoint.sh | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/docker/backend.entrypoint.sh b/docker/backend.entrypoint.sh index 564c9b82..eab4441e 100755 --- a/docker/backend.entrypoint.sh +++ b/docker/backend.entrypoint.sh @@ -151,9 +151,33 @@ install_playwright() { install_certificates install_playwright -echo "[entrypoint] Running Alembic migrations..." -alembic upgrade head 2>&1 | sed 's/^/[entrypoint] /' -echo "[entrypoint] ✅ Alembic migrations applied" +# Check DB state: empty, legacy (tables exist but no alembic), or managed +python3 -c " +import os +from sqlalchemy import create_engine, inspect +e = create_engine(os.environ['DATABASE_URL']) +insp = inspect(e) +if 'alembic_version' in insp.get_table_names(): + exit(0) # managed → normal upgrade +if not insp.get_table_names(): + exit(1) # empty → fresh upgrade +exit(2) # legacy → stamp head +" 2>/dev/null +_db_state=$? + +if [ $_db_state -eq 0 ]; then + echo "[entrypoint] Running Alembic migrations (incremental)..." + alembic upgrade head 2>&1 | sed 's/^/[entrypoint] /' + echo "[entrypoint] ✅ Alembic migrations applied" +elif [ $_db_state -eq 1 ]; then + echo "[entrypoint] Empty database — running full Alembic upgrade..." + alembic upgrade head 2>&1 | sed 's/^/[entrypoint] /' + echo "[entrypoint] ✅ Alembic initial migration applied" +else + echo "[entrypoint] Legacy database — stamping Alembic head (tables already exist)..." + alembic stamp head 2>&1 | sed 's/^/[entrypoint] /' + echo "[entrypoint] ✅ Alembic stamped head, schema assumed up to date" +fi bootstrap_admin