BankBot-AI / hf /start.sh
mohsin-devs's picture
Deploy to HF
a282d4b
#!/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