{
  "manifest_version": "1.0.0",
  "template": {
    "id": "de59e4fe-4665-4d4e-a6ee-256868e6c921",
    "slug": "agentic-data-stack-lite",
    "name": "Agentic Data Stack Lite",
    "description": "LibreChat, ClickHouse, Langfuse: an open-source agentic analytics stack",
    "url": "https://railway.com/deploy/agentic-data-stack-lite",
    "upstream": {
      "image": "ghcr.io/danny-avila/librechat:latest"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "mongo",
      "source": {
        "image": "mongo:8.0.17"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/db",
      "http": false
    },
    {
      "name": "langfuse-worker",
      "source": {
        "image": "langfuse/langfuse-worker:3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "librechat",
      "source": {
        "image": "ghcr.io/danny-avila/librechat:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "clickhouse",
      "source": {
        "image": "clickhouse/clickhouse-server"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/clickhouse",
      "http": false
    },
    {
      "name": "langfuse",
      "source": {
        "image": "langfuse/langfuse:3"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:7-alpine"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "image": "postgres:17"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "clickhouse-mcp",
      "source": {
        "image": "mcp/clickhouse"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "minio",
      "source": {
        "image": "quay.io/minio/minio"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "librechat-admin-panel",
      "source": {
        "image": "ghcr.io/clickhouse/librechat-admin-panel:latest"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "MONGO_INITDB_ROOT_PASSWORD",
      "service": "mongo",
      "description": "Root password for MongoDB. Auto-generated per deploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MONGO_INITDB_ROOT_USERNAME",
      "service": "mongo",
      "description": "Root username for MongoDB. Used by LibreChat to authenticate.",
      "secret": false,
      "strategy": "default",
      "default": "librechat"
    },
    {
      "key": "SALT",
      "service": "langfuse-worker",
      "description": "Cryptographic salt. Must match the web service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "langfuse-worker",
      "description": "Postgres connection string.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_URL",
      "service": "langfuse-worker",
      "description": "HTTP endpoint for ClickHouse.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "langfuse-worker",
      "description": "Encryption key. Must match the web service.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "langfuse-worker",
      "description": "ClickHouse username for Langfuse.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TELEMETRY_ENABLED",
      "service": "langfuse-worker",
      "description": "Whether Langfuse sends anonymous usage telemetry.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "langfuse-worker",
      "description": "ClickHouse password for Langfuse.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_CONNECTION_STRING",
      "service": "langfuse-worker",
      "description": "Redis connection string with auth and IPv6 hint.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_MIGRATION_URL",
      "service": "langfuse-worker",
      "description": "Native protocol endpoint for ClickHouse migrations.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_CLUSTER_ENABLED",
      "service": "langfuse-worker",
      "description": "Whether ClickHouse is running in cluster mode.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_BUCKET",
      "service": "langfuse-worker",
      "description": "MinIO bucket for raw trace events.",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_REGION",
      "service": "langfuse-worker",
      "description": "S3 region label.",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET",
      "service": "langfuse-worker",
      "description": "MinIO bucket for media attachments.",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_REGION",
      "service": "langfuse-worker",
      "description": "S3 region label for media uploads.",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT",
      "service": "langfuse-worker",
      "description": "MinIO endpoint URL for events.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT",
      "service": "langfuse-worker",
      "description": "MinIO endpoint URL for media uploads.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES",
      "service": "langfuse-worker",
      "description": "Toggle for unstable Langfuse features.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse-worker",
      "description": "MinIO username for events bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse-worker",
      "description": "MinIO username for media bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse-worker",
      "description": "Path-style S3 URLs required by MinIO.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse-worker",
      "description": "Path-style S3 URLs for media uploads.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse-worker",
      "description": "MinIO password for events bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse-worker",
      "description": "MinIO password for media bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HOST",
      "service": "librechat",
      "description": "Network interface LibreChat binds to. 0.0.0.0 so Railway can route requests.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "PORT",
      "service": "librechat",
      "description": "Port LibreChat listens on.",
      "secret": false,
      "strategy": "default",
      "default": "3080"
    },
    {
      "key": "SEARCH",
      "service": "librechat",
      "description": "Enable Meilisearch-backed chat search. false since this template doesn't deploy Meilisearch.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CREDS_IV",
      "service": "librechat",
      "description": "32-char hex IV paired with CREDS_KEY.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CREDS_KEY",
      "service": "librechat",
      "description": "64-char hex key encrypting LibreChat credentials at rest.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MONGO_URI",
      "service": "librechat",
      "description": "MongoDB connection string. Wired to the mongo service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "GOOGLE_KEY",
      "service": "librechat",
      "description": "Your Google AI API key. Get one at aistudio.google.com.",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "JWT_SECRET",
      "service": "librechat",
      "description": "Signing key for LibreChat access JWTs.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CONFIG_PATH",
      "service": "librechat",
      "description": "URL of the LibreChat config file fetched on boot.",
      "secret": false,
      "strategy": "default",
      "default": "https://raw.githubusercontent.com/ClickHouse/agentic-data-stack/main/librechat.railway.yaml"
    },
    {
      "key": "DOMAIN_CLIENT",
      "service": "librechat",
      "description": "Public URL of LibreChat. Required for OAuth callbacks against external MCP servers.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DOMAIN_SERVER",
      "service": "librechat",
      "description": "Same as DOMAIN_CLIENT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LANGFUSE_HOST",
      "service": "librechat",
      "description": "Langfuse host URL for the feedback-scoring path.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "librechat",
      "description": "Your OpenAI API key (sk-...). Get one at platform.openai.com.",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "ALLOW_EMAIL_LOGIN",
      "service": "librechat",
      "description": "Whether users can sign in with email + password.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ANTHROPIC_API_KEY",
      "service": "librechat",
      "description": "Your Anthropic API key (sk-ant-...). Get one at console.anthropic.com.",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "LANGFUSE_BASE_URL",
      "service": "librechat",
      "description": "Langfuse host URL used by the agents SDK for trace export. Wired to the langfuse service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ALLOW_REGISTRATION",
      "service": "librechat",
      "description": "Whether new users can self-register. true for an open demo.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "JWT_REFRESH_SECRET",
      "service": "librechat",
      "description": "Signing key for LibreChat refresh JWTs.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_PUBLIC_KEY",
      "service": "librechat",
      "description": "Langfuse public API key. Wired from the langfuse service's init keys.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_SECRET_KEY",
      "service": "librechat",
      "description": "Langfuse secret API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_MCP_AUTH_TOKEN",
      "service": "librechat",
      "description": "Bearer token sent to the in-cluster ClickHouse MCP server.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_DB",
      "service": "clickhouse",
      "description": "Default database in this ClickHouse instance. Langfuse uses it for trace storage.",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "clickhouse",
      "description": "Username for ClickHouse. Used by Langfuse to authenticate.",
      "secret": false,
      "strategy": "default",
      "default": "clickhouse"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "clickhouse",
      "description": "Password for ClickHouse. Auto-generated per deploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "SALT",
      "service": "langfuse",
      "description": "Cryptographic salt for password hashing.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DATABASE_URL",
      "service": "langfuse",
      "description": "Postgres connection string. Wired from the postgres service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NEXTAUTH_URL",
      "service": "langfuse",
      "description": "Public URL of the Langfuse web service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CLICKHOUSE_URL",
      "service": "langfuse",
      "description": "HTTP endpoint for ClickHouse.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "langfuse",
      "description": "64-char hex key encrypting sensitive Langfuse data at rest.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "langfuse",
      "description": "ClickHouse username for Langfuse.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "NEXTAUTH_SECRET",
      "service": "langfuse",
      "description": "NextAuth session crypto secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "TELEMETRY_ENABLED",
      "service": "langfuse",
      "description": "Whether Langfuse sends anonymous usage telemetry.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "langfuse",
      "description": "ClickHouse password for Langfuse.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_INIT_ORG_ID",
      "service": "langfuse",
      "description": "Organization ID auto-created on first boot.",
      "secret": false,
      "strategy": "default",
      "default": "default-org"
    },
    {
      "key": "LANGFUSE_INIT_ORG_NAME",
      "service": "langfuse",
      "description": "Organization name shown in the Langfuse UI.",
      "secret": false,
      "strategy": "default",
      "default": "Default Organization"
    },
    {
      "key": "LANGFUSE_INIT_USER_NAME",
      "service": "langfuse",
      "description": "Display name of the initial admin user.",
      "secret": false,
      "strategy": "default",
      "default": "Admin"
    },
    {
      "key": "REDIS_CONNECTION_STRING",
      "service": "langfuse",
      "description": "Redis connection string with auth and IPv6 hint.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CLICKHOUSE_MIGRATION_URL",
      "service": "langfuse",
      "description": "Native protocol endpoint for ClickHouse migrations.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_INIT_PROJECT_ID",
      "service": "langfuse",
      "description": "Default project ID auto-created on first boot.",
      "secret": false,
      "strategy": "default",
      "default": "default-project"
    },
    {
      "key": "LANGFUSE_INIT_USER_EMAIL",
      "service": "langfuse",
      "description": "Email of the initial admin user. Sign in with this.",
      "secret": false,
      "strategy": "default",
      "default": "admin@example.com"
    },
    {
      "key": "CLICKHOUSE_CLUSTER_ENABLED",
      "service": "langfuse",
      "description": "Whether ClickHouse is running in cluster mode.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_INIT_PROJECT_NAME",
      "service": "langfuse",
      "description": "Default project name.",
      "secret": false,
      "strategy": "default",
      "default": "Default Project"
    },
    {
      "key": "LANGFUSE_INIT_USER_PASSWORD",
      "service": "langfuse",
      "description": "Password of the initial admin user.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_BUCKET",
      "service": "langfuse",
      "description": "MinIO bucket for raw trace events.",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_REGION",
      "service": "langfuse",
      "description": "S3 region label.",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET",
      "service": "langfuse",
      "description": "MinIO bucket for media attachments.",
      "secret": false,
      "strategy": "default",
      "default": "langfuse"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_REGION",
      "service": "langfuse",
      "description": "S3 region label for media uploads.",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "LANGFUSE_INIT_PROJECT_PUBLIC_KEY",
      "service": "langfuse",
      "description": "Public API key for the default project. Used by LibreChat to send traces.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_INIT_PROJECT_SECRET_KEY",
      "service": "langfuse",
      "description": "Secret API key for the default project.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT",
      "service": "langfuse",
      "description": "MinIO endpoint URL for events.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT",
      "service": "langfuse",
      "description": "MinIO endpoint URL for media uploads.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES",
      "service": "langfuse",
      "description": "Toggle for unstable Langfuse features.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse",
      "description": "MinIO username for events bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID",
      "service": "langfuse",
      "description": "MinIO username for media bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse",
      "description": "Path-style S3 URLs required by MinIO.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE",
      "service": "langfuse",
      "description": "Path-style S3 URLs for media uploads.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse",
      "description": "MinIO password for events bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY",
      "service": "langfuse",
      "description": "MinIO password for media bucket.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Auth password for Redis. Enforced via the --requirepass start command; referenced by Langfuse services in their connection string.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Default Postgres database name. Langfuse migrations target this database.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Postgres superuser.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Postgres password. Auto-generated per deploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "CLICKHOUSE_HOST",
      "service": "clickhouse-mcp",
      "description": "Hostname of the ClickHouse instance the MCP server queries. Defaults to the public demo cluster.",
      "secret": false,
      "strategy": "default",
      "default": "sql-clickhouse.clickhouse.com"
    },
    {
      "key": "CLICKHOUSE_PORT",
      "service": "clickhouse-mcp",
      "description": "Port for the ClickHouse HTTPS interface.",
      "secret": false,
      "strategy": "default",
      "default": "8443"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "clickhouse-mcp",
      "description": "Username for the demo cluster.",
      "secret": false,
      "strategy": "default",
      "default": "demo"
    },
    {
      "key": "CLICKHOUSE_SECURE",
      "service": "clickhouse-mcp",
      "description": "Whether to use TLS when connecting.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "clickhouse-mcp",
      "description": "MUST be left blank - if Railway prevents you from deploying from template without populating this field, please remember to change it back to an empty value after deployment, otherwise calls to the clickhouse sample database will fail auth.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "CLICKHOUSE_MCP_BIND_HOST",
      "service": "clickhouse-mcp",
      "description": "Network interface the MCP server listens on. 0.0.0.0 so Railway can route to it.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "CLICKHOUSE_MCP_BIND_PORT",
      "service": "clickhouse-mcp",
      "description": "Port the MCP server listens on.",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "CLICKHOUSE_MCP_AUTH_TOKEN",
      "service": "clickhouse-mcp",
      "description": "Bearer token LibreChat sends to authenticate MCP requests. Auto-generated per deploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CLICKHOUSE_MCP_SERVER_TRANSPORT",
      "service": "clickhouse-mcp",
      "description": "Transport protocol. http so LibreChat can connect via streamable-http.",
      "secret": false,
      "strategy": "default",
      "default": "http"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "minio",
      "description": "Root username for MinIO. Used as the S3 access key by Langfuse uploads.",
      "secret": false,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "minio",
      "description": "Root password for MinIO. Used as the S3 secret key. Auto-generated per deploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "librechat-admin-panel",
      "description": "Port the admin panel listens on.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "API_SERVER_URL",
      "service": "librechat-admin-panel",
      "description": "Server-side LibreChat API URL over the private network.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SESSION_SECRET",
      "service": "librechat-admin-panel",
      "description": "32+ char crypto secret for admin panel sessions.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "VITE_API_BASE_URL",
      "service": "librechat-admin-panel",
      "description": "Browser-facing LibreChat API URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "agentic-data-stack-lite"
      }
    },
    "cli": "railway deploy --template agentic-data-stack-lite",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "de59e4fe-4665-4d4e-a6ee-256868e6c921",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "300c1d48-1df1-4a8d-9216-df045ff29616": {
                  "icon": "https://devicons.railway.app/mongo",
                  "name": "mongo",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "mongo:8.0.17"
                  },
                  "variables": {
                    "MONGO_INITDB_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Root password for MongoDB. Auto-generated per deploy.",
                      "defaultValue": "{{MONGO_INITDB_ROOT_PASSWORD}}"
                    },
                    "MONGO_INITDB_ROOT_USERNAME": {
                      "isOptional": false,
                      "description": "Root username for MongoDB. Used by LibreChat to authenticate.",
                      "defaultValue": "librechat"
                    }
                  },
                  "volumeMounts": {
                    "300c1d48-1df1-4a8d-9216-df045ff29616": {
                      "mountPath": "/data/db"
                    }
                  }
                },
                "35c1768d-4010-46ce-af81-7b2ca24471be": {
                  "icon": "https://raw.githubusercontent.com/langfuse/langfuse/8f2e30bbefa0a48ea4c1e9164fdc560b2bd6c938/web/public/icon.svg",
                  "name": "langfuse-worker",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langfuse/langfuse-worker:3"
                  },
                  "variables": {
                    "SALT": {
                      "isOptional": false,
                      "description": "Cryptographic salt. Must match the web service.",
                      "defaultValue": "${{langfuse.SALT}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Postgres connection string.",
                      "defaultValue": "postgresql://${{postgres.POSTGRES_USER}}:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/${{postgres.POSTGRES_DB}}"
                    },
                    "CLICKHOUSE_URL": {
                      "isOptional": false,
                      "description": "HTTP endpoint for ClickHouse.",
                      "defaultValue": "http://${{clickhouse.RAILWAY_PRIVATE_DOMAIN}}:8123"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "Encryption key. Must match the web service.",
                      "defaultValue": "${{langfuse.ENCRYPTION_KEY}}"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "ClickHouse username for Langfuse.",
                      "defaultValue": "${{clickhouse.CLICKHOUSE_USER}}"
                    },
                    "TELEMETRY_ENABLED": {
                      "isOptional": false,
                      "description": "Whether Langfuse sends anonymous usage telemetry.",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "ClickHouse password for Langfuse.",
                      "defaultValue": "${{clickhouse.CLICKHOUSE_PASSWORD}}"
                    },
                    "REDIS_CONNECTION_STRING": {
                      "isOptional": false,
                      "description": "Redis connection string with auth and IPv6 hint.",
                      "defaultValue": "redis://default:${{redis.REDIS_PASSWORD}}@${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0?family=6"
                    },
                    "CLICKHOUSE_MIGRATION_URL": {
                      "isOptional": false,
                      "description": "Native protocol endpoint for ClickHouse migrations.",
                      "defaultValue": "clickhouse://${{clickhouse.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CLICKHOUSE_CLUSTER_ENABLED": {
                      "isOptional": false,
                      "description": "Whether ClickHouse is running in cluster mode.",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "MinIO bucket for raw trace events.",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region label.",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "MinIO bucket for media attachments.",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region label for media uploads.",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO endpoint URL for events.",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO endpoint URL for media uploads.",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES": {
                      "isOptional": false,
                      "description": "Toggle for unstable Langfuse features.",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "MinIO username for events bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_USER}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "MinIO username for media bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_USER}}"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 URLs required by MinIO.",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 URLs for media uploads.",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO password for events bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO password for media bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    }
                  }
                },
                "391ac48d-3f85-4022-bc6b-a6ccba0c0e2d": {
                  "icon": "https://raw.githubusercontent.com/danny-avila/LibreChat/main/client/public/assets/logo.svg ",
                  "name": "librechat",
                  "deploy": {
                    "startCommand": "",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/danny-avila/librechat:latest"
                  },
                  "variables": {
                    "HOST": {
                      "isOptional": false,
                      "description": "Network interface LibreChat binds to. 0.0.0.0 so Railway can route requests.",
                      "defaultValue": "0.0.0.0"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Port LibreChat listens on.",
                      "defaultValue": "3080"
                    },
                    "SEARCH": {
                      "isOptional": false,
                      "description": "Enable Meilisearch-backed chat search. false since this template doesn't deploy Meilisearch.",
                      "defaultValue": "false"
                    },
                    "CREDS_IV": {
                      "isOptional": false,
                      "description": "32-char hex IV paired with CREDS_KEY.",
                      "defaultValue": "{{CREDS_IV}}"
                    },
                    "CREDS_KEY": {
                      "isOptional": false,
                      "description": "64-char hex key encrypting LibreChat credentials at rest.",
                      "defaultValue": "{{CREDS_KEY}}"
                    },
                    "MONGO_URI": {
                      "isOptional": false,
                      "description": "MongoDB connection string. Wired to the mongo service.",
                      "defaultValue": "mongodb://${{mongo.MONGO_INITDB_ROOT_USERNAME}}:${{mongo.MONGO_INITDB_ROOT_PASSWORD}}@${{mongo.RAILWAY_PRIVATE_DOMAIN}}:27017/LibreChat?authSource=admin"
                    },
                    "GOOGLE_KEY": {
                      "isOptional": false,
                      "description": "Your Google AI API key. Get one at aistudio.google.com.",
                      "defaultValue": "user_provided"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "Signing key for LibreChat access JWTs.",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "CONFIG_PATH": {
                      "isOptional": false,
                      "description": "URL of the LibreChat config file fetched on boot.",
                      "defaultValue": "https://raw.githubusercontent.com/ClickHouse/agentic-data-stack/main/librechat.railway.yaml"
                    },
                    "DOMAIN_CLIENT": {
                      "isOptional": false,
                      "description": "Public URL of LibreChat. Required for OAuth callbacks against external MCP servers.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DOMAIN_SERVER": {
                      "isOptional": false,
                      "description": "Same as DOMAIN_CLIENT.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LANGFUSE_HOST": {
                      "isOptional": false,
                      "description": "Langfuse host URL for the feedback-scoring path.",
                      "defaultValue": "http://${{langfuse.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "Your OpenAI API key (sk-...). Get one at platform.openai.com.",
                      "defaultValue": "user_provided"
                    },
                    "ALLOW_EMAIL_LOGIN": {
                      "isOptional": false,
                      "description": "Whether users can sign in with email + password.",
                      "defaultValue": "true"
                    },
                    "ANTHROPIC_API_KEY": {
                      "isOptional": false,
                      "description": "Your Anthropic API key (sk-ant-...). Get one at console.anthropic.com.",
                      "defaultValue": "user_provided"
                    },
                    "LANGFUSE_BASE_URL": {
                      "isOptional": false,
                      "description": "Langfuse host URL used by the agents SDK for trace export. Wired to the langfuse service.",
                      "defaultValue": "http://${{langfuse.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "ALLOW_REGISTRATION": {
                      "isOptional": false,
                      "description": "Whether new users can self-register. true for an open demo.",
                      "defaultValue": "true"
                    },
                    "JWT_REFRESH_SECRET": {
                      "isOptional": false,
                      "description": "Signing key for LibreChat refresh JWTs.",
                      "defaultValue": "{{JWT_REFRESH_SECRET}}"
                    },
                    "LANGFUSE_PUBLIC_KEY": {
                      "isOptional": false,
                      "description": "Langfuse public API key. Wired from the langfuse service's init keys.",
                      "defaultValue": "${{langfuse.LANGFUSE_INIT_PROJECT_PUBLIC_KEY}}"
                    },
                    "LANGFUSE_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Langfuse secret API key.",
                      "defaultValue": "${{langfuse.LANGFUSE_INIT_PROJECT_SECRET_KEY}}"
                    },
                    "CLICKHOUSE_MCP_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "Bearer token sent to the in-cluster ClickHouse MCP server.",
                      "defaultValue": "${{clickhouse-mcp.CLICKHOUSE_MCP_AUTH_TOKEN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "3bf06507-3eb3-4098-901f-7d8069e8e5b7": {
                  "icon": "https://devicons.railway.app/cli",
                  "name": "clickhouse",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "clickhouse/clickhouse-server"
                  },
                  "variables": {
                    "CLICKHOUSE_DB": {
                      "isOptional": false,
                      "description": "Default database in this ClickHouse instance. Langfuse uses it for trace storage.",
                      "defaultValue": "default"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "Username for ClickHouse. Used by Langfuse to authenticate.",
                      "defaultValue": "clickhouse"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Password for ClickHouse. Auto-generated per deploy.",
                      "defaultValue": "{{CLICKHOUSE_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "3bf06507-3eb3-4098-901f-7d8069e8e5b7": {
                      "mountPath": "/var/lib/clickhouse"
                    }
                  }
                },
                "5c491798-f948-4d43-bf6e-6a9477f81284": {
                  "icon": "https://raw.githubusercontent.com/langfuse/langfuse/8f2e30bbefa0a48ea4c1e9164fdc560b2bd6c938/web/public/icon.svg",
                  "name": "langfuse",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/public/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langfuse/langfuse:3"
                  },
                  "variables": {
                    "SALT": {
                      "isOptional": false,
                      "description": "Cryptographic salt for password hashing.",
                      "defaultValue": "{{SALT}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Postgres connection string. Wired from the postgres service.",
                      "defaultValue": "postgresql://${{postgres.POSTGRES_USER}}:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/${{postgres.POSTGRES_DB}}"
                    },
                    "NEXTAUTH_URL": {
                      "isOptional": false,
                      "description": "Public URL of the Langfuse web service.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CLICKHOUSE_URL": {
                      "isOptional": false,
                      "description": "HTTP endpoint for ClickHouse.",
                      "defaultValue": "http://${{clickhouse.RAILWAY_PRIVATE_DOMAIN}}:8123"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "64-char hex key encrypting sensitive Langfuse data at rest.",
                      "defaultValue": "{{ENCRYPTION_KEY}}"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "ClickHouse username for Langfuse.",
                      "defaultValue": "${{clickhouse.CLICKHOUSE_USER}}"
                    },
                    "NEXTAUTH_SECRET": {
                      "isOptional": false,
                      "description": "NextAuth session crypto secret.",
                      "defaultValue": "{{NEXTAUTH_SECRET}}"
                    },
                    "TELEMETRY_ENABLED": {
                      "isOptional": false,
                      "description": "Whether Langfuse sends anonymous usage telemetry.",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "ClickHouse password for Langfuse.",
                      "defaultValue": "${{clickhouse.CLICKHOUSE_PASSWORD}}"
                    },
                    "LANGFUSE_INIT_ORG_ID": {
                      "isOptional": false,
                      "description": "Organization ID auto-created on first boot.",
                      "defaultValue": "default-org"
                    },
                    "LANGFUSE_INIT_ORG_NAME": {
                      "isOptional": false,
                      "description": "Organization name shown in the Langfuse UI.",
                      "defaultValue": "Default Organization"
                    },
                    "LANGFUSE_INIT_USER_NAME": {
                      "isOptional": false,
                      "description": "Display name of the initial admin user.",
                      "defaultValue": "Admin"
                    },
                    "REDIS_CONNECTION_STRING": {
                      "isOptional": false,
                      "description": "Redis connection string with auth and IPv6 hint.",
                      "defaultValue": "redis://default:${{redis.REDIS_PASSWORD}}@${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0?family=6"
                    },
                    "CLICKHOUSE_MIGRATION_URL": {
                      "isOptional": false,
                      "description": "Native protocol endpoint for ClickHouse migrations.",
                      "defaultValue": "clickhouse://${{clickhouse.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_INIT_PROJECT_ID": {
                      "isOptional": false,
                      "description": "Default project ID auto-created on first boot.",
                      "defaultValue": "default-project"
                    },
                    "LANGFUSE_INIT_USER_EMAIL": {
                      "isOptional": false,
                      "description": "Email of the initial admin user. Sign in with this.",
                      "defaultValue": "admin@example.com"
                    },
                    "CLICKHOUSE_CLUSTER_ENABLED": {
                      "isOptional": false,
                      "description": "Whether ClickHouse is running in cluster mode.",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_INIT_PROJECT_NAME": {
                      "isOptional": false,
                      "description": "Default project name.",
                      "defaultValue": "Default Project"
                    },
                    "LANGFUSE_INIT_USER_PASSWORD": {
                      "isOptional": false,
                      "description": "Password of the initial admin user.",
                      "defaultValue": "{{LANGFUSE_INIT_USER_PASSWORD}}"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "MinIO bucket for raw trace events.",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region label.",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_BUCKET": {
                      "isOptional": false,
                      "description": "MinIO bucket for media attachments.",
                      "defaultValue": "langfuse"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_REGION": {
                      "isOptional": false,
                      "description": "S3 region label for media uploads.",
                      "defaultValue": "auto"
                    },
                    "LANGFUSE_INIT_PROJECT_PUBLIC_KEY": {
                      "isOptional": false,
                      "description": "Public API key for the default project. Used by LibreChat to send traces.",
                      "defaultValue": "{{LANGFUSE_INIT_PROJECT_PUBLIC_KEY}}"
                    },
                    "LANGFUSE_INIT_PROJECT_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Secret API key for the default project.",
                      "defaultValue": "{{LANGFUSE_INIT_PROJECT_SECRET_KEY}}"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO endpoint URL for events.",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO endpoint URL for media uploads.",
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES": {
                      "isOptional": false,
                      "description": "Toggle for unstable Langfuse features.",
                      "defaultValue": "false"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "MinIO username for events bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_USER}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "MinIO username for media bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_USER}}"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 URLs required by MinIO.",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 URLs for media uploads.",
                      "defaultValue": "true"
                    },
                    "LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO password for events bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO password for media bucket.",
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "8c88959a-5520-40f4-a6d0-e8ec50aba2fe": {
                  "icon": "https://devicons.railway.app/redis",
                  "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-alpine"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Auth password for Redis. Enforced via the --requirepass start command; referenced by Langfuse services in their connection string.",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "haTemplateCode": "redis-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxies",
                      "options": [
                        1,
                        2
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "HAProxy instances routing writes to the primary",
                      "defaultValue": 2
                    },
                    "replica": {
                      "label": "Redis Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "Redis",
                      "description": "Nodes running Redis + colocated Sentinel",
                      "defaultValue": 2
                    },
                    "internal": null,
                    "description": "This will convert your Redis instance to an HA cluster with Sentinel failover and HAProxy routing to the primary."
                  }
                },
                "9a501bff-12a9-47b2-b775-1a5f5ab03844": {
                  "icon": "https://devicons.railway.app/postgres",
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:17"
                  },
                  "variables": {
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Default Postgres database name. Langfuse migrations target this database.",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Postgres superuser.",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password. Auto-generated per deploy.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  }
                },
                "d764ff6f-bca6-4d6f-bacb-3af7b5c1fc16": {
                  "icon": "https://devicons.railway.app/cli",
                  "name": "clickhouse-mcp",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "mcp/clickhouse"
                  },
                  "variables": {
                    "CLICKHOUSE_HOST": {
                      "isOptional": false,
                      "description": "Hostname of the ClickHouse instance the MCP server queries. Defaults to the public demo cluster.",
                      "defaultValue": "sql-clickhouse.clickhouse.com"
                    },
                    "CLICKHOUSE_PORT": {
                      "isOptional": false,
                      "description": "Port for the ClickHouse HTTPS interface.",
                      "defaultValue": "8443"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "Username for the demo cluster.",
                      "defaultValue": "demo"
                    },
                    "CLICKHOUSE_SECURE": {
                      "isOptional": false,
                      "description": "Whether to use TLS when connecting.",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "description": "MUST be left blank - if Railway prevents you from deploying from template without populating this field, please remember to change it back to an empty value after deployment, otherwise calls to the clickhouse sample database will fail auth.",
                      "defaultValue": "{{CLICKHOUSE_PASSWORD}}"
                    },
                    "CLICKHOUSE_MCP_BIND_HOST": {
                      "isOptional": false,
                      "description": "Network interface the MCP server listens on. 0.0.0.0 so Railway can route to it.",
                      "defaultValue": "0.0.0.0"
                    },
                    "CLICKHOUSE_MCP_BIND_PORT": {
                      "isOptional": false,
                      "description": "Port the MCP server listens on.",
                      "defaultValue": "8000"
                    },
                    "CLICKHOUSE_MCP_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "Bearer token LibreChat sends to authenticate MCP requests. Auto-generated per deploy.",
                      "defaultValue": "{{CLICKHOUSE_MCP_AUTH_TOKEN}}"
                    },
                    "CLICKHOUSE_MCP_SERVER_TRANSPORT": {
                      "isOptional": false,
                      "description": "Transport protocol. http so LibreChat can connect via streamable-http.",
                      "defaultValue": "http"
                    }
                  }
                },
                "f1c4140a-60b9-44da-a93c-f85225690e60": {
                  "icon": "https://devicons.railway.app/minio",
                  "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": "quay.io/minio/minio"
                  },
                  "variables": {
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "description": "Root username for MinIO. Used as the S3 access key by Langfuse uploads.",
                      "defaultValue": "minio"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Root password for MinIO. Used as the S3 secret key. Auto-generated per deploy.",
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  }
                },
                "f324c07b-dbf8-4bc2-b0b3-e991ac087acf": {
                  "icon": "https://raw.githubusercontent.com/LibreChat-AI/librechat.ai/9587c90b0af53185d70398853bcd5712eac226fc/public/librechat_alt.svg",
                  "name": "librechat-admin-panel",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/clickhouse/librechat-admin-panel:latest"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port the admin panel listens on.",
                      "defaultValue": "3000"
                    },
                    "API_SERVER_URL": {
                      "isOptional": false,
                      "description": "Server-side LibreChat API URL over the private network.",
                      "defaultValue": "http://${{librechat.RAILWAY_PRIVATE_DOMAIN}}:3080"
                    },
                    "SESSION_SECRET": {
                      "isOptional": false,
                      "description": "32+ char crypto secret for admin panel sessions.",
                      "defaultValue": "{{SESSION_SECRET}}"
                    },
                    "VITE_API_BASE_URL": {
                      "isOptional": false,
                      "description": "Browser-facing LibreChat API URL.",
                      "defaultValue": "https://${{librechat.RAILWAY_PUBLIC_DOMAIN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "librechat",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 10,
    "needs_volume": true
  },
  "generated_at": "2026-09-04T13:32:45.587Z",
  "generator_version": "0.1.0"
}
