Skip to content

Install

Fanout ships as a single binary and as a multi-architecture container image. Neither needs anything else installed: there is no runtime, no database and no collector to place first.

Terminal window
docker run -d --name fanout \
-p 7520:7520 \
-v fanout-data:/var/lib/fanout/data \
-e FANOUT_AUTH_CODE_SECRET=$(openssl rand -hex 32) \
labstack/fanout:latest

Images are published to Docker Hub as labstack/fanout and mirrored to GitHub Container Registry as ghcr.io/labstack/fanout. The two carry the same digests; pick whichever registry your hosts already pull from.

FANOUT_AUTH_CODE_SECRET is required in the default local auth mode and must be at least 32 characters — the container refuses to start without it. It is the only setting the command above adds; the image ships listener and data-directory defaults of its own. Select FANOUT_AI_PROVIDER=anthropic with ANTHROPIC_API_KEY, or FANOUT_AI_PROVIDER=openai with OPENAI_API_KEY, to enable the chat investigator. Chat is optional and disabled when no provider is selected, even with inherited vendor credentials or endpoints. Selecting a provider requires its key at startup and validates only its endpoint. Without a selected provider, ingest, dashboards, traces, logs, metrics, and MCP continue to work; only investigation chat and AI-assisted controls are hidden.

The image sets FANOUT_ADDR=:7520 and FANOUT_DATA_DIR=/var/lib/fanout/data. Native installs default to 127.0.0.1:7520; set FANOUT_ADDR=:7520 to accept connections from other hosts.

The install script checks the archive for you. If you took one from the releases page by hand, check it yourself — both the checksum and the build provenance:

Terminal window
sha256sum -c SHA256SUMS
gh attestation verify fanout_v2026.8.0_linux_amd64.tar.gz \
--repo labstack/fanout

For containers, record or pin the digest the registry returns rather than trusting a moving tag:

Terminal window
docker buildx imagetools inspect labstack/fanout:2026.8.0

Release images are multi-architecture for linux/amd64 and linux/arm64, and archives cover Linux and macOS on both. Every artifact is built on a native runner, because DuckDB needs cgo.

Image tagPoints at
labstack/fanout:latestthe newest release
labstack/fanout:2026.8.0that exact release
ghcr.io/labstack/fanout:mainthe tip of main
ghcr.io/labstack/fanout:sha-<commit>one specific commit

Release and latest tags also exist under ghcr.io/labstack/fanout. Development tags are GHCR-only.

Standalone signatures and SBOMs are deliberately not published yet — the reasoning is in the repository’s release contract.

Port or pathPurposeNative default
7520Browser, API, chat, MCP, OTLP/gRPC and OTLP/HTTP127.0.0.1:7520, loopback
./dataTelemetry, query state, users, sessions, dashboards, alerts and agent history./data

Every OTLP export requires the ingest token, including on the shared port. Ingest rejects requests before setup completes. Read authenticate exporters before pointing a service at the instance.

Exporters use the shared port 7520 or the public HTTPS origin. Every OTLP export requires the ingest token. A private collector hostname can be entered on Connect telemetry before copying its generated configuration.

If the dashboard is public but ingest must remain LAN-only, keep Fanout’s backend port private and deny /v1, /v1/*, and /opentelemetry.proto.collector.* on the public proxy. Allow collectors through the private network or a restricted proxy route, and verify that neither OTLP transport is reachable through the public origin. One port simplifies deployment; it does not replace this access policy.

The process validates its whole configuration before it opens any listener, so a setting it will not accept is a refusal to start rather than a failure later. First boot covers what it checks, and what it prints once it is running.