Skip to main content
Deploy LangWatch on any Kubernetes cluster using the official Helm chart. The chart supports everything from single-node development to highly-available production with replicated ClickHouse.

Prerequisites

  • Kubernetes 1.28+
  • Helm 3.12+
  • kubectl configured for your cluster
  • A StorageClass that supports dynamic provisioning (for persistent volumes)
  • A domain name (for Ingress with TLS)
  • Default resource requirements: ~6 CPU and ~18 Gi RAM (requests). See Size Overlays for smaller or larger configurations.

Quick Start

Deploy LangWatch with all dependencies managed by the chart:
Verify the installation:
Port-forward to access the UI:
autogen.enabled=true generates random secrets on each install. This is fine for testing but not for production, secrets will change on reinstall and invalidate sessions. See Production Deployment below.

Low-Resources Deployment

The default install requests ~6 CPU and ~18 Gi RAM. For smaller clusters or evaluation purposes, use the dev overlay which requests approximately ~2 CPU and ~4 Gi RAM:
This configures smaller resource limits, single replicas, and disables evaluator preloading to reduce memory usage. Suitable for development, demos, and small teams.

Production Deployment

For production, you should:
  1. Use external managed databases (PostgreSQL, Redis)
  2. Create Kubernetes Secrets manually
  3. Expose via Ingress with TLS
  4. Disable auto-generation

1. Create the app Secret

One Secret holds every chart-required value (app keys + AI gateway shared-auth keys when the gateway sub-chart is enabled). Both langwatch-app and the gateway pod mount it.
If you run with gateway.chartManaged: false (no AI gateway proxy), skip the two LW_GATEWAY_* lines. For external databases, create additional secrets:

2. Create a Values File

Start from the production example and customize. This configuration requests approximately ~8.5 CPU and ~28 Gi RAM across all pods:

3. Install

4. Verify

High-Availability Deployment

For HA with replicated ClickHouse, multiple app/worker replicas, and PodDisruptionBudgets. This configuration requests approximately ~36 CPU and ~84 Gi RAM across all pods:
Replicated ClickHouse requires an odd number of replicas (3, 5, 7) for Keeper consensus. 3 replicas is recommended for most deployments.

Overlay System

The chart ships with composable overlay files in examples/overlays/. Combine them to build your deployment configuration:

Size Overlays

Access Overlays

Infrastructure Overlays

Composing Overlays

Overlays are composable, later files override earlier ones:

ClickHouse Configuration

Standalone vs Replicated

Switch to replicated mode:

External ClickHouse

To use an existing ClickHouse instance:

Auto-Tuning

The clickhouse-serverless subchart automatically tunes ClickHouse parameters based on the CPU and memory you allocate:
You only need to set these two values, the subchart computes optimal settings for query limits, merge threads, insert batching, and S3 download parallelism.

AI Gateway sub-chart (optional)

The umbrella chart bundles the AI Gateway as an opt-in sub-chart that runs alongside the core LangWatch app. Enabling it gives you virtual keys, hierarchical budgets, multi-provider routing via Bifrost, guardrails, and prompt caching, all governed by the same control plane. Minimum viable opt-in:
That ships sane defaults (2 replicas, ClusterIP service, no ingress). For per-environment tuning (replicas, autoscaling, ingress hostname + TLS, image registry mirror, secrets injection) see AI Gateway → Self-hosting → Helm. Three things to know before flipping it on:
  1. One Secret holds everything (or use autogen.enabled=true and let the chart materialise it). Both langwatch-app and the AI gateway pod mount LW_GATEWAY_INTERNAL_SECRET + LW_GATEWAY_JWT_SECRET from the same secrets.existingSecret Secret (default langwatch-app-secrets) that also holds the app keys (credentialsEncryptionKey, cronApiKey, nextAuthSecret, virtualKeyPepper). The Production Deployment section above shows the single kubectl create secret generic command. With autogen.enabled=false and any required key missing, the preflight Job aborts the install with a clear list of what is missing; under autogen.enabled=true the chart materialises the Secret on first install via lookup-or-rand.
  2. Public ingress needs DNS + TLS. The gateway is what your LLM clients hit, so it usually wants its own hostname (e.g. gateway.your-corp.com), separate cert, separate ingress rule. See AI Gateway → Self-hosting → DNS & TLS.
  3. Worker pods must be running. Budget enforcement reads from a ClickHouse rollup that the trace-processing reactor folds into. If you deploy with workers.enabled=false, budgets stop accumulating spend and breach enforcement silently degrades. The default workers.enabled=true is correct for production.

Upgrade

Database migrations run automatically on startup. Set SKIP_PRISMA_MIGRATE=true to disable PostgreSQL migrations if needed. See Upgrade Guide for version-specific instructions.

Uninstall

This does not delete PersistentVolumeClaims. Your data in PostgreSQL, ClickHouse, and Redis PVCs is preserved. Delete them manually if you want a clean removal:

FAQ

Istio, Service Mesh

If you’re using Istio or another service mesh with automatic sidecar injection, the CronJob pods may fail because the sidecar keeps the pod alive after the job completes. Disable sidecar injection for CronJobs:

Custom StorageClass

Set a StorageClass for all persistent volumes:

Air-Gapped Environments

For clusters without internet access:
  1. Push LangWatch images to your private registry
  2. Update images.app.repository, images.langwatch_nlp.repository, images.langevals.repository
  3. Set imagePullSecrets if your registry requires authentication