Linux & Kubernetes
Install Helix on a Linux server or Kubernetes cluster, from licensing through first login.
Licensing
A license is required to run Helix on Linux or Kubernetes.
- Developer license — for individuals, testing, and businesses with less than $10M annual revenue or fewer than 250 employees. Buy a developer license →
- Enterprise license — for larger organizations with RBAC, SSO, SOC 2 Type II, and dedicated onboarding. Enterprise licensing →
Helix runs on any Kubernetes cluster — bare metal, Hetzner, OVH, AWS (EKS), GCP (GKE), or Azure (AKS). If you can run containers, you can run Helix.
For air-gapped deployments, see Sovereign Server.
Single Linux server
To install Helix on a Linux server with NVIDIA or AMD GPU support:
curl -sL -O https://get.helixml.tech/install.sh && bash install.shThe installer detects your hardware and configures the sandbox automatically. On NVIDIA GPUs, hardware H.264 encoding is enabled automatically.
After installation, access Helix at http://localhost:8080. The first registered user becomes an admin.
Kubernetes install
Helm charts
Helix ships as two separate Helm charts:
| Chart | Purpose | Required? |
|---|---|---|
helix-controlplane | API, UI, RAG, and orchestration | Yes |
helix-sandbox | Docker-in-Docker host for agent desktop sessions | Recommended (required for spec tasks and coding agents) |
Both charts are published to https://charts.helixml.tech.
Prerequisites
- Kubernetes 1.28+. AKS/EKS/GKE Autopilot is not supported (sandbox requires privileged pods).
kubectland Helm 3.x- A Helix license key from your account
- A
StorageClassthat supportsReadWriteOncePVCs - At least 8 vCPU / 24 GiB RAM for a minimal control-plane-only install (the Haystack embedding sidecar loads a ~4 GB model on first start)
- At least one LLM provider (OpenAI, Anthropic, Together, or any OpenAI-compatible endpoint)
Cloud GPU quota
On fresh AWS/Azure/GCP accounts, GPU quota is 0 by default. Request quota before starting:
- AWS:
g5/p4dEC2 families per region - Azure:
NVadsV710v5(AMD) orNC*/ND*(NVIDIA) families + "Total Regional vCPUs" - GCP:
nvidia-*GPU quotas per region
Step 1: Create namespace and secrets
kubectl create namespace helix
kubectl config set-context --current --namespace=helix
# Postgres credentials
kubectl create secret generic postgresql-auth-secret \
--from-literal=username="helix" \
--from-literal=password="$(openssl rand -hex 16)" \
--from-literal=database="helix"
# pgvector credentials
kubectl create secret generic pgvector-auth-secret \
--from-literal=username="postgres" \
--from-literal=password="" \
--from-literal=database="postgres"
kubectl create secret generic helix-pgvector-creds \
--from-literal=dsn="postgresql://postgres:@my-helix-controlplane-pgvector:5432/postgres"
# License key
kubectl create secret generic helix-license \
--from-literal=license-key="<your-license-key>"
# Encryption key — generate once, never rotate
kubectl create secret generic helix-encryption-key \
--from-literal=encryption-key="$(openssl rand -hex 32)"
# Runner token — shared between control plane and sandbox
kubectl create secret generic helix-runner-secrets \
--from-literal=api-token="$(openssl rand -hex 32)"Step 2: Create values.yaml
global:
# Public URL — must be reachable from inside the cluster for sandbox inference.
# Do NOT use localhost here.
serverUrl: http://my-helix-controlplane.helix.svc.cluster.local
searxng:
enabled: true
chrome:
enabled: true
pgvector:
enabled: true
auth:
existingSecret: "pgvector-auth-secret"
usernameKey: "username"
passwordKey: "password"
databaseKey: "database"
persistence:
enabled: true
size: 50Gi
controlplane:
licenseKeyExistingSecret: "helix-license"
licenseKeyExistingSecretKey: "license-key"
runnerTokenExistingSecret: "helix-runner-secrets"
runnerTokenExistingSecretKey: "api-token"
encryptionKeyExistingSecret: "helix-encryption-key"
encryptionKeyExistingSecretKey: "encryption-key"
admin:
userSource: "env"
userIds: "all"
haystack:
enabled: true
existingSecret: "helix-pgvector-creds"
existingSecretDsnKey: "dsn"
embeddingsModel: "MrLight/dse-qwen2-2b-mrl-v1"
embeddingsDim: "1536"
chunkSize: "1000"
chunkOverlap: "50"
chunkUnit: "word"
rag:
defaultProvider: "haystack"
embeddingsProvider: "helix"
# Add at least one LLM provider
# providers:
# anthropic:
# apiKey: "sk-ant-..."
# openai:
# apiKey: "sk-..."
persistence:
enabled: true
size: 100Gi
postgresql:
enabled: true
auth:
existingSecret: "postgresql-auth-secret"
usernameKey: "username"
passwordKey: "password"
databaseKey: "database"
persistence:
enabled: true
size: 10GiStep 3: Add LLM provider secrets and configure them
kubectl create secret generic anthropic-api-key \
--from-literal=api-key="sk-ant-..."Add to controlplane.providers in your values.yaml:
controlplane:
providers:
anthropic:
existingSecret: "anthropic-api-key"
existingSecretApiKeyKey: "api-key"See Configure LLM providers for all supported providers.
Step 4: Install the control plane
helm repo add helix https://charts.helixml.tech
helm repo update
helm upgrade --install my-helix-controlplane helix/helix-controlplane \
-f values.yamlFirst boot pulls the embedding model (~4 GB). Budget 5–10 minutes before the main pod becomes Ready.
Step 5: Install the sandbox chart
helm upgrade --install my-helix-sandbox helix/helix-sandbox \
--namespace helix \
--set sandbox.apiUrl="http://my-helix-controlplane.helix.svc.cluster.local" \
--set sandbox.runnerTokenExistingSecret=helix-runner-secrets \
--set sandbox.runnerTokenExistingSecretKey=api-tokenPer-cloud override values are in the repository:
Step 6: Access the control plane
kubectl port-forward -n helix svc/my-helix-controlplane 8080:80Open http://localhost:8080. The first registered user becomes an admin.
For production, configure an ingress with TLS and set global.serverUrl to the public HTTPS URL.
Environment variables and tuning
See Configuration reference for the full list of controlplane.extraEnv and sandbox.extraEnv variables (video streaming tuning, encoder selection, GPU render node, etc.).
External Postgres
The control plane chart can use a managed Postgres instead of the bundled one. However, the bundled pgvector sidecar requires the vectorchord and vectorchord-bm25 extensions, which managed services (Azure Flexible Server, RDS, Cloud SQL) don't provide out of the box. Keep pgvector.enabled: true and use the bundled pod for the vector index.
Upgrading
See Upgrade & migrate for the recommended procedure.