#!/bin/bash set -e echo "=== Lumea Health Platform - Starting ===" # Run database migrations (best-effort) echo "Running database migrations..." python -m alembic upgrade head 2>&1 || echo "Warning: Alembic migrations failed (tables may already exist or DB not ready). Continuing..." # --------------------------------------------------------------------------- # Schema patch: ensure all columns the app expects actually exist in the DB. # Alembic may fail silently (e.g. pgcrypto extension, SSL issues), leaving # the schema out of date. This idempotent patch uses ADD COLUMN IF NOT EXISTS. # --------------------------------------------------------------------------- echo "Running schema patch (ADD COLUMN IF NOT EXISTS)..." python -c " import os, sys sys.path.insert(0, '.') db_url = os.environ.get('DATABASE_URL', '') if not db_url: print('No DATABASE_URL set — skipping schema patch') sys.exit(0) # Convert asyncpg URL to sync psycopg2 URL sync_url = db_url.replace('postgresql+asyncpg://', 'postgresql://').replace('ssl=require', 'sslmode=require') try: import sqlalchemy engine = sqlalchemy.create_engine(sync_url, pool_pre_ping=True) with engine.connect() as conn: # -- reports table: columns added by model but possibly missing from DB -- patches = [ 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS category VARCHAR(50)', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS doc_type VARCHAR(50)', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS classification_confidence FLOAT', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS classification_rules_matched JSONB', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS raw_text TEXT', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS extraction_method VARCHAR', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS extraction_source VARCHAR(20)', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS page_stats JSON', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS extracted_data JSON', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS extraction_confidence FLOAT', 'ALTER TABLE reports ADD COLUMN IF NOT EXISTS error_message TEXT', # -- observations table -- 'ALTER TABLE observations ADD COLUMN IF NOT EXISTS source VARCHAR(20)', 'ALTER TABLE observations ADD COLUMN IF NOT EXISTS confidence FLOAT', 'ALTER TABLE observations ADD COLUMN IF NOT EXISTS user_corrected BOOLEAN DEFAULT FALSE', 'ALTER TABLE observations ADD COLUMN IF NOT EXISTS display_name VARCHAR', ] for sql in patches: try: conn.execute(sqlalchemy.text(sql)) except Exception as col_err: print(f' patch skipped: {col_err}') conn.commit() print('Schema patch applied successfully') except Exception as e: print(f'Warning: Schema patch failed: {e}. Continuing...') " 2>&1 || echo "Warning: Schema patch skipped. Continuing..." # Seed generic medicine catalog (Jan Aushadhi + generics) — idempotent, skips if already seeded echo "Seeding generic medicine catalog..." python -c " import asyncio, os, sys sys.path.insert(0, '.') try: from scripts.seed_generic_catalog import seed_database db_url = os.environ.get('DATABASE_URL', 'postgresql+asyncpg://ggw:ggwpassword@localhost:5432/ggwdb') asyncio.run(seed_database(db_url)) except Exception as e: print(f'Warning: Medicine catalog seeding failed: {e}. Continuing...') " 2>&1 || echo "Warning: Medicine catalog seeding skipped. Continuing..." echo "Starting FastAPI server on port 7860..." exec uvicorn app.main:app --host 0.0.0.0 --port 7860