| # Deploying the Engine to HuggingFace Spaces |
|
|
| This is the deploy path for the ModPilot Investigation Engine. The HF Space |
| is a Docker container that runs FastAPI on port 7860, talks to Supabase |
| (Postgres) and Upstash (Redis), and is reached by the Devvit app over a |
| single HMAC-signed HTTPS endpoint. |
|
|
| ## Space URL |
|
|
| `https://thejasrao-modpilot.hf.space` |
|
|
| (HF lowercases and hyphenates: `ThejasRao/ModPilot` β `thejasrao-modpilot.hf.space`.) |
|
|
| ## One-time setup |
|
|
| ### 1. Set repository secrets on the Space |
|
|
| HF Space β **Settings** β **Variables and secrets** β **New secret**. Add: |
|
|
| | Key | Value source | |
| |---|---| |
| | `GEMINI_API_KEY` | from `engine/.env` | |
| | `DATABASE_URL` | the Supabase **session pooler** URL with `+asyncpg` driver and URL-encoded password (see `engine/.env`) | |
| | `REDIS_URL` | the Upstash `rediss://` URL (TLS) | |
| | `ENGINE_SHARED_SECRET` | from `engine/.env` β must match `devvit-app/src/services/engineConfig.local.ts` | |
| | `ENV` | `production` | |
| | `LOG_LEVEL` | `INFO` | |
| | `MODEL_REASONER` | `gemini-2.5-pro` | |
| | `MODEL_SUMMARIZER` | `gemini-2.5-flash` | |
|
|
| Secrets become env vars at container start. Do **not** commit `.env` to the |
| HF Space repo β `.dockerignore` already excludes it. |
|
|
| ### 2. Clone the Space repo locally |
|
|
| ```bash |
| # Generate a write token at https://huggingface.co/settings/tokens |
| git clone https://huggingface.co/spaces/ThejasRao/ModPilot ~/hf-modpilot |
| ``` |
|
|
| ### 3. Copy engine files into the Space repo |
|
|
| From this project root: |
|
|
| ```bash |
| ENGINE=$(pwd)/engine |
| HF=~/hf-modpilot |
| rsync -av --delete \ |
| --exclude='.env' --exclude='.venv' --exclude='__pycache__' \ |
| --exclude='.pytest_cache' --exclude='.mypy_cache' --exclude='.ruff_cache' \ |
| --exclude='.git' \ |
| "$ENGINE"/ "$HF"/ |
| ``` |
|
|
| ### 4. Push |
|
|
| ```bash |
| cd ~/hf-modpilot |
| git add -A |
| git commit -m "Deploy ModPilot engine" |
| git push # use HF token as password |
| ``` |
|
|
| HF will build the image (~3-5 min) and start the container. Watch the build |
| logs in the Space's **Logs** tab. |
|
|
| ## Verify the deploy |
|
|
| Once the Space shows "Running": |
|
|
| ```bash |
| # Health (no auth required) |
| curl -s https://thejasrao-modpilot.hf.space/health | jq |
| |
| # Investigate (HMAC-signed) |
| python scripts/probe_investigate.py # if you have it, or use devvit-app |
| ``` |
|
|
| ## Wire Devvit β HF Space |
|
|
| 1. Edit `devvit-app/devvit.json` β `permissions.http.domains`: |
| ```json |
| "domains": ["thejasrao-modpilot.hf.space"] |
| ``` |
| 2. Edit `devvit-app/src/services/engineConfig.local.ts`: |
| ```ts |
| export const ENGINE_URL = "https://thejasrao-modpilot.hf.space"; |
| export const ENGINE_SHARED_SECRET = "<same as HF secret>"; |
| ``` |
| 3. `cd devvit-app && npm run dev` (playtest). On first run Devvit auto-submits |
| the domain via the 0.11.17 flow. Check **Developer Settings** tab in the |
| app for approval status β usually fast. |
|
|
| ## Operational notes |
|
|
| - **Cold start**: HF Spaces free tier sleeps after ~48h idle. First request |
| pays ~30-60s. For a demo, hit `/health` a minute beforehand to wake it. |
| - **Migrations**: the container runs `alembic upgrade head` on every boot. |
| Schema changes land just by pushing new revisions. |
| - **Logs**: Space β **Logs** tab. Structured JSON; `correlation_id` is the |
| primary join key against Devvit-side logs. |
| - **Rebuild**: any push to the Space repo triggers a rebuild. Edits to env |
| vars (Secrets UI) restart the container without rebuild. |
| - **Local dev unchanged**: `uv run uvicorn api.main:app --reload` still |
| works locally against the same Supabase + Upstash. Just keep `ENV=development` |
| in `engine/.env` so HMAC enforcement stays off for local probes. |
|
|