Skip to content

Configuration reference

Filearr is configured entirely through environment variables prefixed FILEARR_ (plus the container-level POSTGRES_PASSWORD, MEILI_MASTER_KEY, and MEDIA_PATH). Values load from the process environment and the .env file. This page lists the operationally meaningful settings grouped by area — not every internal knob. Defaults shown are the built-in defaults.

Only override what you need

Every setting has a sensible default. A minimal deployment sets the database / Meili connection strings, the two passwords, MEDIA_PATH, and (if you use alerts) FILEARR_SECRET_KEY. Everything else is tuning.

Optional features

These are the product's opt-in (and one opt-out) feature switches. They are the knobs most people want to find, so every deployment surface now declares them explicitly with their default rather than leaving them to be inferred from the code: the bundled docker-compose.yml sets them on app and worker, .env.example lists them, the Unraid templates expose them as advanced variables, and the Proxmox deploy writes each one into the container's .env (only when the key is absent, so your edits are never overwritten).

Variable Default What turning it on does
FILEARR_SEMANTIC_ENABLED false Semantic / hybrid search. The worker downloads and loads a local ONNX embedding model and embeds items in the background. Off = the model is never loaded, zero cost. Details: Semantic search.
FILEARR_SEMANTIC_QUANTIZE false Store semantic vectors binary-quantized (1 bit/dim, ~10× smaller vector index, slight recall loss) — worth it at millions of embedded items. Turning ON applies in place; turning OFF needs a rebuild-index (Meili cannot un-quantize live).
FILEARR_CONTENT_SNIFF_ENABLED false Unlocks the on-demand "Content-sniff extensionless files" maintenance action: libmagic MIME sniffing over a bounded prefix read, reclassifying files whose extension tells you nothing. Details: Content sniffing.
FILEARR_UPDATE_CHECK_AUTO false Lets the Jobs-page Updates card refresh a stale GitHub release cache by itself. This is the only automatic outbound request the product makes; with it off, the check is manual only. Details: Update check.
FILEARR_THUMBNAIL_BUDGET_GB 5 Advisory thumbnail-cache budget in GiB. Over budget you get an hourly log reminder and an amber note on the Jobs thumbs card — generation continues and nothing is deleted. 0 disables the advisory. Details: Thumbnails.
FILEARR_LOG_DB_ENABLED true (on by default) Records the log stream into Postgres so the console's Logs panel has content. Set false to keep logs in the container output only. Details: Console log stream.
FILEARR_AGENTS_ENABLED false Master switch for the distributed agent fleet surface (enrollment, agent API, fleet monitoring). Needs a CA and further setup. Details: Distributed agents.

Set the feature flags on the worker too

app and worker must agree. The worker is what actually loads the semantic embedder and runs the content-sniff pass; the app only serves the flags to the console. The bundled compose file keeps both in sync automatically — on Unraid it is a single filearr container running both processes, so there is only one place to set it.

Not env vars: OCR and RAG passage chunking are per-library toggles you flip in the console's library settings (their FILEARR_OCR_* / FILEARR_CHUNK_* variables only tune the behaviour once a library opts in) — see OCR and RAG passage chunking.

The console's Jobs page carries an "Optional features" card showing the live state of each of these switches in the running process, which is the fastest way to confirm a change actually reached the containers.

Core / connections

Variable Default Purpose
FILEARR_DATABASE_URL postgresql+psycopg://filearr:filearr@postgres:5432/filearr SQLAlchemy DSN (source of truth).
FILEARR_PROCRASTINATE_DSN postgresql://filearr:filearr@postgres:5432/filearr Job-queue DSN.
FILEARR_MEILI_URL http://meilisearch:7700 Meilisearch endpoint.
FILEARR_MEILI_MASTER_KEY change-me Meilisearch master key.
FILEARR_MEILI_INDEX items Index name.
FILEARR_CONFIG_DIR /config Thumbnails, caches, models, exports, staging.
FILEARR_LOG_LEVEL INFO Log verbosity.
FILEARR_SOURCE_URL GitHub repo URL AGPL §13 "Source" link (point at your fork).
FILEARR_SECRET_KEY (unset) Envelope key for alert-channel secret encryption (required for alerts; never auto-rotated).
FILEARR_PUBLIC_BASE_URL (unset) Absolute prefix for export/report download links; blank = site-relative.
FILEARR_SHARE_MAP_PATH /config/share-map.json Deploy-written share map for auto share locations.
FILEARR_AUTO_INIT_DB true Container-level (entrypoint, app command only): run the idempotent scripts/init_db.py bootstrap on start, retrying while Postgres comes up. Set false to manage migrations manually.

