# Runtime environment ENVIRONMENT=production LOG_LEVEL=info # PostgreSQL POSTGRES_USER=knowfoolery POSTGRES_PASSWORD=change-me POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=knowfoolery POSTGRES_SSLMODE=disable POSTGRES_MAX_OPEN_CONNS=25 POSTGRES_MAX_IDLE_CONNS=10 POSTGRES_CONN_MAX_LIFETIME=5m POSTGRES_CONN_MAX_IDLE_TIME=1m # Redis REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= REDIS_DB=0 REDIS_POOL_SIZE=10 REDIS_MIN_IDLE_CONNS=5 REDIS_DIAL_TIMEOUT=5s REDIS_READ_TIMEOUT=3s REDIS_WRITE_TIMEOUT=3s # Service ports GAME_SESSION_PORT=8080 QUESTION_BANK_PORT=8081 USER_SERVICE_PORT=8082 LEADERBOARD_PORT=8083 ADMIN_SERVICE_PORT=8085 GATEWAY_PORT=8086 GATEWAY_INTERNAL_PORT=18086 # Gateway GATEWAY_PUBLIC_PREFIX=/api/v1 GATEWAY_ALLOWED_ORIGINS=https://app.knowfoolery.com GATEWAY_ALLOWED_METHODS=GET,POST,PUT,DELETE,OPTIONS GATEWAY_ALLOWED_HEADERS=Origin,Content-Type,Accept,Authorization GATEWAY_ALLOW_CREDENTIALS=true GATEWAY_CORS_MAX_AGE_SECONDS=300 GATEWAY_UPSTREAM_TIMEOUT=3s GATEWAY_RATE_WINDOW=1m GATEWAY_RATE_GENERAL=100 GATEWAY_RATE_AUTH=5 GATEWAY_RATE_API=60 GATEWAY_RATE_ADMIN=30 GATEWAY_CSP=default-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self' GATEWAY_ENABLE_HSTS=true GATEWAY_HSTS_MAX_AGE=31536000 GATEWAY_FRAME_OPTIONS=DENY GATEWAY_CONTENT_TYPE_OPTIONS=true GATEWAY_REFERRER_POLICY=strict-origin-when-cross-origin GATEWAY_PERMISSIONS_POLICY=geolocation=(), microphone=(), camera=(), payment=(), usb=() # Inter-service HTTP timeout UPSTREAM_HTTP_TIMEOUT=3s # Feature configs QUESTION_CACHE_TTL=5m QUESTION_RANDOM_MAX_EXCLUSIONS=200 QUESTION_BULK_MAX_ITEMS=5000 GAME_SESSION_DURATION=30m GAME_SESSION_MAX_ATTEMPTS=3 GAME_SESSION_MIN_ANSWER_LATENCY_MS=300 GAME_SESSION_LOCK_TTL=3s GAME_SESSION_ACTIVE_KEY_TTL=35m GAME_SESSION_END_REASON_DEFAULT=abandoned LEADERBOARD_TOP_LIMIT=10 LEADERBOARD_PLAYER_HISTORY_DEFAULT_LIMIT=20 LEADERBOARD_PLAYER_HISTORY_MAX_LIMIT=100 LEADERBOARD_CACHE_TTL=60s LEADERBOARD_UPDATE_REQUIRE_AUTH=true USER_ADMIN_LIST_DEFAULT_LIMIT=50 USER_ADMIN_LIST_MAX_LIMIT=200 ADMIN_AUDIT_RETENTION_DAYS=90 # Auth (Zitadel) ZITADEL_URL=https://auth.knowfoolery.com ZITADEL_ISSUER=https://auth.knowfoolery.com ZITADEL_AUDIENCE=knowfoolery-api ZITADEL_CLIENT_ID=replace-me ZITADEL_CLIENT_SECRET=replace-me # Observability METRICS_ENABLED=true METRICS_SERVICE_NAME=knowfoolery TRACING_ENABLED=true TRACING_SERVICE_NAME=knowfoolery TRACING_SERVICE_VERSION=0.1.0 TRACING_ENVIRONMENT=production TRACING_OTLP_ENDPOINT=http://jaeger:4318/v1/traces TRACING_JAEGER_ENDPOINT=http://jaeger:14268/api/traces TRACING_SAMPLE_RATE=0.2 PROMETHEUS_PORT=9090 GRAFANA_PORT=3000 JAEGER_UI_PORT=16686 JAEGER_COLLECTOR_PORT=14268 JAEGER_OTLP_GRPC_PORT=4317 JAEGER_OTLP_HTTP_PORT=4318 JAEGER_AGENT_PORT=6831 GRAFANA_ADMIN_USER=admin GRAFANA_ADMIN_PASSWORD=change-me