| set -e | |
| # 1. Start FastAPI backend in the background | |
| echo "Starting Backend (FastAPI) on port 8001..." | |
| uvicorn app.main:app --host 0.0.0.0 --port 8001 & | |
| # 2. Dynamic Health Check: Wait for backend to be ready | |
| # Uses Python's urllib (built-in) instead of curl — curl not available in python:slim | |
| echo "Waiting for backend to warm up..." | |
| MAX_RETRIES=60 | |
| RETRY_COUNT=0 | |
| while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do | |
| if python3 -c " | |
| import urllib.request, sys | |
| try: | |
| urllib.request.urlopen('http://localhost:8001/api/v1/health', timeout=2) | |
| sys.exit(0) | |
| except Exception: | |
| sys.exit(1) | |
| " 2>/dev/null; then | |
| echo "Backend is healthy! ✓" | |
| break | |
| fi | |
| RETRY_COUNT=$((RETRY_COUNT+1)) | |
| sleep 1 | |
| done | |
| if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then | |
| echo "Backend failed to start in time. Exiting." | |
| exit 1 | |
| fi | |
| # 3. Start Streamlit frontend | |
| echo "Starting Frontend (Streamlit) on port 7860..." | |
| streamlit run frontend/app.py --server.port 7860 --server.address 0.0.0.0 --server.headless true | |