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 |