Skip to content

Environment Variable Reference

All environment variables are validated at startup using Zod. If a required variable is missing or invalid, the server refuses to start with a clear error message.

Configuration is loaded from a .env file (via dotenv) and then validated against the schema in src/env.ts.


Database

VariableDefaultRequiredDescription
DB_CLIENTpgNoDatabase driver: pg, mysql, mysql2, sqlite3, better-sqlite3
DB_HOSTlocalhostNoDatabase host
DB_PORT5432NoDatabase port
DB_DATABASEcmsNoDatabase name
DB_USERodp_userNoDatabase user
DB_PASSWORD``NoDatabase password
DB_SSLfalseNoEnable SSL connection
DB_POOL_MIN0NoMin connection pool size
DB_POOL_MAX10NoMax connection pool size
DB_FILENAMENoSQLite database file path (SQLite only)

Server

VariableDefaultRequiredDescription
HOST0.0.0.0NoBind address
PORT8055NoHTTP port
PUBLIC_URLhttp://localhost:8055NoPublicly accessible base URL
SECRETYesJWT signing secret (min 1 character)
ACCESS_TOKEN_TTL15mNoAccess token lifetime (e.g., 15m, 1h)
REFRESH_TOKEN_TTL7dNoRefresh token lifetime (e.g., 7d, 30d)
SESSION_COOKIE_ENABLEDtrueNoEnable session cookie mode
SESSION_COOKIE_NAMEodp_session_tokenNoCookie name for session tokens
LOG_LEVELinfoNotrace, debug, info, warn, error, fatal
LOG_STYLEprettyNopretty (colored output) or raw (JSON)
LOG_FILENoPath to write logs to a file
LOG_REQUESTStrueNoLog each HTTP request
MAX_PAYLOAD_SIZE1mbNoMaximum request body size
ROOT_REDIRECT/server/infoNoWhere / redirects to
NODE_ENVdevelopmentNodevelopment, production, test

CORS

VariableDefaultDescription
CORS_ENABLEDtrueEnable CORS headers
CORS_ORIGIN*Allowed origins (comma-separated or *)
CORS_METHODSGET,POST,PATCH,DELETEAllowed HTTP methods
CORS_ALLOWED_HEADERSContent-Type,AuthorizationAllowed request headers
CORS_EXPOSED_HEADERSContent-RangeExposed response headers
CORS_CREDENTIALStrueAllow credentials
CORS_MAX_AGE18000Preflight cache duration (seconds)

Cache

VariableDefaultDescription
CACHE_ENABLEDfalseEnable response caching
CACHE_TTL5mCache entry lifetime
CACHE_STOREmemoryBackend: memory or redis
CACHE_AUTO_PURGEfalseAuto-invalidate on mutations
CACHE_SCHEMAtrueCache database schema
CACHE_SYSTEM_TTL10mSystem cache TTL
CACHE_NAMESPACEodpCache key prefix
CACHE_STATUS_HEADERx-cache-statusResponse header for cache status
CACHE_VALUE_MAX_SIZE1mbMaximum cacheable response size

Redis

VariableDefaultDescription
REDIS_ENABLEDfalseUse Redis for cache and sessions
REDIS_HOST127.0.0.1Redis host
REDIS_PORT6379Redis port
REDIS_PASSWORD``Redis password
REDIS_DB0Redis database index

Storage & Files

VariableDefaultDescription
STORAGE_LOCAL_ROOT./uploadsLocal file storage directory
FILES_MAX_UPLOAD_SIZE10mbMaximum upload size per file
FILES_MIME_TYPE_ALLOW_LIST*Allowed MIME types (* = all, or comma-separated list)
FILES_MAX_UPLOAD_CONCURRENCY5Max simultaneous file uploads

Image Transformation (Assets)

VariableDefaultDescription
ASSETS_TRANSFORM_IMAGE_MAX_DIMENSION6000Max output width or height (pixels)
ASSETS_TRANSFORM_MAX_CONCURRENT25Max concurrent image transforms
ASSETS_TRANSFORM_TIMEOUT30Transform timeout (seconds)
ASSETS_CACHE_TTL30mTransformed asset cache TTL
ASSETS_INVALID_IMAGE_SENSITIVITY_LEVELwarningHow to handle corrupt images: none, truncated, error, warning

