# Build version shown in the app. Leave as next-dev to use the version baked into the image. BUILD_VERSION=next-dev TZ=Europe/Amsterdam # Change this before first start. POSTGRES_PASSWORD=change-me-to-a-long-random-password POSTGRES_DB=discvault_next POSTGRES_USER=discvault_next # Dev image built from the codex/discvault-next branch. DISCVAULT_NEXT_IMAGE=ghcr.io/helmerznl/discvault:dev # Existing DiscVault data directory on the Docker host. This is mounted as /data # so Next can read /data/discvault.db and keep existing media files in place. DISCVAULT_DATA_DIR=/mnt/user/appdata/discvault # PostgreSQL data directory (bind mount). Relative to this compose file, or an # absolute path. Keep it on the same storage as your other data/backups so the # database is backed up alongside the media. Docker creates the directory if it # does not exist. The postgres container runs as uid 70 and initializes it on # first start if it is empty. DISCVAULT_NEXT_POSTGRES_DATA=./postgres-data # Seconds next-api and next-worker keep retrying while PostgreSQL refuses # connections, before exiting and letting Docker restart the container. Raise it # if your storage makes startup or WAL recovery slower than this. Default 300. #DISCVAULT_NEXT_DB_WAIT_TIMEOUT=300 # Host port for the Next API. DISCVAULT_NEXT_API_PORT=6180 DISCVAULT_NEXT_API_WORKERS=2 DISCVAULT_NEXT_API_TIMEOUT=180 # How long (ms) a single SQL statement, or a wait for a lock, may run on the # next-api connection before Postgres cancels it -- so a stuck/slow database # fails fast with the friendly offline page instead of hanging for up to # DISCVAULT_NEXT_API_TIMEOUT before gunicorn kills the worker. Only applies to # next-api; next-worker (imports, MovieVault sync) is intentionally unbounded. # Defaults: 10000 / 5000. #DISCVAULT_NEXT_API_STATEMENT_TIMEOUT_MS=10000 #DISCVAULT_NEXT_API_LOCK_TIMEOUT_MS=5000 # Host port for the MCP server (published as :). Change this if 6090 is # already in use by another stack on the same host to avoid a # "port is already allocated" error. DISCVAULT_NEXT_MCP_PORT=6090 # Where next-api reaches the MCP server to serve /mcp. This is the address # *inside* the Docker network, so it does not follow DISCVAULT_NEXT_MCP_PORT # above -- that one only republishes the host port. Change this only if you # rename the next-mcp service or make it listen on another container port. DISCVAULT_MCP_URL=http://next-mcp:6090 # Docker network name for this stack. Change it to run multiple DiscVault Next # stacks side by side without their networks colliding. This is the actual Docker # network name (no Compose project prefix is added). DISCVAULT_NEXT_NETWORK_NAME=discvault-next # Keeps DiscVault out of search results and out of AI training corpora. On by # default, and an existing deployment needs no change to get it: /robots.txt # disallows every crawler, every response carries X-Robots-Tag: noindex, and # known search-engine/AI-crawler user agents are refused with 403. Set it to # false only if you deliberately want an instance to be findable -- a reachable # instance gets indexed on its own, which is how two of them ended up in Google. # /robots.txt and /api/next/health always answer, whatever the user agent claims. #DISCVAULT_BLOCK_CRAWLERS=true # Dev/test only. Shows a guarded button that clears imported PostgreSQL data so # the migration wizard can be tested repeatedly. Keep false outside test stacks. DISCVAULT_NEXT_ENABLE_TEST_RESET=false # Destructive admin dedup execution remains disabled until its matching/report # workflow has been reviewed for the deployed release. DISCVAULT_ADMIN_DEDUP_EXECUTE_ENABLED=false # Passkeys, session tokens, and encrypted integration credentials. # Generate JWT_SECRET once with: openssl rand -base64 48 # RP_ID must be the browser hostname without scheme or port. JWT_SECRET= # Optional separate stable key for encrypted integration credentials. DISCVAULT_NEXT_KEY_ENCRYPTION_KEY= RP_ID=discvault.example.com RP_NAME=DiscVault RP_ORIGINS=https://discvault.example.com # Opt-in capability gate for password + TOTP authentication. LEGACY_AUTH_ENABLED=false # Which hops may state a client address on someone else's behalf. # Empty means none: forwarding headers are ignored and every request is # attributed to the address the server itself observed. A deployment behind a # reverse proxy wants this set -- otherwise every audit event names the proxy, # and the login throttles that key on an address all share one bucket. # Accepts IPs and CIDRs, comma-separated, plus the keyword "private" for a proxy # on your own LAN. Almost every self-hosted stack wants exactly "private". DISCVAULT_TRUSTED_PROXIES=private # Worker identity shown in job results. DISCVAULT_WORKER_ID=next-worker-1 DISCVAULT_WORKER_POLL_INTERVAL=2