Authentication & sessions

Variable Default Purpose
FILEARR_AUTH_ENABLED true Master switch for auth.
FILEARR_SESSION_TTL_HOURS 720 Absolute session lifetime (30d).
FILEARR_SESSION_INACTIVITY_HOURS 168 Idle window (7d).
FILEARR_SESSION_ROTATION_MINUTES 10 Opaque-token rotation cadence.
FILEARR_SESSION_COOKIE_SAMESITE lax lax (SSO-safe) / strict / none.
FILEARR_AUTH_RATELIMIT_ENABLED true Brute-force limiter.
FILEARR_AUTH_RATELIMIT_MAX_ATTEMPTS 3 Failures per window → lock.
FILEARR_AUTH_RATELIMIT_WINDOW_SECONDS 120 Find window.
FILEARR_AUTH_RATELIMIT_LOCK_SECONDS 300 Lockout duration.
FILEARR_TRUSTED_PROXIES (unset) Comma-separated IPs/CIDRs of reverse proxies whose X-Forwarded-For is believed (real client IPs in the audit log, sessions and rate limit). Not needed for the shipped Caddy sidecar — it proves itself with X-Filearr-Proxy-Trust = FILEARR_PROXY_SHARED_SECRET.
FILEARR_AUTH_RATELIMIT_TRUST_FORWARDED_FOR false Legacy: trust the leftmost X-Forwarded-For unconditionally. Prefer the two mechanisms above.
FILEARR_AUDIT_READS false Record a per-query search event (high volume).

OIDC (FILEARR_OIDC_*) and LDAP (FILEARR_LDAP_*) are extensive provider configs; both default off. As of 2026-08-20 they are also configurable from the console (Admin → Authentication) — a value saved in the GUI overrides the matching env var per field, and each field shows its source (gui | env). The env vars remain the bootstrap/fallback (so the first admin can still sign in) and are ideal for infrastructure-as-code; the GUI is the day-to-day surface, with pre-save Test actions (LDAP bind + sample enumeration, OIDC discovery fetch). Secrets saved via the GUI are encrypted at rest under FILEARR_SECRET_KEY. See Security for the model and the source config.py for every field.

AD/LDAP directory sync (central-only; resolves agent-pushed permission SIDs into named identities — see directory sync):

