{
  "manifest_version": "1.0.0",
  "template": {
    "id": "1ba426f1-7df2-4e54-8122-faf8bdd9dc44",
    "slug": "langfuse-self-hosted-langsmith-alternati",
    "name": "Langfuse (Self-Hosted LangSmith Alternative)",
    "description": "Self-hosted LLM observability & tracing — a LangSmith alternative",
    "url": "https://railway.com/deploy/langfuse-self-hosted-langsmith-alternati",
    "upstream": {
      "image": "langfuse/langfuse:3.225.2"
    }
  },
  "services": [
    {
      "name": "postgres",
      "source": {
        "image": "postgres:17"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:7"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "langfuse",
      "source": {
        "image": "langfuse/langfuse:3.225.2"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "langfuse-worker",
      "source": {
        "image": "langfuse/langfuse-worker:3.225.2"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "clickhouse-server",
      "source": {
        "image": "clickhouse/clickhouse-server:25.12"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/clickhouse",
      "http": false
    },
    {
      "name": "minio",
      "source": {
        "image": "minio/minio:RELEASE.2025-04-08T15-41-24Z"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Postgres data subdirectory (keeps data off the volume root to avoid lost+found init errors)",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Name of the default database Postgres creates on first boot",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Postgres superuser username",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Auto-generated Postgres superuser password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Auto-generated Redis password (referenced by Langfuse web/worker via REDIS_AUTH)",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "langfuse",
      "description": "Web server HTTP port (Railway routes the public domain here)",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "SALT",
      "service": "langfuse",
      "description": "Auto-generated salt for hashing API keys (the worker references this value)",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "HOSTNAME",
      "service": "langfuse",
      "description": "Bind to all interfaces so Railway can reach the web server",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "REDIS_AUTH",
      "service": "langfuse",
      "description": "Redis password (references the redis service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "langfuse",
      "description": "Redis host (references the redis service private domain)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "langfuse",
      "description": "Redis port",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "DATABASE_URL",
      "service": "langfuse",
      "description": "Postgres connection string (references the postgres service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NEXTAUTH_URL",
      "service": "langfuse",
      "description": "Public URL of this Langfuse instance, used for auth callbacks (auto-set to the generated domain)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CLICKHOUSE_URL",
      "service": "langfuse",
      "description": "ClickHouse HTTP endpoint for analytics reads/writes",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "langfuse",
      "description": "Auto-generated 64-char hex key encrypting stored integration secrets (the worker references this value)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "langfuse",
      "description": "ClickHouse username (must match the clickhouse-server service)",
      "secret": false,
      "strategy": "default",
      "default": "clickhouse"
    },
    {
      "key": "NEXTAUTH_SECRET",
      "service": "langfuse",
      "description": "Auto-generated NextAuth session-signing secret",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "REDIS_TLS_ENABLED",
      "service": "langfuse",
      "description": "Redis runs on the private network without TLS",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "TELEMETRY_ENABLED",
      "service": "langfuse",
      "description": "Send anonymous usage telemetry to Langfuse (set false to disable)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "langfuse",
      "description": "ClickHouse password (references the clickhouse-server service)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_MIGRATION_URL",
      "service": "langfuse",
      "description": "ClickHouse native protocol URL used only for schema migrations",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_CLUSTER_ENABLED",
      "service": "langfuse",
      "description": "Single-node ClickHouse; disable cluster mode",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_BUCKET",
      "service": "langfuse",
      "description": "S3/MinIO bucket for raw event uploads",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_PREFIX",
      "service": "langfuse",
      "description": "Key prefix for event objects",
      "secret": false,
      "strategy": "default",
      "default": "events/"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_REGION",
      "service": "langfuse",
      "description": "S3 region (auto for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET",
      "service": "langfuse",
      "description": "S3/MinIO bucket for media uploads",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_PREFIX",
      "service": "langfuse",
      "description": "Key prefix for media objects",
      "secret": false,
      "strategy": "default",
      "default": "media/"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_REGION",
      "service": "langfuse",
      "description": "S3 region (auto for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT",
      "service": "langfuse",
      "description": "MinIO S3 endpoint for event uploads (references the minio service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT",
      "service": "langfuse",
      "description": "MinIO S3 endpoint for media uploads (references the minio service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse",
      "description": "S3 access key (MinIO root user)",
      "secret": true,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse",
      "description": "S3 access key (MinIO root user)",
      "secret": true,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse",
      "description": "Use path-style S3 addressing (required for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse",
      "description": "Use path-style S3 addressing (required for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse",
      "description": "S3 secret key (references the minio service root password)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse",
      "description": "S3 secret key (references the minio service root password)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "langfuse-worker",
      "description": "Worker HTTP port (internal only, not publicly exposed)",
      "secret": false,
      "strategy": "default",
      "default": "3030"
    },
    {
      "key": "SALT",
      "service": "langfuse-worker",
      "description": "Shared salt; references the Langfuse web service so web and worker match",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HOSTNAME",
      "service": "langfuse-worker",
      "description": "Bind to all interfaces so Railway can reach the worker",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "REDIS_AUTH",
      "service": "langfuse-worker",
      "description": "Redis password (references the redis service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "langfuse-worker",
      "description": "Redis host (references the redis service private domain)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "langfuse-worker",
      "description": "Redis port",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "DATABASE_URL",
      "service": "langfuse-worker",
      "description": "Postgres connection string (references the postgres service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_URL",
      "service": "langfuse-worker",
      "description": "ClickHouse HTTP endpoint for analytics reads/writes",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "langfuse-worker",
      "description": "Shared 64-char hex encryption key; references the Langfuse web service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "langfuse-worker",
      "description": "ClickHouse username (must match the clickhouse-server service)",
      "secret": false,
      "strategy": "default",
      "default": "clickhouse"
    },
    {
      "key": "REDIS_TLS_ENABLED",
      "service": "langfuse-worker",
      "description": "Redis runs on the private network without TLS",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "TELEMETRY_ENABLED",
      "service": "langfuse-worker",
      "description": "Send anonymous usage telemetry to Langfuse (set false to disable)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "langfuse-worker",
      "description": "ClickHouse password (references the clickhouse-server service)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_MIGRATION_URL",
      "service": "langfuse-worker",
      "description": "ClickHouse native protocol URL used only for schema migrations",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_CLUSTER_ENABLED",
      "service": "langfuse-worker",
      "description": "Single-node ClickHouse; disable cluster mode",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_BUCKET",
      "service": "langfuse-worker",
      "description": "S3/MinIO bucket for raw event uploads",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_PREFIX",
      "service": "langfuse-worker",
      "description": "Key prefix for event objects",
      "secret": false,
      "strategy": "default",
      "default": "events/"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_REGION",
      "service": "langfuse-worker",
      "description": "S3 region (auto for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET",
      "service": "langfuse-worker",
      "description": "S3/MinIO bucket for media uploads",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_PREFIX",
      "service": "langfuse-worker",
      "description": "Key prefix for media objects",
      "secret": false,
      "strategy": "default",
      "default": "media/"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_REGION",
      "service": "langfuse-worker",
      "description": "S3 region (auto for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT",
      "service": "langfuse-worker",
      "description": "MinIO S3 endpoint for event uploads (references the minio service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT",
      "service": "langfuse-worker",
      "description": "MinIO S3 endpoint for media uploads (references the minio service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse-worker",
      "description": "S3 access key (MinIO root user)",
      "secret": true,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse-worker",
      "description": "S3 access key (MinIO root user)",
      "secret": true,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse-worker",
      "description": "Use path-style S3 addressing (required for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse-worker",
      "description": "Use path-style S3 addressing (required for MinIO)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse-worker",
      "description": "S3 secret key (references the minio service root password)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse-worker",
      "description": "S3 secret key (references the minio service root password)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_DB",
      "service": "clickhouse-server",
      "description": "ClickHouse database name used by Langfuse for analytics data",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "clickhouse-server",
      "description": "ClickHouse username (referenced by the Langfuse web and worker services)",
      "secret": false,
      "strategy": "default",
      "default": "clickhouse"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "clickhouse-server",
      "description": "Auto-generated ClickHouse password (referenced by Langfuse web/worker)",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "minio",
      "description": "MinIO root (admin) username, also used as the S3 access key by Langfuse",
      "secret": false,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "minio",
      "description": "Auto-generated MinIO root password / S3 secret key",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "langfuse-self-hosted-langsmith-alternati"
      }
    },
    "cli": "railway deploy --template langfuse-self-hosted-langsmith-alternati",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "1ba426f1-7df2-4e54-8122-faf8bdd9dc44",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "433d3071-aa70-431e-803e-2accb26206da": {
                  "icon": null,
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:17"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "Postgres data subdirectory (keeps data off the volume root to avoid lost+found init errors)",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Name of the default database Postgres creates on first boot",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Postgres superuser username",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated Postgres superuser password",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "433d3071-aa70-431e-803e-2accb26206da": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "4b0f8696-49c6-4727-a726-9db5c9cd6a59": {
                  "icon": null,
                  "name": "redis",
                  "deploy": {
                    "startCommand": "sh -c 'redis-server --requirepass \"$REDIS_PASSWORD\" --maxmemory-policy noeviction'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:7"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated Redis password (referenced by Langfuse web/worker via REDIS_AUTH)",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "4b0f8696-49c6-4727-a726-9db5c9cd6a59": {
                      "mountPath": "/data"
                    }
                  }
                },
                "69596a89-2f71-44af-a26c-96ff44e08da4": {
                  "icon": null,
                  "name": "langfuse",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langfuse/langfuse:3.225.2"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Web server HTTP port (Railway routes the public domain here)",
                      "defaultValue": "3000"
                    },
                    "SALT": {
                      "isOptional": false,
                      "description": "Auto-generated salt for hashing API keys (the worker references this value)",
                      "defaultValue": "{{SALT}}"
                    },
                    "HOSTNAME": {
                      "isOptional": false,
                      "description": "Bind to all interfaces so Railway can reach the web server",
                      "defaultValue": "0.0.0.0"
                    },
                    "REDIS_AUTH": {
                      "isOptional": false,
                      "description": "Redis password (references the redis service)",
                      "defaultValue": "${{redis.REDIS_PASSWORD}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Redis host (references the redis service private domain)",
                      "defaultValue": "${{redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Redis port",
                      "defaultValue": "6379"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Postgres connection string (references the postgres service)",
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres"
                    },
                    "NEXTAUTH_URL": {
                      "isOptional": false,
                      "description": "Public URL of this Langfuse instance, used for auth callbacks (auto-set to the generated domain)",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CLICKHOUSE_URL": {
                      "isOptional": false,
                      "description": "ClickHouse HTTP endpoint for analytics reads/writes",
                      "defaultValue": "http://${{clickhouse-server.RAILWAY_PRIVATE_DOMAIN}}:8123"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "Auto-generated 64-char hex key encrypting stored integration secrets (the worker references this value)",
                      "defaultValue": "{{ENCRYPTION_KEY}}"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "ClickHouse username (must match the clickhouse-server service)",
                      "defaultValue": "clickhouse"
                    },
                    "NEXTAUTH_SECRET": {
                      "isOptional": false,
                      "description": "Auto-generated NextAuth session-signing secret",
                      "defaultValue": "{{NEXTAUTH_SECRET}}"
                    },
                    "REDIS_TLS_ENABLED": {
                      "isOptional": false,
                      "description": "Redis runs on the private network without TLS",
                      "defaultValue": "false"
                    },
                    "TELEMETRY_ENABLED": {
                      "isOptional": false,
                      "description": "Send anonymous usage telemetry to Langfuse (set false to disable)",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "ClickHouse password (references the clickhouse-server service)",
                      "defaultValue": "${{clickhouse-server.CLICKHOUSE_PASSWORD}}"
                    },
                    "CLICKHOUSE_MIGRATION_URL": {
                      "isOptional": false,
                      "description": "ClickHouse native protocol URL used only for schema migrations",
                      "defaultValue": "clickhouse://${{clickhouse-server.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CLICKHOUSE_CLUSTER_ENABLED": {
                      "isOptional": false,
                      "description": "Single-node ClickHouse; disable cluster mode",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "S3/MinIO bucket for raw event uploads",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_PREFIX": {
                      "isOptional": false,
                      "description": "Key prefix for event objects",
                      "defaultValue": "events/"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region (auto for MinIO)",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "S3/MinIO bucket for media uploads",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_PREFIX": {
                      "isOptional": false,
                      "description": "Key prefix for media objects",
                      "defaultValue": "media/"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region (auto for MinIO)",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO S3 endpoint for event uploads (references the minio service)",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO S3 endpoint for media uploads (references the minio service)",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key (MinIO root user)",
                      "defaultValue": "minio"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key (MinIO root user)",
                      "defaultValue": "minio"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Use path-style S3 addressing (required for MinIO)",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Use path-style S3 addressing (required for MinIO)",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key (references the minio service root password)",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key (references the minio service root password)",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "87c083b1-7187-4359-a4fd-0fccf36f0653": {
                  "icon": null,
                  "name": "langfuse-worker",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langfuse/langfuse-worker:3.225.2"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Worker HTTP port (internal only, not publicly exposed)",
                      "defaultValue": "3030"
                    },
                    "SALT": {
                      "isOptional": false,
                      "description": "Shared salt; references the Langfuse web service so web and worker match",
                      "defaultValue": "${{langfuse.SALT}}"
                    },
                    "HOSTNAME": {
                      "isOptional": false,
                      "description": "Bind to all interfaces so Railway can reach the worker",
                      "defaultValue": "0.0.0.0"
                    },
                    "REDIS_AUTH": {
                      "isOptional": false,
                      "description": "Redis password (references the redis service)",
                      "defaultValue": "${{redis.REDIS_PASSWORD}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Redis host (references the redis service private domain)",
                      "defaultValue": "${{redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Redis port",
                      "defaultValue": "6379"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Postgres connection string (references the postgres service)",
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres"
                    },
                    "CLICKHOUSE_URL": {
                      "isOptional": false,
                      "description": "ClickHouse HTTP endpoint for analytics reads/writes",
                      "defaultValue": "http://${{clickhouse-server.RAILWAY_PRIVATE_DOMAIN}}:8123"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "Shared 64-char hex encryption key; references the Langfuse web service",
                      "defaultValue": "${{langfuse.ENCRYPTION_KEY}}"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "ClickHouse username (must match the clickhouse-server service)",
                      "defaultValue": "clickhouse"
                    },
                    "REDIS_TLS_ENABLED": {
                      "isOptional": false,
                      "description": "Redis runs on the private network without TLS",
                      "defaultValue": "false"
                    },
                    "TELEMETRY_ENABLED": {
                      "isOptional": false,
                      "description": "Send anonymous usage telemetry to Langfuse (set false to disable)",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "ClickHouse password (references the clickhouse-server service)",
                      "defaultValue": "${{clickhouse-server.CLICKHOUSE_PASSWORD}}"
                    },
                    "CLICKHOUSE_MIGRATION_URL": {
                      "isOptional": false,
                      "description": "ClickHouse native protocol URL used only for schema migrations",
                      "defaultValue": "clickhouse://${{clickhouse-server.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CLICKHOUSE_CLUSTER_ENABLED": {
                      "isOptional": false,
                      "description": "Single-node ClickHouse; disable cluster mode",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "S3/MinIO bucket for raw event uploads",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_PREFIX": {
                      "isOptional": false,
                      "description": "Key prefix for event objects",
                      "defaultValue": "events/"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region (auto for MinIO)",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "S3/MinIO bucket for media uploads",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_PREFIX": {
                      "isOptional": false,
                      "description": "Key prefix for media objects",
                      "defaultValue": "media/"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region (auto for MinIO)",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO S3 endpoint for event uploads (references the minio service)",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO S3 endpoint for media uploads (references the minio service)",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key (MinIO root user)",
                      "defaultValue": "minio"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key (MinIO root user)",
                      "defaultValue": "minio"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Use path-style S3 addressing (required for MinIO)",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Use path-style S3 addressing (required for MinIO)",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key (references the minio service root password)",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key (references the minio service root password)",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    }
                  }
                },
                "c7ac04cb-518f-47b3-99fb-63cccf8e66ce": {
                  "icon": null,
                  "name": "clickhouse-server",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "clickhouse/clickhouse-server:25.12"
                  },
                  "variables": {
                    "CLICKHOUSE_DB": {
                      "isOptional": false,
                      "description": "ClickHouse database name used by Langfuse for analytics data",
                      "defaultValue": "default"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "ClickHouse username (referenced by the Langfuse web and worker services)",
                      "defaultValue": "clickhouse"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated ClickHouse password (referenced by Langfuse web/worker)",
                      "defaultValue": "{{CLICKHOUSE_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "c7ac04cb-518f-47b3-99fb-63cccf8e66ce": {
                      "mountPath": "/var/lib/clickhouse"
                    }
                  }
                },
                "fd972d48-457b-4b92-bea9-57b856850f5f": {
                  "icon": null,
                  "name": "minio",
                  "deploy": {
                    "startCommand": "sh -c 'mkdir -p /data/langfuse && minio server --address \":9000\" --console-address \":9001\" /data'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "minio/minio:RELEASE.2025-04-08T15-41-24Z"
                  },
                  "variables": {
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "description": "MinIO root (admin) username, also used as the S3 access key by Langfuse",
                      "defaultValue": "minio"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated MinIO root password / S3 secret key",
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "fd972d48-457b-4b92-bea9-57b856850f5f": {
                      "mountPath": "/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 6,
    "needs_volume": true
  },
  "generated_at": "2026-09-09T06:02:34.665Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-04T06:43:55.580Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_0f87bd1424724b23bae2",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": false,
        "detail": "1 service(s) crashed within 30s"
      }
    ]
  }
}
