Spaces:
Running
Running
| # Container entrypoint. Selects which service to run via GRIDPULSE_SERVICE. | |
| # | |
| # app (default) : Streamlit dashboard | |
| # api : FastAPI service | |
| set -euo pipefail | |
| SERVICE="${GRIDPULSE_SERVICE:-app}" | |
| PORT="${PORT:-7860}" | |
| echo "Starting GridPulse service='${SERVICE}' on port ${PORT}" | |
| case "$SERVICE" in | |
| app) | |
| # CORS and XSRF protection are disabled because Hugging Face Spaces serve | |
| # the app inside an iframe on a different origin, which Streamlit's default | |
| # XSRF check rejects. The app is read-only and takes no authenticated | |
| # input, so there is no state for a cross-site request to tamper with. | |
| exec streamlit run app.py \ | |
| --server.port "${PORT}" \ | |
| --server.address 0.0.0.0 \ | |
| --server.headless true \ | |
| --server.enableCORS false \ | |
| --server.enableXsrfProtection false \ | |
| --server.fileWatcherType none \ | |
| --browser.gatherUsageStats false | |
| ;; | |
| api) | |
| exec uvicorn gridpulse.api.main:app --host 0.0.0.0 --port "${PORT}" | |
| ;; | |
| *) | |
| echo "Unknown GRIDPULSE_SERVICE='${SERVICE}'. Expected 'app' or 'api'." >&2 | |
| exit 1 | |
| ;; | |
| esac | |