Variable Default Purpose
FILEARR_LDAP_DIRECTORY_SYNC_ENABLED false Master switch for the directory enumeration + SID reconciliation. Needs a service bind (FILEARR_LDAP_BIND_DN/_PASSWORD).
FILEARR_LDAP_DIRECTORY_USER_BASE / _GROUP_BASE (falls back to FILEARR_LDAP_USER_BASE/_GROUP_BASE) Search bases for the user and group enumeration passes.
FILEARR_LDAP_DIRECTORY_USER_FILTER / _GROUP_FILTER (objectClass=user) / (objectClass=group) Object-class filters (AD defaults; OpenLDAP: posixAccount/posixGroup).
FILEARR_LDAP_ATTR_OBJECT_SID / _OBJECT_GUID objectSid / objectGUID Binary identity attributes (decoded to canonical string forms).
FILEARR_LDAP_ATTR_DISPLAY_NAME / _SAM / _UPN / _MEMBER_OF_DIR displayName / sAMAccountName / userPrincipalName / memberOf Attribute names.
FILEARR_LDAP_DIRECTORY_DOMAIN (derived from the DN's first dc=) NetBIOS/DNS domain rendered into DOMAIN\name canonical ids.
FILEARR_LDAP_DIRECTORY_PAGE_SIZE 500 Paged-search page size (AD caps at 1000).
FILEARR_LDAP_DIRECTORY_MAX_OBJECTS 500000 Backstop against a runaway base DN.
FILEARR_LDAP_DIRECTORIES [] Cross-forest / multi-domain. JSON list of additional directory endpoints, each its own bind: [{"server":"ldaps://dc.acme:636","bind_dn":"…","bind_password":"…","user_base":"dc=acme,dc=com","domain":"ACME","label":"acme"}]. Omitted keys fall back to the globals. Empty = the single global config is the one endpoint. Multi-domain within a forest: point one endpoint at a Global Catalog (:3269). See multi-domain and cross-forest.

The sync task Sync AD/LDAP directory (Jobs page, default cron 40 3 * * *, editable) and POST /api/v1/directory/sync run it; GET /api/v1/directory/status shows reconciliation health.

Scanning & hashing

Variable Default Purpose
FILEARR_SCAN_HASH_FULL_MAX_BYTES 1073741824 Skip the full content hash above this size (1 GiB).
FILEARR_SCAN_EMPTY_GUARD true Refuse (fail, tombstone nothing) a full scan that sees zero entries over a previously populated library; per-run override ?force_empty=true on the scan endpoint.
FILEARR_SCAN_CROSS_LIBRARY_MOVES true Match unmatched new files against missing tombstones in other libraries and revive identity when byte-confirmed.
FILEARR_WATCH_INCREMENTAL true A small watch-mode event batch triggers a scoped incremental scan instead of a full library scan.
FILEARR_WATCH_INCREMENTAL_MAX_EVENTS 64 Batch size above which watch mode falls back to a full scan.
FILEARR_HASH_BACKFILL_MAX_BYTES 21474836480 Per-run byte budget of the opt-in Backfill content hashes maintenance task (20 GiB).
FILEARR_HASH_BACKFILL_RATE_MBPS 50 Average throughput cap for that task (MB/s; 0 = unthrottled).
FILEARR_SCAN_BATCH_SIZE 500 Files per batch commit.
FILEARR_RECYCLE_RETENTION_DAYS 30 Recycle-bin retention before purge.
FILEARR_STAGED_PIPELINE true Defer all extraction to scan end (vs trickle during walk).
FILEARR_SIDECAR_METADATA_PRIORITY fill fill = a Kodi NFO / JRiver sidecar only fills an empty title/year; sidecar = it overwrites them (sidecar is the authority). Raw values always kept under nfo_*/jr_*.
FILEARR_PROVENANCE_ENABLED true Read download-origin xattrs (user.xdg.origin.url, kMDItemWhereFroms) into origin_url/referrer_url during extract. One listxattr per file.
FILEARR_AUDIT_RETENTION_DAYS 90 Retention for extractor-sourced item audit rows (user edits exempt).
FILEARR_BACKUP_KEEP 7 Bundles the in-app backup keeps in {config}/backups. Matters more than it looks: those bundles sit on the volume the disk monitor watches. (scripts/backup.sh reads the same number from its own BACKUP_KEEP.)

Workers, queues & the reaper

Variable Default Purpose
FILEARR_WORKER_CONCURRENCY 4 Parallel jobs per worker.
FILEARR_WORKER_QUEUES (all) Comma-separated queues a worker serves.
FILEARR_JOB_HISTORY_RETENTION_DAYS 14 Purge terminal job rows older than this.
FILEARR_JOB_STALL_HEARTBEAT_SECONDS 30 Heartbeat net for stalled jobs.
FILEARR_JOB_STALL_SECONDS 3600 Age net: a per-file/index/alert job still doing after this long is reaped even if its worker is alive. Whole-catalog jobs (scan_library, nightly_reconcile, rebuild_index, reproject_library, rebuild_chunks_index, embed_missing, chunk_missing, backup_now, compact_meili, content_sniff, rehash_small_files) are exempt — they legitimately run for hours and are reaped only by the heartbeat net.
FILEARR_JOB_STALL_AGE_EXEMPT_TASKS [] Extra task names (JSON list) to exempt from the age net.
FILEARR_REAP_MAX_ATTEMPTS 10 Requeue budget for a stalled non-scan job before it is failed.
FILEARR_SCAN_SCHEDULE_MAX_CATCHUP_MINUTES 2880 Furthest-back missed cron a recovery tick fires (48h).
FILEARR_SCAN_RUN_RECONCILE_GRACE_SECONDS 600 Grace before finalizing an orphaned scan run.

Container-level variables, read by the entrypoint rather than the app

These two are consumed by the image's entrypoint script, so they do not appear in the settings object or on the About page.

Variable Default Purpose
FILEARR_AUTO_INIT_DB true Run the idempotent database bootstrap on start. false if you run scripts/init_db.py yourself.
FILEARR_STOP_GRACE_SECONDS 60 Merged mode only. How long the supervisor waits for the worker to finish in-flight jobs after SIGTERM before SIGKILL.

Merged mode is what the container does when its command is the single word all: it bootstraps the database once, then runs uvicorn and a Procrastinate worker as children of one supervisor, forwarding signals to both and taking the container down if either dies. It is how the Unraid template ships. Docker Compose deliberately does not use it — separate app and worker services keep docker compose up -d --scale worker=N available, which one supervised container cannot express.

FILEARR_STOP_GRACE_SECONDS must be ≤ the container's own stop timeout (stop_grace_period: 60s in compose, --stop-timeout=60 in the Unraid template's Extra Parameters), or Docker kills the container before the grace can elapse. 60 s is not arbitrary: the 10 s default regularly cut Procrastinate jobs off mid-transaction during redeploys.

