Deploy on Kubernetes
The Agenta Helm chart is community-maintained and currently in beta. If you encounter issues or have suggestions, please open a GitHub issue or reach out in our Slack community.
This guide walks you through deploying Agenta on Kubernetes using the Helm chart. By the end, you will have a fully working Agenta instance running in your cluster.
The Helm chart packages all Agenta OSS components and uses Bitnami PostgreSQL as a subchart dependency. Database migrations run automatically as a post-install/post-upgrade hook (post-hooks are required because PostgreSQL is deployed as a Bitnami subchart and is not available until the main release installs).
What Gets Deployed
The chart creates the following workloads inside your Kubernetes namespace:
- Web frontend (Next.js)
- API backend (FastAPI + Gunicorn)
- Services backend (FastAPI + Gunicorn)
- Worker (tracing) for OTLP trace ingestion
- Worker (evaluations) for async evaluation jobs
- Cron for scheduled maintenance tasks
- PostgreSQL (Bitnami subchart) with three databases
- Redis Volatile for caching and pub/sub
- Redis Durable for queues and persistent state
- SuperTokens for authentication
- Alembic migration job (post-install/post-upgrade hook)
- Ingress resource for routing traffic to web, API, and services
Prerequisites
- A running Kubernetes cluster (v1.24+)
kubectlconfigured to access your clusterhelmCLI (v3.10+) installed- An ingress controller installed in your cluster (Traefik or NGINX Ingress Controller)
Quick Start
1. Clone the Repository
git clone --depth 1 https://github.com/Agenta-AI/agenta && cd agenta
2. Generate Secrets
Generate the required secret values:
AG_AUTH_KEY=$(openssl rand -hex 32)
AG_CRYPT_KEY=$(openssl rand -hex 32)
PG_PASS=$(openssl rand -hex 16)
Save these values in a secure secret manager. You will need them for future upgrades. Avoid using export as it exposes variables to all child processes.
3. Install the Chart
helm install agenta hosting/helm/agenta-oss \
--namespace agenta --create-namespace \
--set secrets.agentaAuthKey=$AG_AUTH_KEY \
--set secrets.agentaCryptKey=$AG_CRYPT_KEY \
--set secrets.postgresPassword=$PG_PASS
The chart automatically wires secrets.postgresPassword to both the application pods and the Bitnami PostgreSQL subchart (via a shared Kubernetes Secret). You only need to set it once.
The --set approach is convenient for testing but exposes secrets in shell history and in helm get values output. For production, use a values.yaml file with restricted permissions or secrets.existingSecret to reference a pre-existing Kubernetes Secret. See Secrets for details.
4. Verify
# Watch pods start
kubectl -n agenta get pods -w
# Check the migration job completed
kubectl -n agenta get jobs
# Check ingress
kubectl -n agenta get ingress
Once all pods are running, access Agenta through your ingress IP or domain. If ingress is not configured with a host, use port-forwarding:
kubectl port-forward svc/agenta-agenta-oss-web 3000:3000 -n agenta
Then open http://localhost:3000 in your browser.
Using a Values File
For production deployments, create a values.yaml file instead of passing --set flags:
Never commit values.yaml to version control if it contains secrets. Add it to .gitignore and restrict file permissions (chmod 600 values.yaml). For fully managed secret lifecycle, use secrets.existingSecret to reference a pre-existing Kubernetes Secret or integrate with an external secrets operator.
global:
webUrl: "https://agenta.example.com"
apiUrl: "https://agenta.example.com/api"
servicesUrl: "https://agenta.example.com/services"
secrets:
agentaAuthKey: "your-auth-key"
agentaCryptKey: "your-crypt-key"
postgresPassword: "your-db-password"
postgresql:
auth:
password: "your-db-password"
ingress:
enabled: true
className: "traefik"
host: "agenta.example.com"
Install with:
helm install agenta hosting/helm/agenta-oss \
--namespace agenta --create-namespace \
-f values.yaml
Configuration Reference
Configuration is done through Helm values. The full default values are in hosting/helm/agenta-oss/values.yaml.
Global Settings
| Value | Purpose | Default |
|---|---|---|
global.webUrl | Public web URL | http://localhost |
global.apiUrl | Public API URL | http://localhost/api |
global.servicesUrl | Public services URL | http://localhost/services |
global.imagePullSecrets | Image pull secrets | [] |