Objective
Replace hope-based deployment with a deterministic pipeline, add a staging tier, and stop running the scan worker as a background subshell inside the web container.
Current state
deploy.yml literally runs sleep 120 and then polls /health, assuming Render finished building — no build identity, no rollback, races on slow builds
- No staging environment:
dev and main both smoke-test against the production URL
startup.sh backgrounds the worker inside the Gunicorn container: it dies invisibly on dyno restarts mid-scan and cannot scale independently
Scope
Out of scope
Acceptance criteria
Category
Infrastructure / Deployment
Objective
Replace hope-based deployment with a deterministic pipeline, add a staging tier, and stop running the scan worker as a background subshell inside the web container.
Current state
deploy.ymlliterally runssleep 120and then polls/health, assuming Render finished building — no build identity, no rollback, races on slow buildsdevandmainboth smoke-test against the production URLstartup.shbackgrounds the worker inside the Gunicorn container: it dies invisibly on dyno restarts mid-scan and cannot scale independentlyScope
render.yamlblueprint defining services declaratively:openshield-api-staging(auto-deploy fromdev) andopenshield-api(frommain)DatabaseManager— present)Out of scope
Acceptance criteria
dev; production servesmainCategory
Infrastructure / Deployment