Configuration ============= All settings are environment variables. Unset variables use defaults. | Variable | Default | Validation | Description | |----------|---------|------------|-------------| | `PORT` | `8080` | 0–65535 | HTTP listen port (0 = ephemeral, used in tests) | | `MEDIA_ROOT` | `./media` | — | Root path for media set directories | | `DB_PATH` | `data.db` | — | SQLite database file path | | `MAX_UPLOAD_SIZE_MB` | `100` | ≥ 1 | Max upload size per file (MB) | | `SESSION_TIMEOUT_HOURS` | `24` | ≥ 1 | Cookie / session expiry | | `GC_INTERVAL_MINUTES` | `30` | ≥ 1 | Garbage collector tick interval | | `SHARE_DEFAULT_EXPIRY_DAYS` | `7` | ≥ 1 | Default share link lifetime | | `PODCAST_CHECK_INTERVAL_MINUTES` | `60` | ≥ 1 | Podcast feed refresh interval | | `LOG_LEVEL` | `info` | `debug` / `info` / `warn` / `error` | Log verbosity | | `SECURE_COOKIES` | `true` | `true` / `false` | Set `Secure` flag on session cookies; set to `false` for plain-HTTP local deployments | | `PLAYER_CORS_ORIGINS` | unset | comma-separated origins | Allowed browser origins for credentialed CORS requests; unset/empty emits no CORS headers | **Important:** The K8s `Deployment` overrides `DB_PATH` to `/data/media.db` and `MEDIA_ROOT` to `/media` so the PVC mounts are used. Do not rely on the local defaults in a container.