Originally created by @maelp on GitHub (Jan 26, 2025).
### What problem will this feature address?
It's a nice way to add observability to your apps: https://github.com/SigNoz/signoz
### Describe the solution you'd like
Add it to the templates
### Describe alternatives you've considered
Do it manually
### Additional context
_No response_
### Will you send a PR to implement it?
Maybe, need help
@maelp yeah i wasn't sure how to test this, so i created a Compose on Dokploy and set it on Git at https://github.com/zippoxer/dokploy-templates and Compose Path to ./blueprints/signoz/docker-compose.yml
so far it works, however i didn't test anything yet beyond the UI loading :)
@zippoxer commented on GitHub (May 8, 2025):
re-opened at https://github.com/Dokploy/templates/pull/120
@maelp yeah i wasn't sure how to test this, so i created a Compose on Dokploy and set it on Git at https://github.com/zippoxer/dokploy-templates and Compose Path to `./blueprints/signoz/docker-compose.yml`
so far it works, however i didn't test anything yet beyond the UI loading :)
Note:
Replace the Host value with your domain (or IP of VPS) - traefik.http.routers.signoz.rule=Host(signoz.mydomain.com)
Step 4. Application -> Deploy
Wait a while until the last lines of:
Container app-signoz-jtmo2o-signoz-1 Started
Container app-signoz-jtmo2o-signoz-otel-collector-1 Started
Docker Compose Deployed: ✅
Step 5. Application -> Domains
Add Domain:
Service name: signoz
Host: signoz.mydomain.com
Path: /
Container port: 8080
(optional SSL)
... Press "Update"
Wait some seconds and you can open the link... Done.
and you get greeted with the sign up screen.
edit:
I also saw there was a open issue #285 not sure if it's placed better here or there. @thaarrtt
I haven't tested all features in SigNoz as I don't use all of it.
@renegadevi commented on GitHub (Aug 23, 2025):
I just got it working today. Maybe not the cleanest docker-compose but it works.
### Step 1. Create Service -> Compose
### Step 2. Go to application -> Environment
(generate key example from https://jwtsecrets.com/)
```ini
SIGNOZ_JWT_SECRET=9bb40c76388ecfb3d467e1b30b60e8e3
```
### Step 3. Application -> General
Provider: Raw
```yaml
services:
otel-conf:
image: alpine:3.20
command:
- /bin/sh
- -lc
- |
cat > /otel/config.yaml <<'YAML'
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
clickhousetraces:
datasource: tcp://clickhouse:9000/signoz_traces
use_new_schema: true
clickhousemetricswrite:
endpoint: tcp://clickhouse:9000/signoz_metrics
timeout: 15s
resource_to_telemetry_conversion:
enabled: true
clickhouselogsexporter:
dsn: tcp://clickhouse:9000/signoz_logs
timeout: 10s
use_new_schema: true
metadataexporter:
dsn: tcp://clickhouse:9000/signoz_metadata
timeout: 10s
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [clickhousetraces, metadataexporter]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [clickhousemetricswrite, metadataexporter]
logs:
receivers: [otlp]
processors: [batch]
exporters: [clickhouselogsexporter, metadataexporter]
YAML
volumes:
- otel-config:/otel
restart: "no"
networks:
- dokploy-network
ch-conf:
image: alpine:3.20
command:
- /bin/sh
- -lc
- |
cat > /config/cluster.xml <<'XML'
<?xml version="1.0"?>
<clickhouse>
<remote_servers>
<cluster>
<shard>
<replica>
<host>clickhouse</host>
<port>9000</port>
</replica>
</shard>
</cluster>
</remote_servers>
<zookeeper>
<node index="1">
<host>zookeeper-1</host>
<port>2181</port>
</node>
</zookeeper>
<distributed_ddl>
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>
</clickhouse>
XML
volumes:
- ch-config:/config
restart: "no"
zookeeper-1:
image: bitnami/zookeeper:3.9
restart: unless-stopped
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- ZOO_4LW_COMMANDS_WHITELIST=ruok,stat,envi,conf,mntr
healthcheck:
test: ["CMD-SHELL", "echo ruok | nc -w 2 127.0.0.1 2181 | grep imok"]
interval: 30s
timeout: 5s
retries: 3
volumes:
- zookeeper-data:/bitnami/zookeeper
networks:
- dokploy-network
clickhouse:
image: clickhouse/clickhouse-server:24.1.2-alpine
restart: unless-stopped
depends_on:
ch-conf:
condition: service_completed_successfully
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
healthcheck:
test: ["CMD","wget","--spider","-q","0.0.0.0:8123/ping"]
interval: 30s
timeout: 5s
retries: 3
volumes:
- clickhouse-data:/var/lib/clickhouse
- ch-config:/etc/clickhouse-server/config.d
networks:
- dokploy-network
schema-migrator-sync:
image: signoz/signoz-schema-migrator:v0.129.0
command: ["sync","--dsn=tcp://clickhouse:9000","--cluster-name=cluster","--up="]
depends_on:
clickhouse:
condition: service_healthy
restart: "no"
networks:
- dokploy-network
schema-migrator-async:
image: signoz/signoz-schema-migrator:v0.129.0
command: ["async","--dsn=tcp://clickhouse:9000","--cluster-name=cluster","--up="]
depends_on:
clickhouse:
condition: service_healthy
schema-migrator-sync:
condition: service_completed_successfully
restart: unless-stopped
networks:
- dokploy-network
signoz:
image: signoz/signoz:v0.92.1
depends_on:
clickhouse:
condition: service_healthy
schema-migrator-sync:
condition: service_completed_successfully
environment:
- STORAGE=clickhouse
- SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
- SIGNOZ_ANALYTICS_ENABLED=false
- SIGNOZ_JWT_SECRET=${SIGNOZ_JWT_SECRET:?set-a-strong-random-string}
ports:
- "3301:8080"
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.docker.network=dokploy-network
- traefik.http.routers.signoz.rule=Host(`signoz.mydomain.com`)
- traefik.http.routers.signoz.entrypoints=web
- traefik.http.services.signoz.loadbalancer.server.port=8080
networks:
- dokploy-network
volumes:
- signoz-data:/var/lib/signoz
signoz-otel-collector:
image: signoz/signoz-otel-collector:v0.129.0
depends_on:
clickhouse:
condition: service_healthy
otel-conf:
condition: service_completed_successfully
schema-migrator-sync:
condition: service_completed_successfully
command: ["--config=/etc/otelcol/config.yaml"]
volumes:
- otel-config:/etc/otelcol:ro
ports:
- "4317:4317"
- "4318:4318"
restart: unless-stopped
networks:
- dokploy-network
volumes:
clickhouse-data:
ch-config:
zookeeper-data:
signoz-data:
otel-config:
networks:
dokploy-network:
external: true
```
Note:
Replace the Host value with your domain (or IP of VPS)
` - traefik.http.routers.signoz.rule=Host(`signoz.mydomain.com`)`
### Step 4. Application -> Deploy
Wait a while until the last lines of:
```
Container app-signoz-jtmo2o-signoz-1 Started
Container app-signoz-jtmo2o-signoz-otel-collector-1 Started
Docker Compose Deployed: ✅
```
### Step 5. Application -> Domains
Add Domain:
- Service name: signoz
- Host: signoz.mydomain.com
- Path: /
- Container port: 8080
- (optional SSL)
... Press "Update"
Wait some seconds and you can open the link... Done.
and you get greeted with the sign up screen.
edit:
I also saw there was a open issue #285 not sure if it's placed better here or there. @thaarrtt
I haven't tested all features in SigNoz as I don't use all of it.
networks:
dokploy-network:
external: true
Note: Replace the Host value with your domain (or IP of VPS) - traefik.http.routers.signoz.rule=Host(signoz.mydomain.com)
Step 4. Application -> Deploy
Wait a while until the last lines of:
Container app-signoz-jtmo2o-signoz-1 Started
Container app-signoz-jtmo2o-signoz-otel-collector-1 Started
Docker Compose Deployed: ✅
Step 5. Application -> Domains
Add Domain:
Service name: signoz
Host: signoz.mydomain.com
Path: /
Container port: 8080
(optional SSL)
... Press "Update"
Wait some seconds and you can open the link... Done. and you get greeted with the sign up screen.
edit: I also saw there was a open issue #285 not sure if it's placed better here or there. @thaarrtt I haven't tested all features in SigNoz as I don't use all of it.
Congratulations, this looks great, but wouldn't it be better to use the File Mount Volume to create the files instead of using the command?
@jhorlima commented on GitHub (Aug 23, 2025):
> I just got it working today. Maybe not the cleanest docker-compose but it works.
>
> ### Step 1. Create Service -> Compose
> ### Step 2. Go to application -> Environment
> (generate key example from https://jwtsecrets.com/)
>
> SIGNOZ_JWT_SECRET=9bb40c76388ecfb3d467e1b30b60e8e3
> ### Step 3. Application -> General
> Provider: Raw
>
> services:
> otel-conf:
> image: alpine:3.20
> command:
> - /bin/sh
> - -lc
> - |
> cat > /otel/config.yaml <<'YAML'
> receivers:
> otlp:
> protocols:
> grpc:
> endpoint: 0.0.0.0:4317
> http:
> endpoint: 0.0.0.0:4318
>
> processors:
> batch:
>
> exporters:
> clickhousetraces:
> datasource: tcp://clickhouse:9000/signoz_traces
> use_new_schema: true
>
> clickhousemetricswrite:
> endpoint: tcp://clickhouse:9000/signoz_metrics
> timeout: 15s
> resource_to_telemetry_conversion:
> enabled: true
>
> clickhouselogsexporter:
> dsn: tcp://clickhouse:9000/signoz_logs
> timeout: 10s
> use_new_schema: true
>
> metadataexporter:
> dsn: tcp://clickhouse:9000/signoz_metadata
> timeout: 10s
>
> service:
> pipelines:
> traces:
> receivers: [otlp]
> processors: [batch]
> exporters: [clickhousetraces, metadataexporter]
> metrics:
> receivers: [otlp]
> processors: [batch]
> exporters: [clickhousemetricswrite, metadataexporter]
> logs:
> receivers: [otlp]
> processors: [batch]
> exporters: [clickhouselogsexporter, metadataexporter]
> YAML
> volumes:
> - otel-config:/otel
> restart: "no"
> networks:
> - dokploy-network
> ch-conf:
> image: alpine:3.20
> command:
> - /bin/sh
> - -lc
> - |
> cat > /config/cluster.xml <<'XML'
> <?xml version="1.0"?>
> <clickhouse>
> <remote_servers>
> <cluster>
> <shard>
> <replica>
> <host>clickhouse</host>
> <port>9000</port>
> </replica>
> </shard>
> </cluster>
> </remote_servers>
> <zookeeper>
> <node index="1">
> <host>zookeeper-1</host>
> <port>2181</port>
> </node>
> </zookeeper>
> <distributed_ddl>
> <path>/clickhouse/task_queue/ddl</path>
> </distributed_ddl>
> </clickhouse>
> XML
> volumes:
> - ch-config:/config
> restart: "no"
> zookeeper-1:
> image: bitnami/zookeeper:3.9
> restart: unless-stopped
> environment:
> - ALLOW_ANONYMOUS_LOGIN=yes
> - ZOO_4LW_COMMANDS_WHITELIST=ruok,stat,envi,conf,mntr
> healthcheck:
> test: ["CMD-SHELL", "echo ruok | nc -w 2 127.0.0.1 2181 | grep imok"]
> interval: 30s
> timeout: 5s
> retries: 3
> volumes:
> - zookeeper-data:/bitnami/zookeeper
> networks:
> - dokploy-network
>
> clickhouse:
> image: clickhouse/clickhouse-server:24.1.2-alpine
> restart: unless-stopped
> depends_on:
> ch-conf:
> condition: service_completed_successfully
> ulimits:
> nproc: 65535
> nofile:
> soft: 262144
> hard: 262144
> healthcheck:
> test: ["CMD","wget","--spider","-q","0.0.0.0:8123/ping"]
> interval: 30s
> timeout: 5s
> retries: 3
> volumes:
> - clickhouse-data:/var/lib/clickhouse
> - ch-config:/etc/clickhouse-server/config.d
> networks:
> - dokploy-network
>
> schema-migrator-sync:
> image: signoz/signoz-schema-migrator:v0.129.0
> command: ["sync","--dsn=tcp://clickhouse:9000","--cluster-name=cluster","--up="]
> depends_on:
> clickhouse:
> condition: service_healthy
> restart: "no"
> networks:
> - dokploy-network
>
> schema-migrator-async:
> image: signoz/signoz-schema-migrator:v0.129.0
> command: ["async","--dsn=tcp://clickhouse:9000","--cluster-name=cluster","--up="]
> depends_on:
> clickhouse:
> condition: service_healthy
> schema-migrator-sync:
> condition: service_completed_successfully
> restart: unless-stopped
> networks:
> - dokploy-network
>
> signoz:
> image: signoz/signoz:v0.92.1
> depends_on:
> clickhouse:
> condition: service_healthy
> schema-migrator-sync:
> condition: service_completed_successfully
> environment:
> - STORAGE=clickhouse
> - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
> - SIGNOZ_ANALYTICS_ENABLED=false
> - SIGNOZ_JWT_SECRET=${SIGNOZ_JWT_SECRET:?set-a-strong-random-string}
> ports:
> - "3301:8080"
> restart: unless-stopped
> labels:
> - traefik.enable=true
> - traefik.docker.network=dokploy-network
> - traefik.http.routers.signoz.rule=Host(`signoz.mydomain.com`)
> - traefik.http.routers.signoz.entrypoints=web
> - traefik.http.services.signoz.loadbalancer.server.port=8080
> networks:
> - dokploy-network
> volumes:
> - signoz-data:/var/lib/signoz
>
>
> signoz-otel-collector:
> image: signoz/signoz-otel-collector:v0.129.0
> depends_on:
> clickhouse:
> condition: service_healthy
> otel-conf:
> condition: service_completed_successfully
> schema-migrator-sync:
> condition: service_completed_successfully
> command: ["--config=/etc/otelcol/config.yaml"]
> volumes:
> - otel-config:/etc/otelcol:ro
> ports:
> - "4317:4317"
> - "4318:4318"
> restart: unless-stopped
> networks:
> - dokploy-network
>
> volumes:
> clickhouse-data:
> ch-config:
> zookeeper-data:
> signoz-data:
> otel-config:
>
> networks:
> dokploy-network:
> external: true
> Note: Replace the Host value with your domain (or IP of VPS) ` - traefik.http.routers.signoz.rule=Host(`signoz.mydomain.com`)`
>
> ### Step 4. Application -> Deploy
> Wait a while until the last lines of:
>
> ```
> Container app-signoz-jtmo2o-signoz-1 Started
> Container app-signoz-jtmo2o-signoz-otel-collector-1 Started
> Docker Compose Deployed: ✅
> ```
>
> ### Step 5. Application -> Domains
> Add Domain:
>
> * Service name: signoz
> * Host: signoz.mydomain.com
> * Path: /
> * Container port: 8080
> * (optional SSL)
> ... Press "Update"
>
> Wait some seconds and you can open the link... Done. and you get greeted with the sign up screen.
>
> edit: I also saw there was a open issue [#285](https://github.com/Dokploy/templates/issues/285) not sure if it's placed better here or there. [@thaarrtt](https://github.com/thaarrtt) I haven't tested all features in SigNoz as I don't use all of it.
Congratulations, this looks great, but wouldn't it be better to use the File Mount Volume to create the files instead of using the command?
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.
Originally created by @maelp on GitHub (Jan 26, 2025).
What problem will this feature address?
It's a nice way to add observability to your apps: https://github.com/SigNoz/signoz
Describe the solution you'd like
Add it to the templates
Describe alternatives you've considered
Do it manually
Additional context
No response
Will you send a PR to implement it?
Maybe, need help
@zippoxer commented on GitHub (May 8, 2025):
@maelp please review #119 🙏
@maelp commented on GitHub (May 8, 2025):
Looks really good! I'm not sure if it's possible to test the template somehow on my instance
@zippoxer commented on GitHub (May 8, 2025):
re-opened at https://github.com/Dokploy/templates/pull/120
@maelp yeah i wasn't sure how to test this, so i created a Compose on Dokploy and set it on Git at https://github.com/zippoxer/dokploy-templates and Compose Path to
./blueprints/signoz/docker-compose.ymlso far it works, however i didn't test anything yet beyond the UI loading :)
@rftglyv commented on GitHub (Jul 8, 2025):
Hi, when will SigNoz be added as template?
@renegadevi commented on GitHub (Aug 23, 2025):
I just got it working today. Maybe not the cleanest docker-compose but it works.
Step 1. Create Service -> Compose
Step 2. Go to application -> Environment
(generate key example from https://jwtsecrets.com/)
Step 3. Application -> General
Provider: Raw
Note:
Replace the Host value with your domain (or IP of VPS)
- traefik.http.routers.signoz.rule=Host(signoz.mydomain.com)Step 4. Application -> Deploy
Wait a while until the last lines of:
Step 5. Application -> Domains
Add Domain:
... Press "Update"
Wait some seconds and you can open the link... Done.
and you get greeted with the sign up screen.
edit:
I also saw there was a open issue #285 not sure if it's placed better here or there. @thaarrtt
I haven't tested all features in SigNoz as I don't use all of it.
@jhorlima commented on GitHub (Aug 23, 2025):
Congratulations, this looks great, but wouldn't it be better to use the File Mount Volume to create the files instead of using the command?