Adaptive extract backpressure

Each worker varies how many extract jobs it runs at once: host load contracts the ceiling, extract-queue depth expands it. Full behaviour, the log lines it emits, and when to intervene: extraction throughput. Inert on hosts without a load average (Windows dev).

Variable Default Purpose
FILEARR_EXTRACT_BACKPRESSURE true Master switch for the controller (the static queue priority is unaffected).
FILEARR_EXTRACT_BACKPRESSURE_MIN_CONCURRENCY 1 Floor: extract jobs this worker keeps running under any load.
FILEARR_EXTRACT_BACKPRESSURE_MAX_CONCURRENCY 0 (auto) Ceiling cap; 0 = use FILEARR_WORKER_CONCURRENCY. Set explicitly if you pass --concurrency without matching that variable.
FILEARR_EXTRACT_BACKPRESSURE_HIGH_LOAD 0.85 1-min loadavg per core at which the ceiling contracts.
FILEARR_EXTRACT_BACKPRESSURE_LOW_LOAD 0.60 Recovery threshold (hysteresis); expansion happens only at or below it.
FILEARR_EXTRACT_BACKPRESSURE_SAMPLE_SECONDS 15 Sampling cadence — also the minimum dwell between same-direction moves.
FILEARR_EXTRACT_BACKPRESSURE_DECREASE_FACTOR 0.5 Multiplicative decrease per sample under pressure (halve, not collapse to the floor).
FILEARR_EXTRACT_BACKPRESSURE_EXPAND_COOLDOWN_SECONDS 60 No expansion for this long after a contraction (the 1-min loadavg lags by about its own window).

Console log stream (Jobs page Logs panel)

App and worker each persist selected log records to a shared table so the Jobs page shows one unified activity/error stream (the two processes are separate containers). filearr.* loggers record at the configured level (the activity stream); every other logger records warnings and up only; per-request access lines are never recorded. The sink is fail-open: a broken database drops records rather than blocking the application.

Variable Default Purpose
FILEARR_LOG_DB_ENABLED true Record the log stream at all.
FILEARR_LOG_DB_LEVEL INFO Threshold for filearr.* loggers.
FILEARR_LOG_RETENTION_DAYS 7 Daily purge window for log rows.
FILEARR_LOG_MAX_ROWS 200000 Hard row cap (log-storm backstop).

Update check (Jobs page Updates card)

Compares the running build and the baked agent binaries against the source repository's head and pulls recent commit messages (the changelog) for review in the console. Contacts GitHub only — nothing about your instance or catalog is sent. By default it runs solely when an operator clicks Check now; results are cached for 6 hours.

Variable Default Purpose
FILEARR_UPDATE_CHECK_AUTO false Opt-in: also refresh a stale cache on console loads (the only automatic outbound check in the product).

Search reconciliation & rebuild

