| # Boots FastAPI (8000) + Next.js standalone (7860) in one container. | |
| # Forwards signals so the container stops cleanly under HF Spaces / docker stop. | |
| set -euo pipefail | |
| cd /home/app/code | |
| PORT_API="${PORT_API:-8000}" | |
| PORT_WEB="${PORT:-7860}" | |
| HOST="${HOSTNAME:-0.0.0.0}" | |
| echo "[boot] starting FastAPI on :${PORT_API} ..." | |
| uv run uvicorn api.main:app --host 127.0.0.1 --port "${PORT_API}" --workers 1 & | |
| PID_API=$! | |
| # Wait for FastAPI to become ready (max ~30s) | |
| for i in $(seq 1 30); do | |
| if curl -fsS "http://127.0.0.1:${PORT_API}/health" >/dev/null 2>&1; then | |
| echo "[boot] FastAPI is up." | |
| break | |
| fi | |
| sleep 1 | |
| done | |
| echo "[boot] starting Next.js on :${PORT_WEB} ..." | |
| cd /home/app/code/frontend | |
| HOSTNAME="${HOST}" PORT="${PORT_WEB}" node server.js & | |
| PID_WEB=$! | |
| terminate() { | |
| echo "[boot] stopping ..." | |
| kill -TERM "${PID_API}" "${PID_WEB}" 2>/dev/null || true | |
| wait || true | |
| exit 0 | |
| } | |
| trap terminate INT TERM | |
| # Exit if either child dies | |
| wait -n "${PID_API}" "${PID_WEB}" | |
| EXIT_CODE=$? | |
| echo "[boot] a child exited with code ${EXIT_CODE}, shutting down." | |
| terminate | |