| Core |
DJANGO_DEBUG | false in Docker by default; true only on the local development path. The app refuses to boot in an obviously unsafe combination. |
DJANGO_SECRET_KEY
DJANGO_SECRET_KEY_FILE | A strong key, or a path where one is generated and persisted. Compose uses the file form on the secrets volume. |
DJANGO_ALLOWED_HOSTS
CSRF_TRUSTED_ORIGINS
CORS_ALLOWED_ORIGINS | Your real hostnames once you leave localhost. Getting these wrong is the most common cause of a working install that refuses logins. |
BEHIND_TLS | true when a TLS-terminating proxy is in front: secure cookies, HTTPS redirect, __Host-/__Secure- prefixes. |
PUBLIC_URL | The base the vendor-questionnaire links are built from. Without it the request's Origin is used, which a dev proxy will rewrite. |
ORGANISATION_NAME | Your name as it appears in outbound email and on the questionnaire page a vendor sees. |
| Data and mail |
DATABASE_URL | PostgreSQL in Docker and production; SQLite locally. PostgreSQL 16 is what CI tests against. |
EMAIL_PROVIDER | console · smtp · mailbox (a standard IMAP/POP3 + SMTP account, with a copy filed in Sent) · ses. Test with manage.py test_mailbox --to you@example.com. |
REVIEW_SCAN_HOUR
REVIEW_ALERT_LEAD_DAYS | When the daily reminder scan runs, and how far ahead it warns. Defaults to 30, 14, 7 and 1 days, plus one overdue notice. |
S3_* | Optional Amazon S3 for evidence storage instead of the local filesystem. |
| Identity |
OIDC_* | Issuer, client id and secret, scopes, domain allow-list, and auto-provisioning, which is off by default and, when switched on, provisions at Viewer and refuses any role that can manage users. PKCE is used; JWKS verification is asymmetric only. Environment-configured on purpose. There is no form an attacker can reach. |
SAML_* | IdP metadata, entity id, ACS URL and the signing certificate. Assertions are replayed-checked; HMAC signature methods are refused. |
SSO_STEP_UP | off · if_enrolled · required: whether an SSO sign-in must also present a local second factor. SSO_WORKSPACE sets which workspace an auto-provisioned account joins. |
WEBAUTHN_RP_ID
WEBAUTHN_ORIGINS | Must be a real domain: browsers refuse an IP address as a relying-party id. Pin both when running behind a proxy that rewrites Host. |
| Assurance and alerting |
SIGNING_KEY_FILE
SIGNING_KEY | Where the Ed25519 package-signing key lives. In compose: /app/secrets/package_signing_key. Rotate with manage.py rotate_signing_key; the fingerprint is published at /api/signing-keys/. |
CLAMAV_* | Point at a clamd instance to scan uploads. In compose it is opt-in: docker compose --profile scanning up -d plus CONFORMITI_SCANNING=true. The hourly job is a liveness probe that alerts when clamd stops and when it returns; the re-scan sweep that quarantines stored files is manage.py scan_evidence, which you schedule yourself. |
SLACK_WEBHOOK_URL
TEAMS_WEBHOOK_URL | Incoming webhooks, https only, set by an operator and nowhere else. Slack receives Block Kit, Teams an Adaptive Card. |
MAX_UPLOAD_MB
PASSWORD_MIN_LENGTH
THROTTLE_LOGIN | Upload cap (32 MB default: raise client_max_body_size in the nginx config to match, or the proxy still returns 413), password policy, and the per-client login throttle. Counters live in Redis in the compose stack, so the limit is shared across workers; set NUM_PROXIES to your proxy hop count if you front it differently. |
SEED_DEMO_DATA | Defaults to false. Set true on the first boot for the worked example, and only on something you do not intend to keep. |