Variable Default Purpose
FILEARR_MEILI_SEARCH_CUTOFF_MS 1500 Per-search wall-clock circuit breaker.
FILEARR_RECONCILE_MAX_FIXES 10000 Cap on repairs per hourly reconcile sweep.
FILEARR_MEILI_REBUILD_WAIT_S 900 Total wait budget for a shadow rebuild before it fails cleanly.
FILEARR_PERMISSION_SNAPSHOTS_RETAIN 10 Newest snapshots kept per (agent, path) in permission_snapshots (the permissions inventory collector). An unchanged re-collection writes nothing regardless.
FILEARR_MEILI_WRITE_ACK_SECONDS 30 Every document write (sync, reconcile, re-project, delete) waits up to this long for its Meilisearch task and fails the job with Meili's own error if the task finished failed — the write is no longer fire-and-forget. A task still queued when the budget runs out is trusted (a busy queue is normal), so this never stalls on a slow index; 0 restores fire-and-forget.
FILEARR_MEILI_SHADOW_MAX_AGE_HOURS 6 Age at which an orphaned shadow index is reaped.
FILEARR_MEILI_SCOPE_FILTER_CEILING 4096 Max compiled RBAC scope-filter length (over → refuse).
FILEARR_MEILI_COMPACTION_ENABLED true Run the weekly search-index compaction.
FILEARR_MEILI_COMPACTION_THRESHOLD 1.3 Fragmentation ratio (store size ÷ used size) above which it compacts.
FILEARR_MEILI_COMPACTION_WAIT_S 1800 Wait budget for the compaction task; a timeout is reported, not failed.
FILEARR_MEILI_DATA_PATH (unset) Meili store path, when visible to this process — checked against the critical disk floor before compacting (compaction needs ~2× the index size).

Extraction limits (safety caps)

Per-library overrides: each library can override these limits — the timeouts (FILEARR_EXTRACT_TIMEOUT_SECONDS, FILEARR_FFPROBE_TIMEOUT_S) and the size/decompression ceilings (FILEARR_DOCUMENT_MAX_BYTES, FILEARR_DOC_DECOMPRESSED_MAX, FILEARR_DOC_DECOMPRESSION_RATIO, FILEARR_DOC_DECOMPRESSION_RATIO_MIN_BYTES, FILEARR_MODEL3D_MAX_BYTES, FILEARR_EMAIL_MAX_BYTES) — under Extraction limits in the library's edit form (or extract_overrides on the libraries API). A 3D-print library full of multi-GiB zips can raise its decompression ceiling without loosening the guard for every other share. Blank/absent fields keep the global value; changes apply to future extractions (use retry on failed items to re-run them under the new limits).

Variable Default Purpose
FILEARR_FFPROBE_TIMEOUT_S 30 ffprobe wall-clock cap.
FILEARR_FFPROBE_DEEP_HDR true For HDR streams only, read the first frames' side data (one extra bounded ffprobe) to distinguish HDR10+ and capture MaxCLL/MaxFALL + mastering display.
FILEARR_MODEL3D_MAX_BYTES 536870912 Mesh size ceiling handed to trimesh (512 MiB).
FILEARR_MODEL3D_ACCURATE_MAX_BYTES 0 Opt-in "accurate geometry" tier: files up to this size load with process=True (vertex merge/repair → true vertex counts and watertight flag). 0 = off.
FILEARR_EMAIL_MAX_BYTES 268435456 Size ceiling for one .eml / .msg / .mbox handed to the e-mail extractor.
FILEARR_EMAIL_MBOX_MAX_MESSAGES 5000 Messages summarised per mailbox before the listing is marked truncated.
FILEARR_DOCUMENT_MAX_BYTES 268435456 Doc/spreadsheet size ceiling.
FILEARR_DIGEST_MAX_BYTES 53687091200 On-demand MD5/SHA-256 size ceiling (50 GiB).
FILEARR_ARCHIVE_MAX_MEMBERS 10000 Archive member-listing cap.

EXIF / GPS

Variable Default Purpose
FILEARR_GPS_EXPOSE_DEFAULT false Per-library GPS-exposure default (no global default-on).
FILEARR_EXIF_TIMEOUT_S 30 exiftool wall-clock cap.

A library's expose_gps flag is also what puts a _geo point in the search index, so it is the on/off switch for geo search. Turning it off queues a re-projection that removes the coordinates already indexed for that library. There is no environment variable that can expose GPS globally — only the per-library flag.

OCR (per-library opt-in)

