Self-Host - This page is relevant for self-hosted SigNoz editions.

Upgrade to v0.113.0

With v0.113, the standalone signoz-schema-migrator image is replaced by migration commands built directly into signoz-otel-collector. This removes the startup ordering issues caused by the old Job-based approach.

Key changes:

  • signoz-telemetrystore-migrator replaces both schema-migrator-sync and schema-migrator-async services
  • Migration commands (migrate bootstrap, migrate sync up, migrate async up) are now subcommands of signoz-otel-collector
  • otel-collector now runs migrate sync check against ClickHouse at startup instead of waiting on a Job

For more details, see SigNoz/charts#828.

Upgrade Instructions

No manual changes are required. Follow the standard upgrade guide to pull the latest changes and restart.

If you have customized your docker-compose.yaml, make the following changes before upgrading:

Step 1: Remove signoz-schema-migrator and references

Remove the schema-migrator-sync and schema-migrator-async service definitions from your docker-compose.yaml:

docker-compose.yaml
-  schema-migrator-sync:
-    ...
-  schema-migrator-async:
-    ...

Also remove the schema-migrator-sync reference from the x-db-depend anchor:

docker-compose.yaml
x-db-depend: &db-depend
  !!merge <<: *common
  depends_on:
    clickhouse:
      condition: service_healthy
-    schema-migrator-sync:
-      condition: service_completed_successfully

Step 2: Add the new signoz-telemetrystore-migrator service

Add the following signoz-telemetrystore-migrator service definition to your docker-compose.yaml. This single service replaces both schema-migrator-sync and schema-migrator-async:

docker-compose.yaml
  signoz-telemetrystore-migrator:
    !!merge <<: *db-depend
    image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.142.0}
    container_name: signoz-telemetrystore-migrator
    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
    - |
      /signoz-otel-collector migrate bootstrap &&
      /signoz-otel-collector migrate sync up &&
      /signoz-otel-collector migrate async up
    restart: on-failure

Step 3: Update signoz and otel-collector services

Apply the following changes to the signoz service:

docker-compose.yaml
  signoz:
    ...
-    command:
-      - --config=/root/config/prometheus.yml
    volumes:
-      - ../common/signoz/prometheus.yml:/root/config/prometheus.yml
-      - ../common/dashboards:/root/config/dashboards
      - sqlite:/var/lib/signoz/
    environment:
      ...
-      - DASHBOARDS_PATH=/root/config/dashboards
-      - STORAGE=clickhouse
-      - GODEBUG=netdns=go
-      - TELEMETRY_ENABLED=true
-      - DEPLOYMENT_TYPE=docker-standalone-amd

Apply the following changes to the otel-collector service, it now runs migrate sync check as a startup guard:

docker-compose.yaml
  otel-collector:
    !!merge <<: *db-depend
    ...
+    entrypoint:
+    - /bin/sh
    command:
-      - --config=/etc/otel-collector-config.yaml
-      - --manager-config=/etc/manager-config.yaml
-      - --copy-path=/var/tmp/collector-config.yaml
+      - -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
    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
-    depends_on:
-      schema-migrator-sync:
-        condition: service_completed_successfully
-      signoz:
-        condition: service_healthy

Step 4: Apply the changes

Follow the standard upgrade guide to pull the latest changes and restart the stack.

Step 5: Validate migrations

docker ps -a --filter "name=signoz-telemetrystore-migrator"

The container should show status Exited (0).

Command Reference

The signoz-otel-collector migrate command has the following subcommands:

CommandDescription
migrate bootstrapCreates the migration tracking tables in ClickHouse. Must run before any other migrate command.
migrate sync upRuns sync (schema) migrations. These mutate the store schema and must complete before the application starts.
migrate sync checkChecks the status of sync migrations from the migration tracking table.
migrate async upRuns async (data) migrations. These include background data migrations that do not block the application.
migrate async checkChecks the status of async migrations from the migration tracking table.
migrate readyChecks if the store is ready to run migrations.

Global flags

These flags apply to all migrate subcommands. Each flag has an equivalent environment variable:

FlagEnvironment variableDescription
--clickhouse-dsnSIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSNDSN for the ClickHouse connection
--clickhouse-clusterSIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTERName of the ClickHouse cluster
--clickhouse-replicationSIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATIONWhether replication is enabled
--timeoutSIGNOZ_OTEL_COLLECTOR_TIMEOUTOperation timeout

The Docker Compose files use environment variables. The CLI flags are available for Linux Binary or manual use.

Commands mapping

signoz-schema-migratorsignoz-otel-collector
(no equivalent)signoz-otel-collector migrate bootstrap --clickhouse-dsn <dsn>
signoz-schema-migrator sync --dsn=<dsn> --up=signoz-otel-collector migrate sync up --clickhouse-dsn <dsn>
signoz-schema-migrator async --dsn=<dsn> --up=signoz-otel-collector migrate async up --clickhouse-dsn <dsn>

Troubleshooting

Migrator container exits with non-zero code

Symptoms: The signoz-telemetrystore-migrator container exits with a non-zero code; signoz or otel-collector may never become healthy.

Likely causes:

  • ClickHouse is not reachable (wrong host/port in SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN) or not healthy when the migrator starts.
  • Cluster/replication env vars do not match your setup: e.g. single-node ClickHouse with SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION=true, or wrong SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER.
  • Migrator image tag does not match the otel-collector image (migrations must match the collector version).

Resolution:

  1. Inspect logs:
    # Docker Compose
    docker logs signoz-telemetrystore-migrator
    # Docker Swarm
    docker service logs <stack>_signoz-telemetrystore-migrator
    
  2. Confirm ClickHouse is up and reachable from the migrator network (e.g. curl -s http://<clickhouse-host>:8123/pingOk.).
  3. Set SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN, CLUSTER, and REPLICATION to match your ClickHouse deployment. Use the same image tag as the otel-collector service (e.g. v0.142.0). The migrator has restart: on-failure and will retry.

Otel-collector or signoz fails after upgrade

Symptoms: Otel-collector exits soon after start; or signoz is stuck in a restart loop or fails health checks.

Likely causes:

  • Otel-collector now runs migrate sync check at startup. If the signoz-telemetrystore-migrator has not completed sync migrations, the check fails and the collector exits.
  • Migrator never completed successfully (container not Exited (0)).
  • Leftover references to schema-migrator-sync, schema-migrator-async, or schema-migrator in depends_on or service definitions.
  • Otel-collector missing the new entrypoint/command and ClickHouse env vars (SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN, etc.), so it never runs the sync check.

Resolution:

  1. Ensure the migrator finished:
docker ps -a --filter "name=signoz-telemetrystore-migrator"

The container should show status Exited (0). 2. Fix migrator failures (see Migrator container exits with non-zero code above), then restart the stack. 3. Remove any remaining schema-migrator* services and depends_on entries from your compose file. Ensure otel-collector has the updated entrypoint/command (with migrate sync check) and the ClickHouse environment variables from the upgrade steps. 4. Restart:

docker compose up -d

(or redeploy the stack in Swarm).

Last updated: February 25, 2026

Edit on GitHub