{
  "manifest_version": "1.0.0",
  "template": {
    "id": "4ed985cc-e787-4951-81c7-0e402e560f1e",
    "slug": "agentic-data-stack-lite-langfuse-cloud",
    "name": "Agentic Data Stack Lite (Langfuse Cloud)",
    "description": "The Agentic Data Stack instrumented with Langfuse Cloud",
    "url": "https://railway.com/deploy/agentic-data-stack-lite-langfuse-cloud",
    "upstream": {
      "image": "ghcr.io/clickhouse/librechat-admin-panel:latest"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "clickhouse-mcp",
      "source": {
        "image": "mcp/clickhouse"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "librechat-admin-panel",
      "source": {
        "image": "ghcr.io/clickhouse/librechat-admin-panel:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "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": "mongo",
      "source": {
        "image": "mongo:8.0.17"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/db",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "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": "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"
    },
    {
      "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.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "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.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_SECRET_KEY",
      "service": "librechat",
      "description": "Langfuse secret API key.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "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": "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"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "agentic-data-stack-lite-langfuse-cloud"
      }
    },
    "cli": "railway deploy --template agentic-data-stack-lite-langfuse-cloud",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "4ed985cc-e787-4951-81c7-0e402e560f1e",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "32e06586-1184-4782-b3ee-6233fd13564b": {
                  "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": {
                      "isOptional": false,
                      "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"
                    }
                  }
                },
                "352f2883-e17b-4b7c-a577-5ecfc93724c3": {
                  "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>": {}
                    }
                  }
                },
                "550de5b1-7444-470f-9539-9cdcf6f57c0a": {
                  "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.",
                      "defaultValue": "{{LANGFUSE_BASE_URL}}"
                    },
                    "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.",
                      "defaultValue": "{{LANGFUSE_PUBLIC_KEY}}"
                    },
                    "LANGFUSE_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Langfuse secret API key.",
                      "defaultValue": "{{LANGFUSE_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>": {}
                    }
                  }
                },
                "755d25ad-2dca-4913-ad99-9e442b38c029": {
                  "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": {
                    "755d25ad-2dca-4913-ad99-9e442b38c029": {
                      "mountPath": "/var/lib/clickhouse"
                    }
                  }
                },
                "bef52ad6-a83a-4f54-8d6b-f84a364e24f7": {
                  "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": {
                    "bef52ad6-a83a-4f54-8d6b-f84a364e24f7": {
                      "mountPath": "/data/db"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "librechat-admin-panel",
      "method": "GET",
      "path": "/",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-04T17:54:19.363Z",
  "generator_version": "0.1.0"
}
