render.yaml
Rama main · réplica de lectura del repositorio original.
# Render Blueprint for the hosted public demo (read-only replay).
#
# WHY RENDER, NOT FLY: the demo-site spec targets a free hosting tier, with
# Render named as the fallback. Fly.io discontinued its free allowances for
# new organizations (October 2024) — new accounts get a ~2-hour trial, then
# pay-as-you-go — so there is no Fly free tier to target. Render's free web
# service tier still exists (2026): 512 MB, 750 instance-hours/month, spins
# down after 15 min idle (~1 min cold start on the next visit), ephemeral
# filesystem. All acceptable for this demo: it is stateless by design and
# re-seeds the packaged fixtures on every boot.
#
# TLS: Render's edge terminates TLS and forwards plain HTTP to $PORT (Render
# sets it; 10000 by default), so docker/demo-entrypoint.sh starts uvicorn
# WITHOUT the --ssl-* flags the image's default CMD uses.
#
# autoDeploy is OFF: deploys go through .github/workflows/demo-deploy.yml
# (fixture leak gate first, then the Render deploy hook) — never straight
# from a push.
#
# Setup already done (owner): the Blueprint from this file is live as
# soc-ai-demo on Render, with its deploy-hook URL in the GitHub repo secret
# RENDER_DEPLOY_HOOK_URL. autoDeploy stays off by design — refreshes are
# triggered manually, either via .github/workflows/demo-deploy.yml
# (workflow_dispatch → the deploy hook) or the Render dashboard's Manual
# Deploy button.
services:
- type: web
name: soc-ai-demo
runtime: docker
plan: free
dockerfilePath: ./Dockerfile
dockerContext: .
dockerCommand: /opt/soc-ai/docker/demo-entrypoint.sh
healthCheckPath: /healthz
autoDeploy: false
envVars:
# Same block as docker-compose.demo.yml — loopback mock URLs and inert
# placeholders only; nothing sensitive exists in the demo environment.
- key: SOC_AI_DEMO
value: "true"
- key: API_AUTH_REQUIRED
value: "false"
# The SPA fires ~10-15 API calls per page view, so 30/min throttled a real
# visitor to ~2 navigations before 429s. 120 clears normal browsing while
# still bounding scrapers (production default is 1200).
- key: API_RATE_LIMIT_PER_MIN
value: "120"
- key: ES_HOSTS
value: "http://127.0.0.1:9200"
- key: SO_HOST
value: "http://127.0.0.1:9200"
- key: SO_USERNAME
value: "demo"
- key: SO_PASSWORD
value: "demo-placeholder-unused"
- key: LITELLM_BASE_URL
value: "http://127.0.0.1:9200"