Skip to content

Storage settings

Every setting below is read once at startup and requires a restart to change. Built-in defaults are overridden by nonempty environment values. Unknown FANOUT_ names fail startup; platform-injected service names are tolerated. Custom names use FANOUT_ plus a clear name, adding the area only when it clarifies. Vendor credentials and endpoints keep the vendor’s documented names.

Environment variableTypeDefault
FANOUT_DATA_DIRstring./data
FANOUT_DUCKDB_MAX_CONNECTIONSinteger0
FANOUT_DUCKDB_MEMORYstring—
FANOUT_DUCKDB_THREADSinteger0
FANOUT_MAINTENANCE_INTERVALduration1h
FANOUT_RETENTION_DAYSinteger30
FANOUT_ROLLUP_INTERVALduration1m
FANOUT_ROLLUP_SKIP_TO_LATESTbooleanfalse

Stores telemetry, query state, and the control database.

Caps the DuckDB connection pool. Reads scan immutable Parquet concurrently; rollup-cache writes are serialized by the query write gate. Zero means “size it from the machine” — the same spelling DuckDBThreads uses for deferring to a default. Resolution happens in resolveSizing and is reported in the startup configuration log.

Caps DuckDB’s memory (e.g. “8GB”). Empty means Fanout sizes it from detected memory, reserving headroom for the Go runtime; see resolveSizing. DuckDB’s own default is 80% of detected RAM, which is calculated as though DuckDB owned the machine and has been observed to get the process OOM-killed once the Go heap is added on top.

Caps DuckDB’s global query worker pool. Zero leaves DuckDB’s own default in place (one worker per core). Set it to leave cores free for ingest on a query-heavy co-tenant host.

Controls Parquet retention and compaction, and query-cache checkpointing.

Sets telemetry retention in days; zero disables expiry.

Schedules analytical rollups; use a Go duration of at least 1s.

RollupSkipToLatest, set once at boot, advances the service and edge rollup watermarks to the current max ingested timestamp. Existing history is not aggregated into those analytical rollups. Completed-batch trace caches still rebuild all retained history in bounded passes; uncached files remain immediately queryable. Useful for large pre-seeded datasets (benchmarks, restores); off in normal operation.