ModPilot / HF_DEPLOY.md
ThejasRao's picture
Deploy ModPilot Investigation Engine
7302343
|
Raw
History Blame Contribute Delete
3.57 kB
# 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.