#!/bin/bash # ============================================================ # BankBot AI — Hugging Face Spaces startup script # Runs: DB init → optional seed → supervisord (nginx + fastapi + nextjs) # ============================================================ set -e echo "============================================" echo " BankBot AI — Starting on Hugging Face" echo "============================================" # ── Environment defaults ────────────────────────────────────────────────────── export PYTHONPATH="/app/backend" export PYTHONUNBUFFERED=1 # SQLite path inside the container (ephemeral but fine for HF demo) export SQLITE_PATH="${SQLITE_PATH:-/app/data/bankbot.db}" mkdir -p "$(dirname "$SQLITE_PATH")" 2>/dev/null || mkdir -p /app/data # If no DATABASE_URL set, force SQLite if [ -z "${DATABASE_URL:-}" ]; then echo "[INFO] No DATABASE_URL set — using SQLite at $SQLITE_PATH" export USE_SQLITE=true export DATABASE_URL="sqlite:///$SQLITE_PATH" fi # Ensure all env vars referenced in supervisord.conf are defined to prevent supervisord parsing crash export GROQ_API_KEY="${GROQ_API_KEY:-}" export OPENAI_API_KEY="${OPENAI_API_KEY:-}" export REDIS_URL="${REDIS_URL:-}" # If no Redis, the app auto-falls back to in-memory cache if [ -z "${REDIS_URL:-}" ]; then echo "[INFO] No REDIS_URL set — using in-memory cache" fi # JWT secret fallback (not secure for production, but keeps HF demo working) if [ -z "${JWT_SECRET_KEY:-}" ]; then export JWT_SECRET_KEY="hf-demo-secret-$(date +%s)" echo "[WARN] JWT_SECRET_KEY not set — using ephemeral secret (set in HF Secrets for persistence)" fi # CORS: allow HF Space domain + localhost export BACKEND_CORS_ORIGINS='["http://localhost:7860","http://localhost:3000","https://*.hf.space","*"]' # ── Log which AI backend is active ─────────────────────────────────────────── if [ -n "${OPENAI_API_KEY:-}" ]; then echo "[INFO] AI backend: OpenAI (key detected)" elif [ -n "${GROQ_API_KEY:-}" ]; then echo "[INFO] AI backend: Groq (key detected)" else echo "[WARN] No AI API key set — AI will use offline fallback. Set GROQ_API_KEY in HF Secrets for live AI." fi # ── Initialize database ─────────────────────────────────────────────────────── echo "[1/3] Initializing database..." cd /app/backend python -c " from app.database.database import engine, Base import app.database.models from app.database.chat_migrate import migrate_chat_schema Base.metadata.create_all(bind=engine) migrate_chat_schema() print(' Database tables ready') " || { echo "[WARN] DB init had errors — continuing"; } # ── Seed demo data (only if DB is empty) ───────────────────────────────────── echo "[2/3] Checking demo data..." python -c " import os, sys sys.path.insert(0, '/app/backend') from app.database.database import SessionLocal from app.database.models import User db = SessionLocal() count = db.query(User).count() db.close() if count == 0: print(' Seeding demo account...') # Import and run seed import subprocess result = subprocess.run( ['python', 'app/scripts/seed_demo.py'], cwd='/app/backend', capture_output=True, text=True ) print(result.stdout[-500:] if result.stdout else '') if result.returncode != 0: print(f' Seed warning: {result.stderr[-200:]}') else: print(' Demo account ready: alex@bankbot.dev / BankBot2026!') else: print(f' Database has {count} users — skipping seed') " || echo "[WARN] Seed check failed — continuing" # ── Start all services via supervisord ─────────────────────────────────────── echo "[3/3] Starting services (Nginx + FastAPI + Next.js)..." echo " Frontend: http://localhost:3000" echo " Backend: http://localhost:8000" echo " Public: http://localhost:7860" echo "============================================" exec /usr/bin/supervisord -c /etc/supervisor/conf.d/bankbot.conf