FTP_USER=cameras FTP_PASS=cameras PUID=99 # numeric owner for FTP uploads, sorter output, and Frame.io downloads PGID=100 # numeric group shared by every service that writes camera data PUBLICHOST=10.0.0.101 # IP the FTP server advertises in PASV (your host IP or container IP) CAMERA_DATA_SOURCE=camera_data # named volume; set ./data or an absolute path for one shared bind mount STABLE_WAIT=60 STABLE_SKIP_AGE=3600 # old backlog files skip the quiet wait; integrity validation still runs SORT_WORKERS=4 # concurrent files; 4 is a safe starting point for RAW validation LOCK_ROOT=/var/lib/camera-sorter # private persistent control mount shared by every sorter WATCH_READY_TIMEOUT=30 # startup seconds allowed for the inotify readiness handshake NOTIFY_INTERVAL=300 RAW_FULL_VALIDATE=1 # 1 = run LibRaw decode before sorting RAWs; set 0 to disable RAW_VALIDATE_TIMEOUT=240 # per-tool limit for ExifTool and LibRaw metadata/integrity reads RAW_VALIDATE_TMP_STALE_MIN=15 # remove abandoned raw.* validation scratch after this many minutes # --- Optional: Frame.io Camera-to-Cloud mirror --- # Only consumed when you bring up the `frameio-mirror` profile: # docker compose --profile frameio up -d # # Frame.io V4 webhooks contain only a resource ID, not a download URL. The # signing secret plus Adobe client credentials are therefore required for # ingestion: the mirror verifies the webhook, fetches metadata/download bytes # through the authenticated API, then optionally deletes the upstream asset. # # FRAMEIO_WEBHOOK_SECRET= # From Frame.io webhook settings — enables HMAC-SHA256 signature verification # ADOBE_CLIENT_ID= # Required: Adobe Developer Console → Frame.io API (S2S or OAuth Web App) # ADOBE_CLIENT_SECRET= # Required: matching Adobe client secret # ADOBE_SCOPES=openid,AdobeID,additional_info.roles,offline_access,profile,email # offline_access REQUIRED for refresh token # OAUTH_REDIRECT_URI=https://YOUR_PUBLIC_HOSTNAME/oauth/callback # MUST match what you register in Adobe Dev Console # OAUTH_SETUP_SECRET= # Required for OAuth Web App enrollment; send only as X-Setup-Secret to POST /oauth/start # DELETE_UPSTREAM=0 # Safe default keeps Frame.io copy; 1 opts into hidden-copy SHA-256/size-gated deletion # WEBHOOK_MAX_BYTES=1000000 # Hard cumulative body cap, including chunked webhook requests # FRAMEIO_WORKERS=4 # Fixed worker pool; bounds simultaneous Frame.io asset jobs # FRAMEIO_QUEUE_SIZE=256 # In-memory admission queue; durable pending state carries overflow to reconciliation # DOWNLOAD_MAX_BYTES=21474836480 # Hard per-asset download cap (20 GiB), enforced before and while streaming # DOWNLOAD_MAX_SECONDS=1800 # Overall per-asset download deadline, including slow/trickled streams # RECONCILE_INTERVAL_SECONDS=900 # RECONCILE_MAX_PAGES=1000 # Per-cycle listing bound; a durable cursor resumes later pages # RECONCILE_MAX_ITEMS=100000 # Per-cycle listing item bound # RECONCILE_MAX_SECONDS=300 # Per-cycle listing wall-clock bound # DOWNLOAD_TMP_STALE_SECONDS=3600 # Reclaim stale unjournaled staging/handoff temps at startup and reconciliation # STAGING_DIR=/var/lib/frameio/staging # Private persistent staging on a separate mount from /data/incoming # REFRESH_TOKEN_FILE=/var/lib/frameio/state.json # Parent must also be private and on a separate mount from /data # FRAMEIO_C2C_FOLDER_ID= # Optional override; normally auto-discovered # FRAMEIO_C2C_ACCOUNT_ID= # Pair with explicit folder override