Docs / Start
Deployment
The stack is three containers behind nginx: the React dashboard, the FastAPI backend, and (optionally) a standalone governance worker. Reports and the database persist in named Docker volumes.
Topology
browser ──► nginx (:3001, SPA config)
│
└──► FastAPI backend (:8001)
├── SQLite / PostgreSQL
├── periscope-reports volume
└── governance worker (optional container)Production checklist
- Set
ENVIRONMENT=production— startup fails ifPERISCOPE_API_KEYis unset (fail-closed guard) - Point
DATABASE_URLat PostgreSQL; run Alembic to create the schema - Set the two frontend build args to your server address (
VITE_API_BASE_URL,VITE_WS_BASE_URL) - Keep
DEBUG=false,JSON_LOGS=true - Wire
/healthto your orchestrator's liveness probe and scrape/metricswith Prometheus
# bare-metal alternative uvicorn radar_scanner.main:app --host 0.0.0.0 --port 8000 --workers 4
Reports volume
docker exec periscope-backend ls /app/reports/ docker cp periscope-backend:/app/reports/<filename> . # volume survives restarts; deleted only by `docker compose down -v`
SARIF in CI
Set ENABLE_SARIF_OUTPUT=true to write SARIF 2.1.0 reports alongside text reports, then upload them with GitHub's codeql-action/upload-sarif action — findings appear as code-scanning alerts.
Source: docker-compose.yml · nginx.conf · backend/README.md (Deployment)