使用 Traefik 配置的 SigNoz 独立 docker-compose
这是一个示例 docker-compose.yml 配置,用于以独立模式部署 SigNoz,并使用 Traefik 作为反向代理。此配置假定你已经配置好 Traefik 来处理传入请求并将其路由到相应的服务。关于我们如何配置 Traefik,请参见使用 Let’s Encrypt Cloudflare DNS-01、TLS-ALPN-01 和 HTTP-01 挑战的简单 Traefik docker-compose 配置。
首先,为该服务创建一个存放目录。本示例中使用 /opt/services/signoz。
接下来克隆 signoz 仓库,其中包含一些必要的配置。
clone-signoz-repo.sh
mkdir -p /opt/services/signoz
cd /opt/services/signoz
git clone https://github.com/SigNoz/signoz.git使用 pwgen 生成随机的 SIGNOZ_JWT_SECRET,并一步写入 .env 文件:
generate-signoz-jwt-secret.sh
cd /opt/services/signoz
# 如果缺失则安装 pwgen (Debian/Ubuntu)
sudo apt-get update && sudo apt-get install -y pwgen
# 创建包含强随机密钥(64 个字符)的 .env 文件
echo SIGNOZ_JWT_SECRET=$(pwgen -s 64 1) > .env现在在 /opt/services/signoz 中创建 docker-compose.yml,内容如下(这本质上是官方示例,添加了 Traefik 标签并将目录映射为卷)。请确保相应地修改 Traefik 标签中的域名设置。(搜索 mydomain.com)
重要提示:目前 gRPC 转发尚不可用。
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最后,启动服务:
start-signoz-services.sh
docker-compose up前往 SigNoz Web 界面(替换为你的域名)并在那里创建管理员账户。
要为 SigNoz 服务设置开机自启,请参见我们的文章10 秒内为你的 docker-compose 项目创建 systemd 服务;简要说明:
create-docker-compose-systemd-service.sh
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdin关于 SigNoz 中嵌套 trace 的示例效果,请参见连接到 SigNoz 而非 Logfire 的 Logfire 示例。
Check out similar posts by category:
Monitoring, Docker
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow