From 598677d3438ed03dea05ff2c5881c5f5d3b0b87e Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 4 Jul 2026 20:38:49 +0200 Subject: [PATCH] Deploy-Fix: Migrationen/Seeds im Entrypoint, laengere Healthcheck-Phase, Logs bei Fehler. Co-authored-by: Cursor --- .gitea/workflows/deploy-dev.yml | 9 +++-- backend/Dockerfile | 2 ++ backend/entrypoint.sh | 20 +++++++++++ backend/main.py | 33 ++++++++++--------- .../seed_001_cleanup_pytest_artifacts.dev.sql | 3 ++ docker-compose.dev-env.yml | 4 +-- 6 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 backend/entrypoint.sh diff --git a/.gitea/workflows/deploy-dev.yml b/.gitea/workflows/deploy-dev.yml index 770015c..99d4910 100644 --- a/.gitea/workflows/deploy-dev.yml +++ b/.gitea/workflows/deploy-dev.yml @@ -25,10 +25,15 @@ jobs: fi docker compose -f docker-compose.dev-env.yml build --no-cache backend frontend echo "✓ Backend + Frontend gebaut (Frontend: npm run build im Dockerfile)" - docker compose -f docker-compose.dev-env.yml up -d --wait + if ! docker compose -f docker-compose.dev-env.yml up -d --wait; then + echo "✗ compose up --wait fehlgeschlagen — Backend-Logs:" + docker compose -f docker-compose.dev-env.yml logs backend --tail 150 || true + docker compose -f docker-compose.dev-env.yml ps || true + exit 1 + fi if ! curl -sf http://localhost:8097/api/health; then echo "✗ DEV API nicht erreichbar — Backend-Logs:" - docker compose -f docker-compose.dev-env.yml logs backend --tail 120 || true + docker compose -f docker-compose.dev-env.yml logs backend --tail 150 || true exit 1 fi echo "✓ DEV API /api/health OK" diff --git a/backend/Dockerfile b/backend/Dockerfile index 1b87504..9039ee0 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -10,7 +10,9 @@ ENV PIP_DEFAULT_TIMEOUT=120 RUN pip install --no-cache-dir -r requirements.txt COPY . . +RUN chmod +x /app/entrypoint.sh EXPOSE 8000 +ENTRYPOINT ["/app/entrypoint.sh"] CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh new file mode 100644 index 0000000..b1506e3 --- /dev/null +++ b/backend/entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +echo "=== Kairo Backend Startup ===" + +if [ "${SKIP_DB_MIGRATE}" != "1" ] && [ "${SKIP_DB_MIGRATE}" != "true" ] && [ "${SKIP_DB_MIGRATE}" != "yes" ]; then + python run_migrations.py +else + echo "[SKIP_DB_MIGRATE] Migrationen übersprungen" +fi + +if [ "${SKIP_SEEDS}" != "1" ] && [ "${SKIP_SEEDS}" != "true" ] && [ "${SKIP_SEEDS}" != "yes" ]; then + python run_seeds.py +else + echo "[SKIP_SEEDS] Data-Seeds übersprungen" +fi + +export KAIRO_DB_READY=1 +echo "=== Starte Anwendung: $* ===" +exec "$@" diff --git a/backend/main.py b/backend/main.py index 3bac90e..2bd264f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -11,25 +11,26 @@ from fastapi.middleware.cors import CORSMiddleware from db import check_db from version import APP_NAME, APP_VERSION, DB_SCHEMA_VERSION -if os.getenv("SKIP_DB_MIGRATE", "").strip().lower() in ("1", "true", "yes"): - print("[SKIP_DB_MIGRATE] Migrationen übersprungen") -else: - import run_migrations +if os.getenv("KAIRO_DB_READY") != "1": + if os.getenv("SKIP_DB_MIGRATE", "").strip().lower() not in ("1", "true", "yes"): + import run_migrations - exit_code = run_migrations.main() - if exit_code != 0: - print(f"[FAIL] Migrationen fehlgeschlagen (Exit {exit_code})") - sys.exit(exit_code) + exit_code = run_migrations.main() + if exit_code != 0: + print(f"[FAIL] Migrationen fehlgeschlagen (Exit {exit_code})") + sys.exit(exit_code) + else: + print("[SKIP_DB_MIGRATE] Migrationen übersprungen") -if os.getenv("SKIP_SEEDS", "").strip().lower() not in ("1", "true", "yes"): - import run_seeds + if os.getenv("SKIP_SEEDS", "").strip().lower() not in ("1", "true", "yes"): + import run_seeds - exit_code = run_seeds.main() - if exit_code != 0: - print(f"[FAIL] Seeds fehlgeschlagen (Exit {exit_code})") - sys.exit(exit_code) -else: - print("[SKIP_SEEDS] Data-Seeds übersprungen") + exit_code = run_seeds.main() + if exit_code != 0: + print(f"[FAIL] Seeds fehlgeschlagen (Exit {exit_code})") + sys.exit(exit_code) + else: + print("[SKIP_SEEDS] Data-Seeds übersprungen") allowed_origins = [ origin.strip() diff --git a/backend/seeds/seed_001_cleanup_pytest_artifacts.dev.sql b/backend/seeds/seed_001_cleanup_pytest_artifacts.dev.sql index 25d422c..c52b7fa 100644 --- a/backend/seeds/seed_001_cleanup_pytest_artifacts.dev.sql +++ b/backend/seeds/seed_001_cleanup_pytest_artifacts.dev.sql @@ -1,6 +1,9 @@ -- Dev/CI: pytest-Artefakte entfernen (idempotent, sicher mehrfach ausführbar). -- Nur in Nicht-Prod-Umgebungen (Dateiname *.dev.sql). +-- Reparatur: ungültige Human-Actors (user_id NULL verletzt CHECK constraint) +DELETE FROM actors WHERE actor_type = 'human' AND user_id IS NULL; + -- Abhängigkeiten vor User-Löschung (human actors: user_id NOT NULL constraint) DELETE FROM actors WHERE user_id IN (SELECT id FROM users WHERE email ~* '@example\.com$'); diff --git a/docker-compose.dev-env.yml b/docker-compose.dev-env.yml index 160c621..b564283 100644 --- a/docker-compose.dev-env.yml +++ b/docker-compose.dev-env.yml @@ -54,8 +54,8 @@ services: ] interval: 10s timeout: 5s - retries: 12 - start_period: 30s + retries: 18 + start_period: 90s restart: unless-stopped networks: - dev-kairo-network