Tags: Self-Host, Railway
The SigNoz Railway template moved to a new layout. Services are renamed, each service's config moves into its own folder under deployment/, ClickHouse coordination moves from ZooKeeper to ClickHouse Keeper, and a single signoz-telemetrystore-migrator replaces the old schema-migrator jobs.
Railway's template "Update" only refreshes files inside services that already exist. It cannot rename services, add new ones, or change a service's folder, so this move is done by hand.
| Old service | New service | Root directory | Volume (mount path) |
|---|---|---|---|
clickhouse |
signoz-telemetrystore-clickhouse |
/deployment/telemetrystore |
keep, /var/lib/clickhouse/ |
zookeeper |
signoz-telemetrykeeper-clickhousekeeper |
/deployment/telemetrykeeper |
new, /var/lib/clickhouse-keeper/ |
signoz |
signoz-signoz |
/deployment/signoz |
keep, /var/lib/signoz/ |
signoz-otel-collector |
signoz-ingester |
/deployment/ingester |
none |
schema-migrator-sync / -async |
signoz-telemetrystore-migrator |
/deployment/telemetrystore-migrator |
none |
Each service builds from a Dockerfile and reads its railway.json config from its root directory. Keep the new service names exactly as above; the configs resolve each other over *.railway.internal by service name.
Do not use Railway's "Update available" button to move to this layout. The update only refreshes files inside your existing services, so it cannot make this change and will break the install. Migrate on your own schedule by following the steps below. The old layout stays in the template until it is deprecated, so there is no rush.
Back up your volumes: open the ClickHouse and SigNoz services in Railway and take a volume backup. Deleted volumes are recoverable for 48 hours.
- Rename the
clickhouseservice tosignoz-telemetrystore-clickhouse. - In Settings > Source, set Root Directory to
/deployment/telemetrystore. - Keep its volume attached at
/var/lib/clickhouse/. Its data stays on disk.
- Add a new service from the template repo with Root Directory
/deployment/telemetrykeeper, namedsignoz-telemetrykeeper-clickhousekeeper. - Give it a fresh volume mounted at
/var/lib/clickhouse-keeper/. - You can remove the old
zookeeperservice once ClickHouse is healthy on Keeper (Step 6).
- Rename the
signozservice tosignoz-signoz. - Set Root Directory to
/deployment/signoz. - Keep its volume mounted at
/var/lib/signoz/. Your dashboards, alerts, and users live there. - Keep the public domain on this service for the UI.
- Rename the
signoz-otel-collectorservice tosignoz-ingester. - Set Root Directory to
/deployment/ingester. - Under Settings > Networking, expose the OTLP port (
4318, and4317if you use gRPC) with a TCP proxy so your applications can reach it.
- Add a new service from the template repo with Root Directory
/deployment/telemetrystore-migrator, namedsignoz-telemetrystore-migrator(mind the spelling:telemetrystore). - It is a run-once job (restart policy
NEVER) that runsmigrate ready,bootstrap,sync up, andasync up.
The new Keeper starts empty, so your existing replicated tables come up read-only until their coordination metadata is rebuilt from the data on disk.
-
Start
signoz-telemetrystore-clickhouseandsignoz-telemetrykeeper-clickhousekeeper. -
Connect to ClickHouse and check:
SELECT database, table FROM system.replicas WHERE is_readonly;
-
For each read-only table across the SigNoz databases (
signoz_traces,signoz_logs,signoz_metrics,signoz_metadata,signoz_meter):SYSTEM RESTORE REPLICA <database>.<table>; SYSTEM SYNC REPLICA <database>.<table>;
Do this before running the migrator, so the migrator applies new migrations on top of healthy, writable tables.
Deploy in this order: ClickHouse and Keeper first, then run the migrator, then SigNoz and the ingester.
- The
signoz-telemetrystore-migratordeployment finishes and exits successfully. SELECT database, table FROM system.replicas WHERE is_readonly;returns no rows.- Open SigNoz on its public domain: your dashboards and alerts are present and you can log in.
- Point your applications at the
signoz-ingesterOTLP endpoint (its TCP proxy domain and port) and confirm new data arrives.
Symptoms: SigNoz shows no data, and system.replicas lists tables with is_readonly = 1.
Likely causes: the move to a fresh Keeper means the replicated tables cannot find their coordination metadata.
Resolution: run SYSTEM RESTORE REPLICA then SYSTEM SYNC REPLICA for each affected table (Step 6).
Symptoms: signoz-ingester crashes on start and retries.
Likely causes: the ingester runs migrate sync check at startup. If signoz-telemetrystore-migrator has not finished its sync migrations, the check fails and the ingester exits.
Resolution: wait for the migrator to finish, then redeploy the ingester.
Symptoms: SigNoz loads, but your dashboards, alerts, and users are gone.
Likely causes: the SigNoz volume is not mounted at /var/lib/signoz/, so the metastore is not found.
Resolution: set the SigNoz service volume mount path to /var/lib/signoz/ and redeploy.
Symptoms: signoz-telemetrystore-migrator exits with a non-zero code.
Likely causes: it cannot reach ClickHouse, or ClickHouse cannot reach Keeper.
Resolution: confirm signoz-telemetrystore-clickhouse is healthy and signoz-telemetrykeeper-clickhousekeeper is running, then re-run the migrator.