Variable Default Purpose
FILEARR_OCR_ENABLED false Global default off (per-library toggle gates it).
FILEARR_OCR_MAX_PAGES 10 Scanned-PDF page ceiling.
FILEARR_OCR_TIMEOUT_S 120 Per-subprocess wall clock.
FILEARR_OCR_LANG eng Tesseract language.

Content sniffing (opt-in)

Variable Default Purpose
FILEARR_CONTENT_SNIFF_ENABLED false Enables the on-demand "Content-sniff extensionless files" maintenance action (libmagic MIME → taxonomy reclassify).
FILEARR_CONTENT_SNIFF_BATCH 5000 Candidates per run (idempotent — run again while remaining > 0).
FILEARR_CONTENT_SNIFF_READ_BYTES 65536 Bounded prefix read per file.

Semantic search (opt-in)

Variable Default Purpose
FILEARR_SEMANTIC_ENABLED false Load the local ONNX embedder (off = zero cost).
FILEARR_EMBED_MODEL BAAI/bge-small-en-v1.5 Local embedding model (downloaded once).
FILEARR_EMBEDDER_CONCURRENCY 1 One memory-capped, lowest-priority worker.
HF_TOKEN (unset) Optional Hugging Face access token used ONLY for the one-off model download (higher anonymous rate limit, no "unauthenticated requests" warning). Leave blank — or any placeholder such as none — to download anonymously; a blank/placeholder is never sent as a token. This is the Hub's own variable name, so it is picked up by anything else in the container that talks to Hugging Face. Treated as a secret in the deployment templates (masked on Unraid, CT .env only on Proxmox).

RAG passage chunking (per-library opt-in)

Variable Default Purpose
FILEARR_CHUNK_SIZE_CHARS 1000 Passage window for the doc_chunks store (LLM retrieve_passages).
FILEARR_CHUNK_OVERLAP_CHARS 150 Overlap between consecutive passages.
FILEARR_CHUNK_MAX_PER_ITEM 200 Chunk cap per document.
FILEARR_CHUNK_BACKFILL_BATCH 2000 Items per "Chunk documents for RAG" run.

Natural-language query assist

