name: signoz services: # =========================================================================== # ZooKeeper — required for ClickHouse coordination # =========================================================================== zookeeper-1: image: signoz/zookeeper:${ZOOKEEPER_VERSION:-3.7.1} container_name: signoz-zookeeper-1 restart: unless-stopped user: root labels: signoz.io/scrape: "true" signoz.io/port: "9141" signoz.io/path: "/metrics" environment: ZOO_SERVER_ID: "1" ALLOW_ANONYMOUS_LOGIN: "yes" ZOO_AUTOPURGE_INTERVAL: "1" ZOO_ENABLE_PROMETHEUS_METRICS: "yes" ZOO_PROMETHEUS_METRICS_PORT_NUMBER: "9141" volumes: - ./zookeeper-data:/bitnami/zookeeper logging: options: max-size: 50m max-file: "3" healthcheck: test: - CMD-SHELL - curl -s -m 2 http://localhost:8080/commands/ruok | grep error | grep null interval: 30s timeout: 5s retries: 3 networks: - signoz # =========================================================================== # Init ClickHouse — installs histogramQuantile user script # =========================================================================== init-clickhouse: image: clickhouse/clickhouse-server:${CLICKHOUSE_VERSION:-25.5} container_name: signoz-init-clickhouse restart: on-failure command: - bash - -c - | version="v0.0.1" # Hardcode linux/amd64 for Unraid x86_64 (uname may be unavailable in slim image) node_os="linux" node_arch="amd64" echo "Fetching histogram-binary for $${node_os}/$${node_arch}" cd /tmp wget -O histogram-quantile.tar.gz "https://github.com/SigNoz/signoz/releases/download/histogram-quantile%2F$${version}/histogram-quantile_$${node_os}_$${node_arch}.tar.gz" || true tar -xvzf histogram-quantile.tar.gz 2>/dev/null || true mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile 2>/dev/null || true echo "Done (non-critical if download failed — migrator will handle it)." volumes: - ./clickhouse/user_scripts:/var/lib/clickhouse/user_scripts logging: options: max-size: 50m max-file: "3" networks: - signoz # =========================================================================== # ClickHouse — columnar storage for all telemetry data # =========================================================================== clickhouse: image: clickhouse/clickhouse-server:${CLICKHOUSE_VERSION:-25.5} container_name: signoz-clickhouse restart: unless-stopped tty: true labels: signoz.io/scrape: "true" signoz.io/port: "9363" signoz.io/path: "/metrics" depends_on: init-clickhouse: condition: service_completed_successfully zookeeper-1: condition: service_healthy environment: CLICKHOUSE_SKIP_USER_SETUP: "1" volumes: - ./clickhouse/config.xml:/etc/clickhouse-server/config.xml:ro - ./clickhouse/users.xml:/etc/clickhouse-server/users.xml:ro - ./clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml:ro - ./clickhouse/user_scripts:/var/lib/clickhouse/user_scripts:ro - ./clickhouse/config.d/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml:ro - ./clickhouse-data:/var/lib/clickhouse logging: options: max-size: 50m max-file: "3" healthcheck: test: - CMD - wget - --spider - -q - 0.0.0.0:8123/ping interval: 30s timeout: 5s retries: 3 ulimits: nproc: 65535 nofile: soft: 262144 hard: 262144 networks: - signoz # =========================================================================== # SigNoz — query service + UI # =========================================================================== signoz: image: signoz/signoz:${SIGNOZ_VERSION:-v0.128.0} container_name: signoz restart: unless-stopped depends_on: clickhouse: condition: service_healthy environment: SIGNOZ_ALERTMANAGER_PROVIDER: signoz SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN: tcp://clickhouse:9000 SIGNOZ_SQLSTORE_SQLITE_PATH: /var/lib/signoz/signoz.db SIGNOZ_TOKENIZER_JWT_SECRET: ${SIGNOZ_JWT_SECRET:-change-me-jwt-secret} ports: # SigNoz UI - ${EXPOSE_SIGNOZ_UI_PORT:-8080}:8080 volumes: - ./signoz-data:/var/lib/signoz logging: options: max-size: 50m max-file: "3" healthcheck: test: - CMD - wget - --spider - -q - localhost:8080/api/v1/health interval: 30s timeout: 5s retries: 3 start_period: 30s networks: signoz: {} pipeline: aliases: - signoz # swag: # aliases: # - signoz # =========================================================================== # OTEL Collector — receives OTLP from all stacks # =========================================================================== otel-collector: image: signoz/signoz-otel-collector:${OTELCOL_VERSION:-v0.144.5} container_name: signoz-otel-collector restart: unless-stopped depends_on: clickhouse: condition: service_healthy entrypoint: - /bin/sh command: - -c - | /signoz-otel-collector migrate sync check && /signoz-otel-collector --config=/etc/otel-collector-config.yaml --manager-config=/etc/manager-config.yaml --copy-path=/var/tmp/collector-config.yaml volumes: - ./otel-collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro - ./otel-collector/manager-config.yaml:/etc/manager-config.yaml:ro environment: OTEL_RESOURCE_ATTRIBUTES: host.name=signoz-host,os.type=linux LOW_CARDINAL_EXCEPTION_GROUPING: "false" SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN: tcp://clickhouse:9000 SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER: cluster SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION: "true" SIGNOZ_OTEL_COLLECTOR_TIMEOUT: 10m ports: # OTLP gRPC receiver - ${EXPOSE_OTLP_GRPC_PORT:-4317}:4317 # OTLP HTTP receiver - ${EXPOSE_OTLP_HTTP_PORT:-4318}:4318 logging: options: max-size: 50m max-file: "3" networks: signoz: {} pipeline: aliases: - signoz-otel-collector - otel - lgtm # =========================================================================== # Telemetry Store Migrator — runs ClickHouse migrations # =========================================================================== signoz-telemetrystore-migrator: image: signoz/signoz-otel-collector:${OTELCOL_VERSION:-v0.144.5} container_name: signoz-telemetrystore-migrator restart: on-failure depends_on: clickhouse: condition: service_healthy environment: SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN: tcp://clickhouse:9000 SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER: cluster SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION: "true" SIGNOZ_OTEL_COLLECTOR_TIMEOUT: 10m entrypoint: - /bin/sh command: - -c - | echo "Waiting 30s for ClickHouse cluster to stabilize..." && sleep 30 && /signoz-otel-collector migrate bootstrap && /signoz-otel-collector migrate sync up && /signoz-otel-collector migrate async up logging: options: max-size: 50m max-file: "3" networks: - signoz networks: signoz: name: signoz driver: bridge pipeline: name: pipeline external: true # swag: # name: swag # external: true volumes: {}