This walks through deploying SF Pulse Python to Render from scratch.
sf-pulse-python— web service (FastAPI)sf-pulse-python-daily— cron service (triggers the workflow)sf-pulse-python-db— PostgreSQLsf-pulse-python-realtime— Redis (key-value)
What it does not provision:
sf-pulse-python-workflow— the workflow worker is created manually (see workflow-setup.md)
Push a copy of render-examples/sf-pulse-python-workshop to your own GitHub account if you want to make customizations. Otherwise the Deploy to Render button works directly against render-examples/sf-pulse-python-workshop.
Dashboard → Env Groups → New Env Group: sf-pulse-python-env
Required:
LLM_API_KEY— OpenAI or Anthropic key (without it, only regex sources work)
Optional:
LLM_PROVIDER,LLM_MODEL— overridesVAPID_PUBLIC_KEY,VAPID_PRIVATE_KEY,VAPID_SUBJECT— required only for push notifications. Generate withuv run python -c "from py_vapid import Vapid; v = Vapid(); v.generate_keys(); v.save_key('private.pem'); v.save_public_key('public.pem')"(or any standard VAPID generator).APP_URL— public URL used in RSS / push payloads. Render auto-setsRENDER_EXTERNAL_URLso this is usually unnecessary.
Or New → Blueprint → connect the repo. Render reads render.yaml and creates the four services.
After the first deploy, set on the env group:
DATABASE_URL— copy fromsf-pulse-python-dbInternal Database URLREDIS_URL— copy fromsf-pulse-python-realtimeInternal Connection URL
(render.yaml already wires these on the web service via fromDatabase/fromService, but the env group is shared with cron and workflow services that need the same URLs.)
Follow workflow-setup.md. Set RENDER_API_KEY and SF_PULSE_WORKFLOW_SLUG on the cron service.
Either wait for the daily 7:00 AM PDT cron, or Trigger Run the cron service in the Dashboard.
https://sf-pulse-python.onrender.com/api/healthzreturns{"ok": true}- The home page loads and shows the diagram tab
- Workflow logs show all source tasks completing
- Restaurants appear after the first successful run
- Web service buildCommand:
This builds the React diagram into
cd web/diagram && npm ci && npm run build && cd ../.. pip install --upgrade uv && uv sync --frozen
static/diagram/and installs Python deps. - Pre-deploy:
uv run python -m bin.migrateruns migrations against the production DB. - Start:
uv run uvicorn app.main:app --host 0.0.0.0 --port $PORT
| Symptom | Likely cause | Fix |
|---|---|---|
DATABASE_URL is required |
env group missing the URL | Set it from the Postgres internal URL |
Module not found: workflow.main |
Workflow worker can't find the package | Verify build command ran uv sync --frozen |
405 Method Not Allowed on /api/push/subscribe |
Probably hitting GET; should be POST | Check curl/client method |
| Diagram tab empty | static/diagram/ wasn't built |
Verify the web service build log includes npm run build |
| Push fanout silently skipped | VAPID keys not set | Set VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY on the env group |