Signoz Standalone docker-compose mit Traefik-Konfiguration

Dies ist eine Beispiel-docker-compose.yml-Konfiguration für die Bereitstellung von SigNoz im Standalone-Modus mit Traefik als Reverse Proxy. Dieses Setup geht davon aus, dass Sie Traefik bereits konfiguriert haben, um eingehende Anfragen zu verarbeiten und an die entsprechenden Services weiterzuleiten. Siehe Simple Traefik docker-compose setup with Lets Encrypt Cloudflare DNS-01 & TLS-ALPN-01 & HTTP-01 challenges für unsere Traefik-Einrichtung.

Erstellen Sie zuerst ein Verzeichnis, in dem der Service residieren soll. Wir verwenden /opt/services/signoz für dieses Beispiel.

Klonen Sie nun das signoz-Repository, das einige der wesentlichen Konfigurationen enthält.

clone-signoz-repo.sh
mkdir -p /opt/services/signoz
cd /opt/services/signoz
git clone https://github.com/SigNoz/signoz.git

Generieren Sie ein zufälliges SIGNOZ_JWT_SECRET mit pwgen und schreiben Sie .env in einem Schritt:

generate-signoz-jwt-secret.sh
cd /opt/services/signoz
# install pwgen if missing (Debian/Ubuntu)
sudo apt-get update && sudo apt-get install -y pwgen
# create .env with a strong random secret (64 chars)
echo SIGNOZ_JWT_SECRET=$(pwgen -s 64 1) > .env

Erstellen Sie nun docker-compose.yml in /opt/services/signoz mit dem folgenden Inhalt (dies ist im Wesentlichen das offizielle Beispiel mit hinzugefügten Traefik-Labels und als Volumes gemappten Verzeichnissen). Stellen Sie sicher, Ihre Domain-Namenseinstellungen in den Traefik-Labels entsprechend zu ändern. (suchen Sie nach mydomain.com)

Wichtig: Das gRPC-Forwarding funktioniert derzeit nicht.

docker-compose.yml
x-common: &common
  restart: unless-stopped
  logging:
    options:
      max-size: 50m
      max-file: "3"
x-clickhouse-defaults: &clickhouse-defaults
  !!merge <<: *common
  image: clickhouse/clickhouse-server:25.5.6
  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
  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
  environment:
    - CLICKHOUSE_SKIP_USER_SETUP=1
x-zookeeper-defaults: &zookeeper-defaults
  !!merge <<: *common
  image: signoz/zookeeper:3.7.1
  user: root
  labels:
    signoz.io/scrape: "true"
    signoz.io/port: "9141"
    signoz.io/path: "/metrics"
  healthcheck:
    test:
      - CMD-SHELL
      - curl -s -m 2 http://localhost:8080/commands/ruok | grep error | grep null
    interval: 30s
    timeout: 5s
    retries: 3
x-db-depend: &db-depend
  !!merge <<: *common
  depends_on:
    clickhouse:
      condition: service_healthy
    schema-migrator-sync:
      condition: service_completed_successfully
