
Deploy Laminar AI Observability
Laminar LLM tracing and evals with ClickHouse behind a password gateway
Just deployed
laminar-app-server
Just deployed
laminar-frontend
Just deployed
laminar-gateway
Just deployed
Quickwit
Just deployed
ClickHouse
Just deployed
Deploy and Host Laminar AI Observability on Railway
Laminar is an open source observability platform built for AI agents. It records every LLM call, tool call and agent step as OpenTelemetry traces, lets you search and query them with SQL, run evals, build datasets from real traces and chart cost, latency and token usage on custom dashboards. One line of SDK code traces the Vercel AI SDK, LangChain, OpenAI, Anthropic, Gemini, Browser Use and more.
About Hosting Laminar AI Observability
Hosting Laminar means running five containers together: the Next.js dashboard, the Rust app server that ingests traces, ClickHouse for spans and traces, Postgres for users, projects and API keys, and Quickwit for full text search. This template deploys upstream's lightweight self-hosting stack pinned to release v0.3.4, gives ClickHouse, Quickwit and Postgres their own volumes, generates every secret, runs all migrations on first boot and adds a small Caddy gateway as the only public service. The gateway puts the dashboard behind a generated login and forwards only the SDK API under /v1, where every request needs a project API key. That matters because a self-hosted Laminar signs in anyone with any email and no password.
Common Use Cases
- Agent debugging: follow a failing agent run step by step, with full inputs, outputs, tool calls and timings
- LLM cost and latency tracking: token usage and spend per model, route or user, on dashboards you build with SQL
- Evals in CI: run the Laminar eval SDK in your pipeline and compare results across runs in the UI
- Datasets from production: turn real traces into labeled datasets for evals and fine tuning
- Private tracing backend: keep prompts and completions inside your own Railway project
Dependencies for Laminar AI Observability Hosting
- ClickHouse: included, with a persistent volume
- PostgreSQL: included, with a persistent volume
- Quickwit: included, with a persistent volume
- An LLM provider API key: optional, only for chat with trace and SQL with AI
- Railway Hobby plan or higher: the stack does not fit Trial or Free memory limits
Deployment Dependencies
- Laminar self-hosting with Docker Compose
- Laminar hosting options
- Laminar tracing docs
- Laminar GitHub repository
Implementation Details
What is included:
laminar-gateway(caddy:2.11-alpine): the public URL. Dashboard behind basic auth,/v1/*forwarded to the app serverlaminar-frontend(ghcr.io/lmnr-ai/frontend:v0.3.4): dashboard on port 5667, privatelaminar-app-server(ghcr.io/lmnr-ai/app-server:v0.3.4): HTTP 8000, gRPC 8001, realtime 8002, privateClickHouse(clickhouse/clickhouse-server:26.5.7.64),Quickwit(quickwit/quickwit:v0.9.1),Postgres(postgres-ssl:16), all private
First steps after deploy:
- Wait for
laminar-frontendto turn healthy. The first boot runs the database migrations and can take a few minutes. - Open the
laminar-gatewayURL and log in withUI_USERNAMEandUI_PASSWORDfrom the gateway's variables. - On the Laminar sign in page enter your email, then create a workspace and a project.
- Create a project API key in the project settings.
- Point the SDK at the gateway over HTTP:
from lmnr import Laminar
Laminar.initialize(
project_api_key="",
base_url="https://",
force_http=True,
)
Any OTLP/HTTP exporter works too: send to https:///v1/traces with the header Authorization: Bearer .
Key variables:
# laminar-gateway
UI_USERNAME=admin
UI_PASSWORD=${{secret(24)}}
# laminar-frontend
NEXTAUTH_URL=https://${{laminar-gateway.RAILWAY_PUBLIC_DOMAIN}}
NEXTAUTH_SECRET=${{secret(32)}}
DATABASE_URL=${{Postgres.DATABASE_PRIVATE_URL}}
BACKEND_URL=http://${{laminar-app-server.RAILWAY_PRIVATE_DOMAIN}}:8000
CLICKHOUSE_URL=http://${{ClickHouse.RAILWAY_PRIVATE_DOMAIN}}:8123
LLM_PROVIDER=
LLM_API_KEY=
# laminar-app-server
ENVIRONMENT=LITE
AEAD_SECRET_KEY=${{secret(64,"abcdef0123456789")}}
QUICKWIT_INGEST_URL=http://${{Quickwit.RAILWAY_PRIVATE_DOMAIN}}:7281
Good to know:
- Anyone with the gateway password can sign in as any email, so share it only with people who should have full access. Keep the dashboard and the app server without public domains.
- Lightweight mode queues spans in the app server's memory. A restart can drop spans that were accepted but not yet written.
- gRPC ingestion is available only inside the Railway project (
laminar-app-server.railway.internal:8001). From outside, use HTTP as shown above. - If you add a custom domain to the gateway, update
NEXTAUTH_URL,NEXT_PUBLIC_URLandPUBLIC_API_BASE_URLonlaminar-frontend.
Why Deploy Laminar AI Observability on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying Laminar AI Observability on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
Template Content
laminar-app-server
ghcr.io/lmnr-ai/app-server:v0.3.4laminar-frontend
ghcr.io/lmnr-ai/frontend:v0.3.4laminar-gateway
caddy:2.11-alpineQuickwit
quickwit/quickwit:v0.9.1ClickHouse
clickhouse/clickhouse-server:26.5.7.64