Email

VariableDefaultDescription
EMAIL_FROMno-reply@example.comDefault sender address
EMAIL_TRANSPORTsmtpTransport: smtp, ses, sendmail
EMAIL_SMTP_HOSTlocalhostSMTP server host
EMAIL_SMTP_PORT587SMTP port
EMAIL_SMTP_USER``SMTP username
EMAIL_SMTP_PASSWORD``SMTP password
EMAIL_SMTP_SECUREfalseEnable TLS/SSL

Rate Limiting

VariableDefaultDescription
RATE_LIMITER_ENABLEDtrueEnable per-IP rate limiting
RATE_LIMITER_STOREmemoryStore: memory or redis
RATE_LIMITER_POINTS50Max requests per window
RATE_LIMITER_DURATION1Window duration (seconds)
RATE_LIMITER_GLOBAL_ENABLEDtrueEnable global (all-IP) rate limit
RATE_LIMITER_GLOBAL_POINTS1000Global requests per window
RATE_LIMITER_GLOBAL_DURATION1Global window duration (seconds)

Authentication Throttling

VariableDefaultDescription
LOGIN_THROTTLE_DELAY1sInitial delay after failed login
LOGIN_THROTTLE_MAX_DELAY30sMaximum backoff delay

WebSocket

VariableDefaultDescription
WEBSOCKETS_ENABLEDtrueEnable WebSocket support
WEBSOCKETS_HEARTBEAT_ENABLEDtrueEnable ping/pong heartbeat
WEBSOCKETS_HEARTBEAT_PERIOD30Heartbeat interval (seconds)
WEBSOCKETS_REST_ENABLEDtrueEnable REST-over-WebSocket
WEBSOCKETS_REST_AUTHhandshakeAuth mode: public, handshake, strict
WEBSOCKETS_GRAPHQL_ENABLEDtrueEnable GraphQL over WebSocket
WEBSOCKETS_GRAPHQL_AUTHhandshakeAuth mode: public, handshake, strict

Extensions

VariableDefaultDescription
EXTENSIONS_PATH./extensionsDirectory to load extensions from
EXTENSIONS_MUST_LOAD``Comma-separated list of extensions that must load (server fails if missing)
EXTENSIONS_AUTO_RELOADfalseWatch and auto-reload extensions on change

TUS Resumable Upload

VariableDefaultDescription
TUS_UPLOAD_EXPIRATION10mExpiry for incomplete TUS uploads
TUS_CLEANUP_SCHEDULE0 */6 * * *Cron schedule for TUS cleanup job

Miscellaneous

VariableDefaultDescription
MIGRATIONS_PATH``Path to custom migration files
PRESSURE_ENABLEDtrueEnable server load shedding
METRICS_ENABLEDfalseExpose Prometheus metrics endpoint
METRICS_NAME_PREFIXodp_Prometheus metric name prefix
USER_INVITE_TOKEN_TTL7dInvite token lifetime
QUERYSTRING_MAX_PARSE_DEPTH10Max nesting depth for query string parsing

Example .env

env
# Required
SECRET=your-super-secret-key-change-in-production

# Database
DB_CLIENT=pg
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=odp
DB_USER=odp_user
DB_PASSWORD=odp_password

# Server
PORT=8055
PUBLIC_URL=https://api.example.com
LOG_LEVEL=info
LOG_STYLE=raw

# Cache (Redis)
CACHE_ENABLED=true
CACHE_STORE=redis
REDIS_ENABLED=true
REDIS_HOST=redis
REDIS_PORT=6379

# Email
EMAIL_FROM=no-reply@example.com
EMAIL_TRANSPORT=smtp
EMAIL_SMTP_HOST=smtp.example.com
EMAIL_SMTP_PORT=587
EMAIL_SMTP_USER=smtp-user
EMAIL_SMTP_PASSWORD=smtp-password
EMAIL_SMTP_SECURE=true

# Storage
STORAGE_LOCAL_ROOT=/data/uploads
FILES_MAX_UPLOAD_SIZE=50mb

# Security
RATE_LIMITER_ENABLED=true
SESSION_COOKIE_ENABLED=true

ODP Internal API Documentation