From 85f48907a40add1261efc9b70d9f78e49838a2a4 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 19 Mar 2026 08:26:09 +0100 Subject: [PATCH] fix: startup crash - init_db() jetzt mit Error-Handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROBLEM: - Backend crasht beim Start auf Prod - Login zeigt HTML statt JSON (Backend nicht erreichbar) - Ursache: init_db() wirft Exception beim Startup FIX: 1. startup_event() wrapped in try-except (non-fatal) 2. init_db() prüft ob ai_prompts Tabelle existiert 3. init_db() hat eigenen try-except 4. Bessere Fehlermeldungen in stdout ERGEBNIS: - Backend startet auch wenn init_db() fehlschlägt - Pipeline-Prompt kann manuell angelegt werden falls nötig - Login funktioniert wieder Co-Authored-By: Claude Opus 4.6 --- backend/main.py | 52 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/backend/main.py b/backend/main.py index 730665f..ec21ad1 100644 --- a/backend/main.py +++ b/backend/main.py @@ -43,7 +43,11 @@ AVATAR_COLORS = ['#1D9E75','#378ADD','#D85A30','#EF9F27','#7F77DD','#D4537E','#6 @app.on_event("startup") async def startup_event(): """Run migrations and initialization on startup.""" - init_db() + try: + init_db() + except Exception as e: + print(f"⚠️ init_db() failed (non-fatal): {e}") + # Don't crash on startup - pipeline prompt can be created manually def init_db(): """Initialize database - Schema is loaded by startup.sh""" @@ -51,23 +55,39 @@ def init_db(): # This function kept for backwards compatibility # Ensure "pipeline" master prompt exists - with get_db() as conn: - cur = get_cursor(conn) - cur.execute("SELECT COUNT(*) as count FROM ai_prompts WHERE slug='pipeline'") - if cur.fetchone()['count'] == 0: + try: + with get_db() as conn: + cur = get_cursor(conn) + # Check if table exists first cur.execute(""" - INSERT INTO ai_prompts (slug, name, description, template, active, sort_order) - VALUES ( - 'pipeline', - 'Mehrstufige Gesamtanalyse', - 'Master-Schalter für die gesamte Pipeline. Deaktiviere diese Analyse, um die Pipeline komplett zu verstecken.', - 'PIPELINE_MASTER', - true, - -10 - ) + SELECT EXISTS ( + SELECT FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name = 'ai_prompts' + ) as table_exists """) - conn.commit() - print("✓ Pipeline master prompt created") + if not cur.fetchone()['table_exists']: + print("⚠️ ai_prompts table doesn't exist yet - skipping pipeline prompt creation") + return + + cur.execute("SELECT COUNT(*) as count FROM ai_prompts WHERE slug='pipeline'") + if cur.fetchone()['count'] == 0: + cur.execute(""" + INSERT INTO ai_prompts (slug, name, description, template, active, sort_order) + VALUES ( + 'pipeline', + 'Mehrstufige Gesamtanalyse', + 'Master-Schalter für die gesamte Pipeline. Deaktiviere diese Analyse, um die Pipeline komplett zu verstecken.', + 'PIPELINE_MASTER', + true, + -10 + ) + """) + conn.commit() + print("✓ Pipeline master prompt created") + except Exception as e: + print(f"⚠️ Could not create pipeline prompt: {e}") + # Don't fail startup - prompt can be created manually # ── Helper: get profile_id from header ─────────────────────────────────────── def get_pid(x_profile_id: Optional[str] = Header(default=None)) -> str: