{
  "manifest_version": "1.0.0",
  "template": {
    "id": "15196f04-8ef2-48c1-96c8-c0aac4032e1d",
    "slug": "signoz-observability",
    "name": "SigNoz Observability",
    "description": "Self-hosted observability with ClickHouse and OpenTelemetry.",
    "url": "https://railway.com/deploy/signoz-observability",
    "upstream": {
      "image": "signoz/signoz:v0.122.0"
    }
  },
  "services": [
    {
      "name": "signoz",
      "source": {
        "image": "signoz/signoz:v0.122.0"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/signoz",
      "http": true
    },
    {
      "name": "zookeeper-1",
      "source": {
        "image": "signoz/zookeeper:3.7.1"
      },
      "needs_volume": true,
      "volume_mount_path": "/bitnami/zookeeper",
      "http": false
    },
    {
      "name": "otel-collector",
      "source": {
        "image": "signoz/signoz-otel-collector:v0.144.3"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "clickhouse",
      "source": {
        "image": "clickhouse/clickhouse-server:25.5.6"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/clickhouse",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "signoz",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "SIGNOZ_SQLSTORE_SQLITE_PATH",
      "service": "signoz",
      "description": "Provide a value for SIGNOZ_SQLSTORE_SQLITE_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/signoz/signoz.db"
    },
    {
      "key": "SIGNOZ_TOKENIZER_JWT_SECRET",
      "service": "signoz",
      "description": "Provide a value for SIGNOZ_TOKENIZER_JWT_SECRET.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SIGNOZ_ALERTMANAGER_PROVIDER",
      "service": "signoz",
      "description": "Provide a value for SIGNOZ_ALERTMANAGER_PROVIDER.",
      "secret": false,
      "strategy": "default",
      "default": "signoz"
    },
    {
      "key": "SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN",
      "service": "signoz",
      "description": "Provide a value for SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ZOO_SERVER_ID",
      "service": "zookeeper-1",
      "description": "Provide a value for ZOO_SERVER_ID.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "zookeeper-1",
      "description": "Provide a value for RAILWAY_RUN_UID.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "ALLOW_ANONYMOUS_LOGIN",
      "service": "zookeeper-1",
      "description": "Provide a value for ALLOW_ANONYMOUS_LOGIN.",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "ZOO_AUTOPURGE_INTERVAL",
      "service": "zookeeper-1",
      "description": "Provide a value for ZOO_AUTOPURGE_INTERVAL.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "ZOO_ENABLE_PROMETHEUS_METRICS",
      "service": "zookeeper-1",
      "description": "Provide a value for ZOO_ENABLE_PROMETHEUS_METRICS.",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "ZOO_PROMETHEUS_METRICS_PORT_NUMBER",
      "service": "zookeeper-1",
      "description": "Provide a value for ZOO_PROMETHEUS_METRICS_PORT_NUMBER.",
      "secret": false,
      "strategy": "default",
      "default": "9141"
    },
    {
      "key": "PORT",
      "service": "otel-collector",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "4318"
    },
    {
      "key": "OTEL_RESOURCE_ATTRIBUTES",
      "service": "otel-collector",
      "description": "Provide a value for OTEL_RESOURCE_ATTRIBUTES.",
      "secret": false,
      "strategy": "default",
      "default": "host.name=signoz-railway,os.type=linux"
    },
    {
      "key": "SIGNOZ_OTEL_COLLECTOR_TIMEOUT",
      "service": "otel-collector",
      "description": "Provide a value for SIGNOZ_OTEL_COLLECTOR_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "10m"
    },
    {
      "key": "LOW_CARDINAL_EXCEPTION_GROUPING",
      "service": "otel-collector",
      "description": "Provide a value for LOW_CARDINAL_EXCEPTION_GROUPING.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN",
      "service": "otel-collector",
      "description": "Provide a value for SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER",
      "service": "otel-collector",
      "description": "Provide a value for SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER.",
      "secret": false,
      "strategy": "default",
      "default": "cluster"
    },
    {
      "key": "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION",
      "service": "otel-collector",
      "description": "Provide a value for SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "clickhouse",
      "description": "Provide a value for RAILWAY_RUN_UID.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "SIGNOZ_CONFIG_BASE",
      "service": "clickhouse",
      "description": "Provide a value for SIGNOZ_CONFIG_BASE.",
      "secret": false,
      "strategy": "default",
      "default": "https://raw.githubusercontent.com/SigNoz/signoz/v0.122.0/deploy"
    },
    {
      "key": "CLICKHOUSE_SKIP_USER_SETUP",
      "service": "clickhouse",
      "description": "Provide a value for CLICKHOUSE_SKIP_USER_SETUP.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "signoz-observability"
      }
    },
    "cli": "railway deploy --template signoz-observability",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "15196f04-8ef2-48c1-96c8-c0aac4032e1d",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "76632962-d59f-494d-9bc0-dcc98e995681": {
                  "icon": null,
                  "name": "signoz",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/v1/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "signoz/signoz:v0.122.0"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8080"
                    },
                    "SIGNOZ_SQLSTORE_SQLITE_PATH": {
                      "isOptional": false,
                      "defaultValue": "/var/lib/signoz/signoz.db"
                    },
                    "SIGNOZ_TOKENIZER_JWT_SECRET": {
                      "isOptional": false,
                      "defaultValue": "{{SIGNOZ_TOKENIZER_JWT_SECRET}}"
                    },
                    "SIGNOZ_ALERTMANAGER_PROVIDER": {
                      "isOptional": false,
                      "defaultValue": "signoz"
                    },
                    "SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN": {
                      "isOptional": false,
                      "defaultValue": "tcp://${{ clickhouse.RAILWAY_PRIVATE_DOMAIN }}:9000"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "76632962-d59f-494d-9bc0-dcc98e995681": {
                      "mountPath": "/var/lib/signoz"
                    }
                  }
                },
                "a073f4bc-6a28-4368-9151-b9deee7f70df": {
                  "icon": null,
                  "name": "zookeeper-1",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "signoz/zookeeper:3.7.1"
                  },
                  "variables": {
                    "ZOO_SERVER_ID": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "ALLOW_ANONYMOUS_LOGIN": {
                      "isOptional": false,
                      "defaultValue": "yes"
                    },
                    "ZOO_AUTOPURGE_INTERVAL": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "ZOO_ENABLE_PROMETHEUS_METRICS": {
                      "isOptional": false,
                      "defaultValue": "yes"
                    },
                    "ZOO_PROMETHEUS_METRICS_PORT_NUMBER": {
                      "isOptional": false,
                      "defaultValue": "9141"
                    }
                  },
                  "volumeMounts": {
                    "a073f4bc-6a28-4368-9151-b9deee7f70df": {
                      "mountPath": "/bitnami/zookeeper"
                    }
                  }
                },
                "a797378c-2c0d-48ac-97d7-71a01fe815da": {
                  "icon": null,
                  "name": "otel-collector",
                  "deploy": {
                    "startCommand": "/bin/sh -lc '\nset -eu\n\ncat >/tmp/otel-collector-config.yaml <<YAML\nconnectors:\n  signozmeter:\n    metrics_flush_interval: 1h\n    dimensions:\n      - name: service.name\n      - name: deployment.environment\n      - name: host.name\nreceivers:\n  otlp:\n    protocols:\n      grpc:\n        endpoint: 0.0.0.0:4317\n      http:\n        endpoint: 0.0.0.0:4318\n  prometheus:\n    config:\n      global:\n        scrape_interval: 60s\n      scrape_configs:\n        - job_name: otel-collector\n          static_configs:\n          - targets:\n              - localhost:8888\n            labels:\n              job_name: otel-collector\nprocessors:\n  batch:\n    send_batch_size: 10000\n    send_batch_max_size: 11000\n    timeout: 10s\n  batch/meter:\n    send_batch_max_size: 25000\n    send_batch_size: 20000\n    timeout: 1s\n  resourcedetection:\n    detectors: [env, system]\n    timeout: 2s\n  signozspanmetrics/delta:\n    metrics_exporter: signozclickhousemetrics\n    metrics_flush_interval: 60s\n    latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s]\n    dimensions_cache_size: 100000\n    aggregation_temporality: AGGREGATION_TEMPORALITY_DELTA\n    enable_exp_histogram: true\n    dimensions:\n      - name: service.namespace\n        default: default\n      - name: deployment.environment\n        default: default\n      - name: signoz.collector.id\n      - name: service.version\n      - name: browser.platform\n      - name: browser.mobile\n      - name: k8s.cluster.name\n      - name: k8s.node.name\n      - name: k8s.namespace.name\n      - name: host.name\n      - name: host.type\n      - name: container.name\nextensions:\n  health_check:\n    endpoint: 0.0.0.0:13133\n  pprof:\n    endpoint: 0.0.0.0:1777\nexporters:\n  clickhousetraces:\n    datasource: tcp://clickhouse.railway.internal:9000/signoz_traces\n    low_cardinal_exception_grouping: \\${env:LOW_CARDINAL_EXCEPTION_GROUPING}\n    use_new_schema: true\n  signozclickhousemetrics:\n    dsn: tcp://clickhouse.railway.internal:9000/signoz_metrics\n  clickhouselogsexporter:\n    dsn: tcp://clickhouse.railway.internal:9000/signoz_logs\n    timeout: 10s\n    use_new_schema: true\n  signozclickhousemeter:\n    dsn: tcp://clickhouse.railway.internal:9000/signoz_meter\n    timeout: 45s\n    sending_queue:\n      enabled: false\n  metadataexporter:\n    cache:\n      provider: in_memory\n    dsn: tcp://clickhouse.railway.internal:9000/signoz_metadata\n    enabled: true\n    timeout: 45s\nservice:\n  telemetry:\n    logs:\n      encoding: json\n  extensions:\n    - health_check\n    - pprof\n  pipelines:\n    traces:\n      receivers: [otlp]\n      processors: [signozspanmetrics/delta, batch]\n      exporters: [clickhousetraces, metadataexporter, signozmeter]\n    metrics:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [signozclickhousemetrics, metadataexporter, signozmeter]\n    metrics/prometheus:\n      receivers: [prometheus]\n      processors: [batch]\n      exporters: [signozclickhousemetrics, metadataexporter, signozmeter]\n    logs:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [clickhouselogsexporter, metadataexporter, signozmeter]\n    metrics/meter:\n      receivers: [signozmeter]\n      processors: [batch/meter]\n      exporters: [signozclickhousemeter]\nYAML\n\n/signoz-otel-collector migrate bootstrap\n/signoz-otel-collector migrate sync up\n/signoz-otel-collector migrate async up\n/signoz-otel-collector migrate sync check\nexec /signoz-otel-collector --config=/tmp/otel-collector-config.yaml --copy-path=/var/tmp/collector-config.yaml\n'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "signoz/signoz-otel-collector:v0.144.3"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "4318"
                    },
                    "OTEL_RESOURCE_ATTRIBUTES": {
                      "isOptional": false,
                      "defaultValue": "host.name=signoz-railway,os.type=linux"
                    },
                    "SIGNOZ_OTEL_COLLECTOR_TIMEOUT": {
                      "isOptional": false,
                      "defaultValue": "10m"
                    },
                    "LOW_CARDINAL_EXCEPTION_GROUPING": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN": {
                      "isOptional": false,
                      "defaultValue": "tcp://${{ clickhouse.RAILWAY_PRIVATE_DOMAIN }}:9000"
                    },
                    "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER": {
                      "isOptional": false,
                      "defaultValue": "cluster"
                    },
                    "SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION": {
                      "isOptional": false,
                      "defaultValue": "true"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "af541d78-6bb0-46a1-b60f-587cc3a94d25": {
                  "icon": null,
                  "name": "clickhouse",
                  "deploy": {
                    "startCommand": "/bin/bash -lc '\nset -euo pipefail\n\nbase=\"${SIGNOZ_CONFIG_BASE:-https://raw.githubusercontent.com/SigNoz/signoz/v0.122.0/deploy}\"\nmkdir -p /etc/clickhouse-server/config.d /var/lib/clickhouse/preprocessed_configs /var/lib/clickhouse/user_scripts\n\nwget -q -O /etc/clickhouse-server/config.xml \"$base/common/clickhouse/config.xml\"\nwget -q -O /etc/clickhouse-server/users.xml \"$base/common/clickhouse/users.xml\"\nwget -q -O /etc/clickhouse-server/custom-function.xml \"$base/common/clickhouse/custom-function.xml\"\nwget -q -O /etc/clickhouse-server/config.d/cluster.xml \"$base/common/clickhouse/cluster.xml\"\n\nsed -i \"s/<host>zookeeper-1<\\/host>/<host>zookeeper-1.railway.internal<\\/host>/g; s/<host>clickhouse<\\/host>/<host>127.0.0.1<\\/host>/g\" /etc/clickhouse-server/config.d/cluster.xml\ncat >/etc/clickhouse-server/config.d/listen.xml <<XML\n<clickhouse>\n  <listen_host>0.0.0.0</listen_host>\n  <listen_host>::</listen_host>\n  <listen_try>1</listen_try>\n</clickhouse>\nXML\n\nif [ ! -x /var/lib/clickhouse/user_scripts/histogramQuantile ]; then\n  version=\"v0.0.1\"\n  node_os=\"$(uname -s | tr \"[:upper:]\" \"[:lower:]\")\"\n  node_arch=\"$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)\"\n  wget -q -O /tmp/histogram-quantile.tar.gz \"https://github.com/SigNoz/signoz/releases/download/histogram-quantile%2F${version}/histogram-quantile_${node_os}_${node_arch}.tar.gz\"\n  tar -xzf /tmp/histogram-quantile.tar.gz -C /tmp\n  mv /tmp/histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile\n  chmod +x /var/lib/clickhouse/user_scripts/histogramQuantile\nfi\n\nchown -R clickhouse:clickhouse /var/lib/clickhouse\nexec su -s /bin/bash clickhouse -c \"clickhouse-server --config-file=/etc/clickhouse-server/config.xml\"\n'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "clickhouse/clickhouse-server:25.5.6"
                  },
                  "variables": {
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "SIGNOZ_CONFIG_BASE": {
                      "isOptional": false,
                      "defaultValue": "https://raw.githubusercontent.com/SigNoz/signoz/v0.122.0/deploy"
                    },
                    "CLICKHOUSE_SKIP_USER_SETUP": {
                      "isOptional": false,
                      "defaultValue": "1"
                    }
                  },
                  "volumeMounts": {
                    "af541d78-6bb0-46a1-b60f-587cc3a94d25": {
                      "mountPath": "/var/lib/clickhouse"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "signoz",
      "method": "GET",
      "path": "/api/v1/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 4,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-09T06:46:04.257Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_bbf94e6153934c5195a0",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 69,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "otel-collector"
  }
}