Variable Default Purpose
FILEARR_NL_OLLAMA_URL (unset) Local Ollama endpoint (e.g. http://ollama:11434) to upgrade POST /query/assist beyond the built-in heuristic; heuristic remains the automatic fallback.
FILEARR_NL_OLLAMA_MODEL qwen2.5:7b Model name used for translation.

Frecency personal ranking

Variable Default Purpose
FILEARR_FRECENCY_ENABLED true Per-principal frequency+recency profile from item-detail opens; bounded page-local lift of habitual items in default-relevance search. Disable to stop recording AND reading.

Thumbnails

Variable Default Purpose
FILEARR_THUMBS_ENABLED true Generate WebP thumbnails / posters.
FILEARR_THUMBNAIL_GRID_PX 320 Grid tier longest edge.
FILEARR_THUMBNAIL_PREVIEW_PX 800 Preview tier longest edge.
FILEARR_THUMB_ACCEL auto auto (QSV if /dev/dri present) / off.
FILEARR_THUMBNAIL_BUDGET_GB 5 Advisory cache-size budget in GiB (0 disables). Over it: an hourly log reminder + an amber note on the Jobs thumbs card — generation continues, nothing is deleted (disk-floor GC is separate).

Disk guardrails

Variable Default Purpose
FILEARR_DISK_MONITOR_ENABLED true Master switch for the 5-minutely disk monitor (low-space alerts + Jobs-page tiles).
FILEARR_DISK_MIN_FREE_GB 5 Critical below this (absolute floor).
FILEARR_DISK_WARN_FREE_GB 20 Warn below this (absolute floor).
FILEARR_DISK_CRIT_PCT_FREE 2 Critical below this percent free.
FILEARR_DISK_WARN_PCT_FREE 10 Warn below this percent free.
FILEARR_DISK_PG_PATH (unset; compose sets /pgdata) Postgres data path to watch; when critical, extract pauses. The bundled docker-compose.yml mounts the pgdata volume read-only into app/worker and points this at it.
FILEARR_DISK_GC_TARGET_FREE_GB 0 >0 LRU-evicts valid thumbnails to this target at critical.

Distributed agents (all off unless enabled)

Variable Default Purpose
FILEARR_AGENTS_ENABLED false Master switch for the agent fleet surface.
FILEARR_ENROLLMENT_TOKEN_TTL_MINUTES 60 Single-use enrollment-token TTL.
FILEARR_CA_URL (unset) step-ca URL handed to agents.
FILEARR_CA_FINGERPRINT (unset) Public root fingerprint (pin).
FILEARR_CA_PROVISIONER filearr-agents Provisioner name.
FILEARR_CA_PROVISIONER_JWK (unset) Secret — decrypted private JWK; without it ca_ott is null.
FILEARR_AGENT_CERT_TTL_HOURS 48 Advisory agent cert lifetime (24–72h band).
FILEARR_AGENT_AUTH_MODE fingerprint fingerprint / mtls-header / both.
FILEARR_PROXY_SHARED_SECRET (unset) Secret — proxy ↔ backend trust: Caddy stamps it on X-Filearr-Proxy-Trust (real client IPs behind the proxy) and X-Filearr-Proxy-Auth (required for the mtls agent-auth modes). Set on both containers.
FILEARR_AGENT_OFFLINE_ALERT_SECONDS 172800 Agent-offline alert threshold (48h).
FILEARR_AGENT_REPLICATION_STALL_ALERT_SECONDS 21600 Replication-stall alert threshold (6h).
FILEARR_AGENT_DIST_DIR /app/agent-dist First-install agent binaries + install scripts served by /api/v1/agent-dist (baked into the image; the API 404s gracefully when absent).
FILEARR_AGENT_ASSOCIATE_DEBOUNCE_SECONDS 120 Debounce for the post-replication sidecar-association pass on agent-backed libraries.
FILEARR_AGENT_EXTRACTED_MAX_BYTES 262144 Cap on the extracted object one replication event may carry (agent-side extraction). Oversize is dropped with a warning and the event still applies.
FILEARR_AGENT_RELEASES_DIR {config_dir}/agent-releases Uploaded signed-release artifact binaries (manifests live in Postgres).

There is no release-staging variable

Every uploaded release is generally visible once its artifacts are present. Who actually takes one is decided by the auto_update key in a configuration group, plus the per-agent update action — not by an environment variable.

Alerting

Variable Default Purpose
FILEARR_WEBHOOK_ALLOW_PRIVATE_CIDRS false Permit RFC1918/ULA webhook targets (loopback/link-local still denied).
FILEARR_WEBHOOK_ALLOWED_CIDRS (unset) Comma-separated IPs/CIDRs a webhook may target regardless of class — the precise alternative to the switch above (127.0.0.1/32 for a local ntfy, 10.0.0.5/32 for a Gotify box). A hostname whose DNS answers mix an allowed and a blocked address is still refused.
FILEARR_ALERT_WEBHOOK_TIMEOUT_S 10 Per-POST wall clock.
FILEARR_ALERT_APPRISE_TIMEOUT_S 30 Per-send wall clock for an Apprise channel (one channel may hold several URLs, walked sequentially).
FILEARR_ALERT_RULE_MAX_PER_HOUR 100 Per-rule dispatch ceiling (storm safety net).
FILEARR_ALERT_GROUP_INTERVAL_S 300 Minimum gap before an already-notified group with NEW matches is re-notified.
FILEARR_ALERT_DIGEST_MAX_EVENTS 50 Paths enumerated in one grouped/digest body before an "and N more" tail.
FILEARR_ALERT_MAX_DELIVERY_ATTEMPTS 5 Transient-failure retries per batch before it goes terminal (failed).
FILEARR_ALERT_SIGNATURE_MAX_AGE_S 300 Freshness window baked into the webhook X-Filearr-Signature (receivers should reject older timestamps).
FILEARR_ALERT_WEBHOOK_MAX_RESPONSE_BYTES 65536 Response-body cap read from a webhook endpoint.
FILEARR_ALERT_ERROR_SPIKE_THRESHOLD 50 Seeded threshold of System: extract-error spike (errors added per library within the window).
FILEARR_ALERT_ERROR_SPIKE_WINDOW_S 3600 Its rolling window.
FILEARR_ALERT_EVENTS_RETENTION_DAYS 30 Terminal alert-event retention.

For the complete, authoritative list see backend/filearr/config.py.