Skip to content

Environment Configuration

Configuration Variables

Public URL

Variable Default Purpose
DOMAIN localhost Public domain
URL_SCHEME https Public URL scheme
PUBLIC_PORT 8443 (local) / 443 (prod) Public port

Django

Variable Default Purpose
DEBUG True (local) / False (prod) Debug mode
ENVIRONMENT development / production Deployment environment
ALLOWED_HOSTS Comma-separated Django ALLOWED_HOSTS
CSRF_TRUSTED_ORIGINS Comma-separated Django CSRF trusted origins

Database

Variable Default Purpose
DB_HOST odyssey Database host (connection pooler)
DB_PORT 6432 Database port (Odyssey)
DB_NAME ses_server_db Database name
DB_USER postgres Database user
POOL_TYPE session Odyssey pool type (session-level for schema isolation)
POOL_SIZE 50 (local) / 100 (prod) Odyssey pool size

Schema Isolation

Each institute uses a separate PostgreSQL schema. The connection pooler uses POOL_TYPE: session to ensure each tenant's queries go to the correct schema.

SSO

Variable Default Purpose
SSO_ENABLED True Enable Keycloak SSO
KEYCLOAK_URL http://keycloak:8080 Internal Keycloak URL
KEYCLOAK_EXTERNAL_URL http://localhost:8080 Public Keycloak URL
KEYCLOAK_REALM ses Keycloak realm name
KEYCLOAK_CLIENT_ID ses-server OIDC client ID
KEYCLOAK_CLIENT_SECRET ... OIDC client secret

Rate Limiting

Variable Default Purpose
RATE_LIMIT_GLOBAL 100000 (local) / 50000 (prod) Global requests/minute
RATE_LIMIT_INSTITUTE 10000 (local) / 5000 (prod) Per-institute requests/minute

Exam Sessions

Variable Default Purpose
SES_EXAM_TOKEN_TTL_SECONDS 28800 (8 hours) Token lifetime
SES_PROXY_RELOAD_URLS http://ses-proxy-1,... Proxy reload endpoints
AUDIT_RETENTION_DAYS 7 (local) / 30 (prod) Audit log retention

Gunicorn

Variable Local Production
GUNICORN_WORKERS 3 4–16
GUNICORN_THREADS 4 16–64
GUNICORN_WORKER_TIMEOUT 60 60–120