#!/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}" # 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 # 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","*"]' # ── Initialize database ─────────────────────────────────────────────────────── echo "[1/3] Initializing database..." cd /app/backend python -c " from app.database.database import engine, Base import app.database.models Base.metadata.create_all(bind=engine) print(' Database tables ready') " # ── 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') " # ── 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