Deploying the SigNoz template on Dokploy fails with ClickHouse errors (#534):
DNS resolution: Cannot use ZooKeeper host zookeeper-1:2181 due to DNS error: Temporary DNS error while resolving: zookeeper-1, and the server cannot resolve the cluster host clickhouse as itself.
IPv6 binding: the clickhouse/clickhouse-server image ships config.d/docker_related_config.xml with <listen_host>::</listen_host> first, which fails to bind on hosts without IPv6 support (common on VPSes with IPv6 disabled).
While fixing this, two more template bugs surfaced:
template.toml created files/signoz/prometheus.xml but the compose mounts ../files/signoz/prometheus.yml, so Docker silently created and mounted a directory as the signoz prometheus config.
Both [[config.domains]] entries shared the same host and path /, creating two conflicting Traefik routers (signoz UI vs otel-collector) where one randomly won.
Fix
Mount a template-owned docker_related_config.xml over the image default: listen on 0.0.0.0 (IPv4) only, keep listen_try, and set disable_internal_dns_cache=1 so ClickHouse does not cache transient startup DNS failures for zookeeper-1/clickhouse.
Set hostname: clickhouse (replacing container_name: signoz-clickhouse) so the server identifies itself as the cluster host declared in cluster.xml, and a fixed container name cannot conflict across deployments.
Remove the explicit fixed-name signoz-net network (the repo validator rejects explicit networks; Dokploy wires networks automatically, and a fixed shared network name breaks DNS across deployments).
Fix the prometheus mount to /signoz/prometheus.yml.
Give the otel-collector domain its own generated host (otel_domain), matching the convention used by other multi-domain templates.
Verification (deployed on a Dokploy instance)
Deploy finished done in 228s; all one-shot containers (init-clickhouse, schema-migrator-sync, schema-migrator-async) exited 0 — the sync migrator runs distributed DDL ON CLUSTER through ZooKeeper, which is exactly the path that failed in #534.
OTLP domain (otel-collector:4318): POST /v1/traces and POST /v1/logs return HTTP 200 {"partialSuccess":{}}; GET /v1/traces returns 405 method not allowed, supported: [POST] (the receiver answering). Note: GET / on an OTLP HTTP receiver always returns its own 404 page not found — that is expected receiver behavior, not a routing failure.
node build-scripts/generate-meta.js --check: 476 templates validated; validate-template and validate-docker-compose pass for signoz.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/Dokploy/templates/pull/1004
**Author:** [@Siumauricio](https://github.com/Siumauricio)
**Created:** 7/14/2026
**Status:** ✅ Merged
**Merged:** 7/14/2026
**Merged by:** [@Siumauricio](https://github.com/Siumauricio)
**Base:** `canary` ← **Head:** `fix/signoz-clickhouse`
---
### 📝 Commits (1)
- [`1e48681`](https://github.com/Dokploy/templates/commit/1e486813b4d99448b7f033632284366579ec9ef4) fix(signoz): fix ClickHouse hostname resolution and IPv6 binding
### 📊 Changes
**2 files changed** (+21 additions, -8 deletions)
<details>
<summary>View changed files</summary>
📝 `blueprints/signoz/docker-compose.yml` (+2 -6)
📝 `blueprints/signoz/template.toml` (+19 -2)
</details>
### 📄 Description
## Problem
Deploying the SigNoz template on Dokploy fails with ClickHouse errors (#534):
- **DNS resolution**: `Cannot use ZooKeeper host zookeeper-1:2181 due to DNS error: Temporary DNS error while resolving: zookeeper-1`, and the server cannot resolve the cluster host `clickhouse` as itself.
- **IPv6 binding**: the `clickhouse/clickhouse-server` image ships `config.d/docker_related_config.xml` with `<listen_host>::</listen_host>` first, which fails to bind on hosts without IPv6 support (common on VPSes with IPv6 disabled).
While fixing this, two more template bugs surfaced:
- `template.toml` created `files/signoz/prometheus.xml` but the compose mounts `../files/signoz/prometheus.yml`, so Docker silently created and mounted a **directory** as the signoz prometheus config.
- Both `[[config.domains]]` entries shared the same host and path `/`, creating two conflicting Traefik routers (signoz UI vs otel-collector) where one randomly won.
## Fix
- Mount a template-owned `docker_related_config.xml` over the image default: listen on `0.0.0.0` (IPv4) only, keep `listen_try`, and set `disable_internal_dns_cache=1` so ClickHouse does not cache transient startup DNS failures for `zookeeper-1`/`clickhouse`.
- Set `hostname: clickhouse` (replacing `container_name: signoz-clickhouse`) so the server identifies itself as the cluster host declared in `cluster.xml`, and a fixed container name cannot conflict across deployments.
- Remove the explicit fixed-name `signoz-net` network (the repo validator rejects explicit networks; Dokploy wires networks automatically, and a fixed shared network name breaks DNS across deployments).
- Fix the prometheus mount to `/signoz/prometheus.yml`.
- Give the otel-collector domain its own generated host (`otel_domain`), matching the convention used by other multi-domain templates.
## Verification (deployed on a Dokploy instance)
- Deploy finished `done` in 228s; all one-shot containers (`init-clickhouse`, `schema-migrator-sync`, `schema-migrator-async`) exited `0` — the sync migrator runs distributed DDL `ON CLUSTER` through ZooKeeper, which is exactly the path that failed in #534.
- ClickHouse container: `running` / `healthy`, `RestartCount: 0`; log tail contains **0** DNS-error lines and **0** IPv6/bind-error lines.
- SigNoz UI domain: `HTTP 200` — "Open source Observability platform | SigNoz".
- OTLP domain (otel-collector:4318): `POST /v1/traces` and `POST /v1/logs` return `HTTP 200 {"partialSuccess":{}}`; `GET /v1/traces` returns `405 method not allowed, supported: [POST]` (the receiver answering). Note: `GET /` on an OTLP HTTP receiver always returns its own `404 page not found` — that is expected receiver behavior, not a routing failure.
- `node build-scripts/generate-meta.js --check`: 476 templates validated; `validate-template` and `validate-docker-compose` pass for signoz.
Closes #534
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/Dokploy/templates/pull/1004
Author: @Siumauricio
Created: 7/14/2026
Status: ✅ Merged
Merged: 7/14/2026
Merged by: @Siumauricio
Base:
canary← Head:fix/signoz-clickhouse📝 Commits (1)
1e48681fix(signoz): fix ClickHouse hostname resolution and IPv6 binding📊 Changes
2 files changed (+21 additions, -8 deletions)
View changed files
📝
blueprints/signoz/docker-compose.yml(+2 -6)📝
blueprints/signoz/template.toml(+19 -2)📄 Description
Problem
Deploying the SigNoz template on Dokploy fails with ClickHouse errors (#534):
Cannot use ZooKeeper host zookeeper-1:2181 due to DNS error: Temporary DNS error while resolving: zookeeper-1, and the server cannot resolve the cluster hostclickhouseas itself.clickhouse/clickhouse-serverimage shipsconfig.d/docker_related_config.xmlwith<listen_host>::</listen_host>first, which fails to bind on hosts without IPv6 support (common on VPSes with IPv6 disabled).While fixing this, two more template bugs surfaced:
template.tomlcreatedfiles/signoz/prometheus.xmlbut the compose mounts../files/signoz/prometheus.yml, so Docker silently created and mounted a directory as the signoz prometheus config.[[config.domains]]entries shared the same host and path/, creating two conflicting Traefik routers (signoz UI vs otel-collector) where one randomly won.Fix
docker_related_config.xmlover the image default: listen on0.0.0.0(IPv4) only, keeplisten_try, and setdisable_internal_dns_cache=1so ClickHouse does not cache transient startup DNS failures forzookeeper-1/clickhouse.hostname: clickhouse(replacingcontainer_name: signoz-clickhouse) so the server identifies itself as the cluster host declared incluster.xml, and a fixed container name cannot conflict across deployments.signoz-netnetwork (the repo validator rejects explicit networks; Dokploy wires networks automatically, and a fixed shared network name breaks DNS across deployments)./signoz/prometheus.yml.otel_domain), matching the convention used by other multi-domain templates.Verification (deployed on a Dokploy instance)
donein 228s; all one-shot containers (init-clickhouse,schema-migrator-sync,schema-migrator-async) exited0— the sync migrator runs distributed DDLON CLUSTERthrough ZooKeeper, which is exactly the path that failed in #534.running/healthy,RestartCount: 0; log tail contains 0 DNS-error lines and 0 IPv6/bind-error lines.HTTP 200— "Open source Observability platform | SigNoz".POST /v1/tracesandPOST /v1/logsreturnHTTP 200 {"partialSuccess":{}};GET /v1/tracesreturns405 method not allowed, supported: [POST](the receiver answering). Note:GET /on an OTLP HTTP receiver always returns its own404 page not found— that is expected receiver behavior, not a routing failure.node build-scripts/generate-meta.js --check: 476 templates validated;validate-templateandvalidate-docker-composepass for signoz.Closes #534
🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.