One-click deploy of the full AiSOC demo stack to Render via Render's Blueprint feature.
The lean demo profile — same shape as the Fly demo, without the heavy storage tier:
| Service | Plan | Role |
|---|---|---|
aisoc-api |
starter ($7/mo) | FastAPI core + investigation ledger |
aisoc-agents |
standard ($25/mo) | LangGraph orchestrator (needs 2GB RAM) |
aisoc-realtime |
starter ($7/mo) | WebSocket fanout |
aisoc-web |
starter ($7/mo) | Next.js console + marketing |
aisoc-postgres |
starter ($7/mo) | Managed Postgres (1GB) |
aisoc-redis |
starter ($10/mo) | Managed Redis (25MB) |
Total: ~$63/mo for an always-on, public-facing demo. Significantly cheaper than running the full storage tier (Kafka + ClickHouse + OpenSearch
- Neo4j + Qdrant) which Render doesn't offer managed versions of.
The Blueprint sets these flags on the api and agents services:
AISOC_DISABLE_KAFKA: "true"
AISOC_DISABLE_CLICKHOUSE: "true"
AISOC_DISABLE_OPENSEARCH: "true"
AISOC_DISABLE_NEO4J: "true"
AISOC_DISABLE_QDRANT: "true"The demo profile uses Postgres + Redis for everything — alerts, cases, investigations, the agent ledger, the cache layer. ClickHouse-backed event search and Neo4j-backed attack graphs are hidden in the UI when the backing store is absent, so the demo never shows a broken page.
If you need the full storage tier in production, use:
- Self-hosted on Render: not recommended — single-instance Kafka and ClickHouse on Render's plans is more expensive than running them on a dedicated VM.
- Kubernetes / Helm: see
infra/helm/— production-grade, brings its own Kafka/ClickHouse/OpenSearch. - Terraform / AWS: see
infra/terraform/— uses MSK, RDS, ElastiCache, OpenSearch Service, ECS for the application tier.
- Click the Deploy to Render button above.
- Render asks for permission to read your fork of
beenuar/AiSOC. Grant it. - Render parses
render.yamlat the repo root, shows the service plan, and asks you to confirm. - Click Apply. Render provisions Postgres + Redis first (~2 min), then deploys the four web services in dependency order (~6-8 min for the first build because Docker layers aren't cached yet).
- Once
aisoc-webis green, openhttps://aisoc-web-<hash>.onrender.com. The demo banner shows; the deeplink lands on a pre-seeded incident.
If you've forked the repo and changed things:
# From the repo root, after pushing your fork to GitHub:
gh repo view --web
# Then in Render: New + → Blueprint → Connect repo → select fork.
# Render auto-detects render.yaml at the repo root → Apply.The blueprint wires preDeployCommand: alembic upgrade head && python -m app.scripts.seed_demo onto the aisoc-api service, so every Render deploy
runs migrations and seeds the demo tenant before the new instance accepts
traffic. The seeder is idempotent — re-running against an already-seeded
database is a cheap no-op that refreshes INC-RT-001 (the in-flight
LockBit 3.0 ransomware investigation the demo deeplink targets) plus the
14 other canonical incidents.
If you ever need to re-seed manually (e.g. local recovery, or after a
database reset), use Render's Shell tab on the aisoc-api service and run:
python -m app.scripts.seed_demoThe Fly demo wipes and re-seeds the demo tenant daily via a scheduled machine. Render doesn't have native cron, so the options are:
- Render Cron Job service (~$1/mo) — add a 7th service of type
crontorender.yamlthat runs the seed script on a schedule. Skipped from the Blueprint by default to keep the cost story simple. - GitHub Actions workflow —
.github/workflows/render-demo-reset.ymlthat hits the deployed api on a schedule. Free, but tied to your GH Actions minutes budget. - Skip it — for a personal evaluation deploy, the demo data will drift over time but won't break.
The web service's health check hits /, which requires the api to be up
(it server-side renders the case list). If the api is still booting,
Render marks web as failed. Wait 60s and retry — Render auto-redeploys
on failed health checks up to 3 times.
The starter plan (512MB) is not enough for LangGraph + the LLM client
buffers. The Blueprint defaults agents to standard (2GB) for this
reason. If you downgraded it, bump back up.
Check that NEXT_PUBLIC_AISOC_DEMO_MODE=true is set on the aisoc-web
service. The variable is baked into the JS bundle at build time, so
flipping it requires a redeploy (not just a restart).
First boot does Alembic migrations + creates the ledger schema, which can take 20-30s on cold Postgres. Subsequent investigations land in <5s once the schema is in place.
infra/render/
└── README.md — this file (Render-specific walkthrough + cost notes)
<repo root>/
└── render.yaml — Render Blueprint manifest (the source of truth).
Lives at the root because Render's "Deploy to Render"
button only auto-detects blueprints at the root of
the repo, not in subdirectories.
For the full deployment philosophy and platform comparison, see the main README.