Deploy Laminar AI Observability

Laminar LLM tracing and evals with ClickHouse behind a password gateway

Deploy Laminar AI Observability

laminar-app-server

lmnr-ai/app-server:v0.3.4

Just deployed

laminar-frontend

lmnr-ai/frontend:v0.3.4

Just deployed

laminar-gateway

caddy:2.11-alpine

Just deployed

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

Implementation Details

What is included:

  • laminar-gateway (caddy:2.11-alpine): the public URL. Dashboard behind basic auth, /v1/* forwarded to the app server
  • laminar-frontend (ghcr.io/lmnr-ai/frontend:v0.3.4): dashboard on port 5667, private
  • laminar-app-server (ghcr.io/lmnr-ai/app-server:v0.3.4): HTTP 8000, gRPC 8001, realtime 8002, private
  • ClickHouse (clickhouse/clickhouse-server:26.5.7.64), Quickwit (quickwit/quickwit:v0.9.1), Postgres (postgres-ssl:16), all private

First steps after deploy:

  1. Wait for laminar-frontend to turn healthy. The first boot runs the database migrations and can take a few minutes.
  2. Open the laminar-gateway URL and log in with UI_USERNAME and UI_PASSWORD from the gateway's variables.
  3. On the Laminar sign in page enter your email, then create a workspace and a project.
  4. Create a project API key in the project settings.
  5. 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_URL and PUBLIC_API_BASE_URL on laminar-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

More templates in this category

View Template
Rootprint
Open-source logs and traces with full-text search on object-storage.

Rootprint
1
View Template
VPS Fleet Watch Hub with Beszel
A persistent Beszel hub for external VPS agents and fleet alerts.

dankeewithtwoes
0
View Template
Pyroscope profiling
Protected continuous profiling with durable Pyroscope storage.

Anton Orel
1