services:
  init-clickhouse:
    !!merge <<: *common
    image: clickhouse/clickhouse-server:25.5.6
    container_name: signoz-init-clickhouse
    command:
      - bash
      - -c
      - |
        version="v0.0.1"
        node_os=$$(uname -s | tr '[:upper:]' '[:lower:]')
        node_arch=$$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/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"
        tar -xvzf histogram-quantile.tar.gz
        mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile
    restart: on-failure
    volumes:
      - ./signoz/deploy/common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
  zookeeper-1:
    !!merge <<: *zookeeper-defaults
    container_name: signoz-zookeeper-1
    #   - "2181:2181"
    # ports:
    #   - "2888:2888"
    #   - "3888:3888"
    volumes:
      - ./zookeeper-1:/bitnami/zookeeper
    environment:
      - ZOO_SERVER_ID=1
      - ALLOW_ANONYMOUS_LOGIN=yes
      - ZOO_AUTOPURGE_INTERVAL=1
      - ZOO_ENABLE_PROMETHEUS_METRICS=yes
      - ZOO_PROMETHEUS_METRICS_PORT_NUMBER=9141
  clickhouse:
    !!merge <<: *clickhouse-defaults
    container_name: signoz-clickhouse
    # ports:
    #   - "9000:9000"
    #   - "8123:8123"
    #   - "9181:9181"
    volumes:
      - ./signoz/deploy/common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
      - ./signoz/deploy/common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
      - ./signoz/deploy/common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
      - ./signoz/deploy/common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
      - ./signoz/deploy/common/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
      - ./clickhouse:/var/lib/clickhouse/
      # - ./signoz/deploy/common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
  signoz:
    !!merge <<: *db-depend
    image: signoz/signoz:${VERSION:-v0.101.0}
    container_name: signoz
    command:
      - --config=/root/config/prometheus.yml
    # ports:
    #  - "8080:8080" # signoz port
    #   - "6060:6060"     # pprof port
    volumes:
      - ./signoz/deploy/common/signoz/prometheus.yml:/root/config/prometheus.yml
      - ./signoz/deploy/common/dashboards:/root/config/dashboards
      - ./signoz_sqlite:/var/lib/signoz/
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.signoz.rule=Host(`signoz.mydomain.com`)"
      - "traefik.http.routers.signoz.entrypoints=websecure"
      - "traefik.http.routers.signoz.tls.certresolver=cloudflare"
      - "traefik.http.routers.signoz.tls.domains[0].main=signoz.mydomain.com"
      - "traefik.http.routers.signoz.tls.domains[0].sans=*.signoz.mydomain.com"
      - "traefik.http.services.signoz.loadbalancer.server.port=8080"
    environment:
      - SIGNOZ_ALERTMANAGER_PROVIDER=signoz
      - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
      - SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db
      - DASHBOARDS_PATH=/root/config/dashboards
      - STORAGE=clickhouse
      - GODEBUG=netdns=go
      - TELEMETRY_ENABLED=true
      - DEPLOYMENT_TYPE=docker-standalone-amd
      - DOT_METRICS_ENABLED=true
      - SIGNOZ_JWT_SECRET=${SIGNOZ_JWT_SECRET}
    healthcheck:
      test:
        - CMD
        - wget
        - --spider
        - -q
        - localhost:8080/api/v1/health
      interval: 30s
      timeout: 5s
      retries: 3
  otel-collector:
    !!merge <<: *db-depend
    image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.129.8}
    container_name: signoz-otel-collector
    command:
      - --config=/etc/otel-collector-config.yaml
      - --manager-config=/etc/manager-config.yaml
      - --copy-path=/var/tmp/collector-config.yaml
      - --feature-gates=-pkg.translator.prometheus.NormalizeName
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
      - ./signoz/deploy/common/signoz/otel-collector-opamp-config.yaml:/etc/manager-config.yaml
    environment:
      - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux
      - LOW_CARDINAL_EXCEPTION_GROUPING=false
    #ports:
      # - "1777:1777"     # pprof extension
      # - "4317:4317" # OTLP gRPC receiver
      # - "4318:4318" # OTLP HTTP receiver
    labels:
      - "traefik.enable=true"
      # gRPC (OTLP) receiver via Traefik
      - "traefik.http.routers.signoz-grpc.rule=Host(`grpc.signoz.mydomain.com`)"
      - "traefik.http.routers.signoz-grpc.entrypoints=websecure"  
      - "traefik.http.routers.signoz-grpc.tls.certresolver=cloudflare"
      - "traefik.http.routers.signoz-grpc.tls.domains[0].main=signoz.mydomain.com"
      - "traefik.http.routers.signoz-grpc.tls.domains[0].sans=*.signoz.mydomain.com"
      - "traefik.http.routers.signoz-grpc.service=signoz-grpc"
      - "traefik.http.services.signoz-grpc.loadbalancer.server.port=4317"
      - "traefik.http.services.signoz-grpc.loadbalancer.server.scheme=h2c"
      # HTTP (OTLP) receiver via Traefik
      - "traefik.http.routers.signoz-http.rule=Host(`http.signoz.mydomain.com`)"
      - "traefik.http.routers.signoz-http.entrypoints=websecure"
      - "traefik.http.routers.signoz-http.tls.certresolver=cloudflare"
      - "traefik.http.routers.signoz-http.tls.domains[0].main=signoz.mydomain.com"
      - "traefik.http.routers.signoz-http.tls.domains[0].sans=*.signoz.mydomain.com"
      - "traefik.http.routers.signoz-http.service=signoz-http"
      - "traefik.http.services.signoz-http.loadbalancer.server.port=4318"
    depends_on:
      signoz:
        condition: service_healthy
  schema-migrator-sync:
    !!merge <<: *common
    image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.129.8}
    container_name: schema-migrator-sync
    command:
      - sync
      - --dsn=tcp://clickhouse:9000
      - --up=
    depends_on:
      clickhouse:
        condition: service_healthy
    restart: on-failure
  schema-migrator-async:
    !!merge <<: *db-depend
    image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.129.8}
    container_name: schema-migrator-async
    command:
      - async
      - --dsn=tcp://clickhouse:9000
      - --up=
    restart: on-failure

Starten Sie schließlich die Services:

start-signoz-services.sh
docker-compose up

Gehen Sie zur Signoz-Weboberfläche (ersetzen Sie durch Ihre Domain) und erstellen Sie dort das Admin-Konto.

Um Autostart für den Signoz-Service einzurichten, siehe unseren Beitrag Create a systemd service for your docker-compose project in 10 seconds ; TL;DR:

create-docker-compose-systemd-service.sh
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdin

Für ein Beispiel, wie ein verschachtelter Trace in Signoz aussieht, siehe Logfire-Beispiel, das sich mit SigNoz statt mit Logfire verbindet.


Check out similar posts by category: Monitoring, Docker