Install SigNoz on Docker Swarm - Self-Hosted Setup

Self-Hosted Community - This page applies to self-hosted SigNoz without a license.
Choose SigNoz Cloud for ease, or self-host for control—with the freedom to switch as your needs grow.

This guide explains how to install SigNoz on a Docker Swarm cluster. Foundry generates a stack Compose file from your configuration and deploys it across the swarm with docker stack deploy.

Prerequisites

  • A Docker Swarm cluster with Swarm mode initialized (docker swarm init) and at least one manager node.
  • Docker Engine 20.10+ on each node.
  • At least 4GB of memory available per node.
  • Open ports: 8080 (SigNoz UI), 4317 and 4318 (OTLP ingestion).

Install SigNoz

Step 1: Install foundryctl

curl -fsSL https://signoz.io/foundry.sh | bash

For manual install (Windows PowerShell, air-gapped, etc.) or PATH setup, see the foundry getting-started guide.

Step 2: Create casting.yaml

Create a casting file that targets Docker Swarm with flavor: swarm and mode: docker:

apiVersion: v1alpha1
kind: Installation
metadata:
  name: signoz
spec:
  deployment:
    flavor: swarm
    mode: docker

For all configuration options, see the casting file reference and the Docker Swarm example.

Step 3: Deploy

Run this on a swarm manager node:

foundryctl cast -f casting.yaml

Step 4: Verify the installation

Monitor the stack until the long-running services report their full replica count:

docker stack services signoz

The output should look similar to the following:

ID             NAME                                                   MODE         REPLICAS   IMAGE                                 PORTS
umo0h2zcccyl   signoz_ingester                                        replicated   1/1        signoz/signoz-otel-collector:latest   *:4317-4318->4317-4318/tcp
9nrnfpyx7ioc   signoz_signoz-metastore-postgres-0                     replicated   1/1        postgres:16
h6obimnoj110   signoz_signoz-signoz-0                                 replicated   1/1        signoz/signoz:latest                  *:8080->8080/tcp
gyf7woac9m4p   signoz_signoz-telemetrykeeper-clickhousekeeper-0       replicated   1/1        clickhouse/clickhouse-keeper:25.5.6
oxx2l13lvwdd   signoz_signoz-telemetrystore-clickhouse-0-0            replicated   1/1        clickhouse/clickhouse-server:25.5.6
e65ymxjial3p   signoz_signoz-telemetrystore-clickhouse-user-scripts   global       0/0        clickhouse/clickhouse-server:25.5.6
pofn1bs2qzpj   signoz_signoz-telemetrystore-migrator                  replicated   0/1        signoz/signoz-otel-collector:latest

Docker prefixes every service with the stack name (signoz_). The five long-running services should reach 1/1. The two bootstrap jobs run once and then stop, which is expected: …clickhouse-user-scripts runs in global mode and shows 0/0 after finishing, and …migrator shows 0/1 after its run. Confirm it finished without errors (see Troubleshooting).

Confirm the SigNoz backend is healthy:

curl http://localhost:8080/api/v1/health

A healthy backend returns {"status":"ok"}. Because Swarm publishes the port through its routing mesh, the UI is reachable on port 8080 of any node in the swarm. Open http://<NODE-IP>:8080/ (use http://localhost:8080/ on a single-node swarm).

Troubleshooting

foundryctl cast or docker stack deploy fails to deploy the stack

Deploying a stack requires Docker to be running, Swarm mode to be active, and the command to run on a manager node; a non-manager node fails with this node is not a swarm manager. Check all three at once:

docker info --format 'Swarm: {{.Swarm.LocalNodeState}} | Manager: {{.Swarm.ControlAvailable}}'
  • Swarm: active means Swarm mode is on. If it reads inactive, initialize it with docker swarm init (or join an existing swarm).
  • Manager: true means this node is a manager. If it reads false, run the deploy from a manager node instead.

A service keeps restarting right after deploy

Docker Swarm starts every service in parallel and does not honor depends_on. Until ClickHouse and Postgres are ready, dependent services such as signoz_signoz-signoz-0 and signoz_signoz-telemetrystore-migrator may fail and restart a few times before they settle. Inspect any service that does not recover:

docker stack ps signoz                                       # per-task state and last error
docker service logs signoz_signoz-telemetrystore-migrator    # full logs for one service

To redeploy from a clean slate, remove the stack and run cast again (this keeps the named data volumes):

docker stack rm signoz
foundryctl cast -f casting.yaml

Next Steps

Is this page helpful

Last updatedJune 24, 2026

Edit on GitHub