laminar.yaml, the overrides file you pass to helm upgrade -i laminar laminar/laminar -f laminar.yaml. This page covers the settings most deployments need: AI features, Signals, Slack, OAuth login, storage, TLS, PII redaction, secrets, and image pinning. For the full value list, see values.yaml in the chart repo.
Apply any change by re-running the install command:
AI features and LLM provider
Chat-with-trace, SQL-with-AI, and Signals all run through one unified LLM provider configuration. Set the provider on all three application pods (they default togemini), and supply the key:
LLM_PROVIDER:gemini(default),openai, orbedrock. Set viafrontend.env.llmProvider,appServer.env.llmProvider, andappServerConsumer.env.llmProvider.LLM_API_KEY: the key forgeminioropenai. Set viasecrets.data.LLM_BASE_URL: optional, for OpenAI-compatible gateways (LiteLLM, OpenRouter, vLLM) or custom Gemini endpoints. Set via*.env.llmBaseUrl.LLM_MODEL_SMALL/LLM_MODEL_MEDIUM/LLM_MODEL_LARGE: optional per-tier model overrides. Per-provider defaults apply when unset. For Bedrock, these are Inference Profile IDs.
LLM_API_KEY (or AWS credentials for Bedrock) is populated.
Gemini (default)
Just supply the key:OpenAI or OpenAI-compatible gateway
AWS Bedrock
Bedrock uses AWS credentials fromsecrets.data instead of LLM_API_KEY:
Model overrides
Pin specific models per size tier (for Bedrock, values are Inference Profile IDs):Signals
Signals extract structured events from your traces using the LLM provider configured above. They are enabled by default in the frontend once anLLM_API_KEY (or Bedrock credentials) is set. No separate flag is required to turn them on.
To disable Signals:
Signal extraction runs in the
app-server-consumer pod, so its llmProvider (and any model overrides) governs how Signals are computed. Keep the provider consistent across frontend, appServer, and appServerConsumer unless you have a reason to split them.Slack notifications
Laminar posts alerts and notifications to Slack through a broker run by Laminar Cloud: your instance uses Laminar Cloud’s official Slack app, so you do not register a Slack app of your own. Laminar Cloud runs both legs of the OAuth flow on your behalf; the bot token is returned to your instance server-to-server and encrypted at rest. Your instance authenticates to the broker with an enterprise license key. Set the license key inlaminar.yaml:
SLACK_BROKER_URL defaults to Laminar Cloud’s origin (https://laminar.sh), so you normally only set the license key. To get a license key, contact founders@lmnr.ai.
Slack bot tokens are encrypted at rest with SLACK_ENCRYPTION_KEY. You do not normally set this: when left empty, the chart defaults it to your AEAD_SECRET_KEY so there is one encryption key to manage. Set it explicitly in secrets.data only if you want Slack tokens encrypted under a separate key.
OAuth login
Laminar supports OAuth login with GitHub, Google, Azure AD, Okta, and Keycloak. Add provider credentials tosecrets.data and set the frontend URLs to your real domain. Omit a provider’s credentials to disable it.
extraEnv instead of inlining them.
Secrets management
The chart reads secrets from three backends:- Kubernetes Secrets (default): values in
secrets.data. - AWS Secrets Manager: for EKS with IRSA, via the Secrets Store CSI Driver.
- HashiCorp Vault: for on-premises or multi-cloud.
secrets.awsSecretsManager and leave placeholders in secrets.data:
secrets.data). See the chart’s Secrets Management guide for the Vault and mixed-source setups.
Referencing existing Secrets with extraEnv
extraEnv injects environment variables into frontend, appServer, or appServerConsumer, supporting plain values, secretKeyRef, configMapKeyRef, and fieldRef. Entries override matching keys from secrets.data, so you can selectively swap individual values without restructuring the secrets config:
Container images
The two Laminar containers (frontend and app server) are pulled from publicghcr.io/lmnr-ai/*-ee images, so most installs never touch this section. For production, pin a specific tag instead of latest so a pod restart does not pick up a newer build. The two are released together: keep their tags in sync.
Chart
0.2.0 and newer require an app-server tag of 0.1.628 or newer and will fail at render time if you pin an older one. Earlier charts shipped a separate query-engine container; it has since been folded into the app-server image, so there is no longer a queryEngine image to pin.images.repository at the mirror, and attach imagePullSecrets to the default ServiceAccount (the chart does not template this; see the chart reference).
Storage
ClickHouse and Quickwit hold the bulk of Laminar’s data, and both can be backed by S3.ClickHouse on S3
https://storage.googleapis.com/YOUR_BUCKET/ and supply HMAC keys. The chart is designed for one HMAC key pair to back both ClickHouse and Quickwit. See the chart’s ClickHouse S3 guide.
Quickwit (full-text search)
Quickwit powers full-text search over spans.quickwit.s3.defaultIndexRootUri is the master switch for the whole Quickwit stack: leave it empty and the Quickwit workloads are skipped and search degrades gracefully (the rest of the platform is unaffected). Set it to a bucket you own to enable search:
global.cloudProvider: gcp, the chart auto-fills the GCS flavor and endpoint for you; supply the same HMAC keys used for ClickHouse via quickwit.extraEnv.
Persistent volumes
The chart creates an EBS storage class scoped to the availability zones you list. Pods with persistent volumes can only schedule on nodes in the same zone, so make sure your nodes run in these zones:postgres, clickhouse, rabbitmq) can override its storage class and size independently under <service>.persistence.
TLS and ingress
Laminar exposes two public endpoints: the frontend (web UI) and the app server (HTTP trace ingestion on443, gRPC on 8443). TLS has three paths.
cert-manager (automatic, recommended for GCP and generic clusters)
cert-manager provisions and renews free Let’s Encrypt certificates. The hostname must be publicly DNS-resolvable so Let’s Encrypt can complete the HTTP-01 challenge:AWS ACM (recommended for AWS)
On AWS, the NLB and ALB terminate TLS via an ACM certificate ARN annotation, with no in-cluster cert management:Pre-existing certificate
Import a PEM certificate as a Kubernetes TLS secret and reference it with an emptyclusterIssuer. See the chart’s NETWORKING guide for the full app-server TLS and DNS options, including external-dns automation.
On AWS, the app server’s NLB already exposes HTTP (
443) and gRPC (8443) externally; you usually do not need a separate app-server Ingress. On GCP the load balancer is pure TCP passthrough and cannot terminate TLS: front the app server with Traefik (or another ingress controller) to get TLS on both ports.PII redaction
The PII redactor is an optional CPU-only gRPC service that strips personally identifiable information from spans before they are persisted. It is disabled by default and has no database or secret dependencies (the detection model is baked into the image). When enabled, the chart injectsPII_REDACTOR_URL into the app-server and app-server-consumer pods, activating redaction during span processing.
Sharing a Postgres database
By default Laminar puts its tables in thepublic schema. To share a Postgres database with another service, point it at a dedicated schema with global.postgresSchema. The single value is dispatched to all three application pods, so they resolve the same search_path. Set it before the first deploy:
CREATE SCHEMA IF NOT EXISTS for a non-public schema. If the schema is pre-provisioned or the DB role lacks CREATE, disable that step with frontend.env.postgresCreateSchema: "false".
What’s next
Kubernetes (Helm)
Back to the install walkthrough.
Signals
Outcome and failure extraction over your traces.
PII redaction
How redaction renders in the UI and SQL.
Start tracing
Send your first traces to your instance.
