# Compose identity. The host ./data directory must be writable by this UID/GID. APP_UID=1000 APP_GID=1000 HOST_PORT=3000 IMAGE_TAG=local # Public service identity. Use the externally reachable HTTPS URL in production. PUBLIC_BASE_URL=https://video.example.com # Public Next.js website origin for login, invitation, and billing screens. WEBSITE_BASE_URL=https://www.example.com HOST=0.0.0.0 PORT=3000 TRUST_PROXY=true # Persistent state. Compose pins these paths inside the container. DATABASE_PATH=/app/data/database.sqlite DRIZZLE_MIGRATIONS_PATH=/app/drizzle MEDIA_ROOT=/app/data/media # Read-only, pinned static host bundle mounted by Compose. Do not put FFmpeg in # the application image. FFMPEG_PATH=/opt/ffmpeg/bin/ffmpeg FFPROBE_PATH=/opt/ffmpeg/bin/ffprobe # Global processing and durable worker limits. MAX_CONCURRENT_MEDIA_PROCESSES=3 JOB_WORKER_CONCURRENCY=3 JOB_POLL_INTERVAL_MS=500 JOB_LEASE_SECONDS=60 JOB_HEARTBEAT_SECONDS=10 JOB_MAX_ATTEMPTS=2 WORKER_ID=densio-worker-1 # Upload, comparison, extraction, and output retention policy. MAX_UPLOAD_BYTES=21474836480 HLS_MAX_SCRATCH_BYTES=21474836480 UPLOAD_TTL_SECONDS=3600 ARTIFACT_TTL_SECONDS=86400 ARTIFACT_CLEANUP_INTERVAL_SECONDS=600 MAX_EXTRACTED_IMAGES=2000 MAX_COMPARISON_SECONDS=3 AUDIO_SILENCE_THRESHOLD_DB=-50 # Passwordless authentication. Generate both secrets independently with: # openssl rand -hex 32 AUTH_IP_HASH_SECRET=replace-with-a-random-secret AUTH_OUTBOX_ENCRYPTION_KEY=replace-with-a-64-character-hex-key AUTH_CHALLENGE_TTL_SECONDS=600 AUTH_ACCESS_TTL_SECONDS=900 AUTH_REFRESH_TTL_SECONDS=2592000 AUTH_RATE_LIMIT_WINDOW_SECONDS=60 AUTH_MAX_CHALLENGES_PER_EMAIL=3 AUTH_MAX_CHALLENGES_PER_IP=10 # Organization management quotas; default-org provisioning does not consume these. ORGANIZATION_MAX_CREATES_PER_DAY=10 ORGANIZATION_MAX_INVITATIONS_PER_HOUR=30 # Resend magic-link and organization-invitation delivery with durable retries. RESEND_API_KEY=re_replace-me EMAIL_FROM="Densio " EMAIL_POLL_INTERVAL_MS=1000 EMAIL_LEASE_SECONDS=30 EMAIL_MAX_ATTEMPTS=5 EMAIL_RETRY_BASE_SECONDS=5 # Organization Stripe billing. One quantity-one recurring price per paid plan, never per seat. STRIPE_SECRET_KEY=sk_live_replace-me STRIPE_WEBHOOK_SECRET=whsec_replace-me STRIPE_BASIC_PRICE_ID=price_basic_replace-me STRIPE_PRO_PRICE_ID=price_pro_replace-me STRIPE_SCALE_PRICE_ID=price_scale_replace-me STRIPE_CHECKOUT_SUCCESS_URL=https://www.example.com/checkout/success STRIPE_CHECKOUT_CANCEL_URL=https://www.example.com/checkout/canceled STRIPE_PORTAL_RETURN_URL=https://www.example.com/billing # Optional JSON secret: customer-key encryption and managed R2 target registry. # See infra/r2/README.md. Never put production secrets into this example file. STORAGE_CONFIG_JSON=