Manual install · manifests & Helm
When you want raw manifests under GitOps instead of the installer: the platform deploy.yaml, the agentkube Helm chart, and the CRD bundle — and the two edits the stock files need.
exo-install is the fastest path, but if you run everything through Argo CD, Flux, or a reviewed kustomize tree, you'll want the raw manifests. They're the same ones the installer embeds, derived from the operator config and the repo-root deploy.yaml.
When to go manual
- You manage cluster state declaratively and don't want a binary mutating it.
- You need to diff and review every change to RBAC or the platform Secret.
- You install the operator via Helm as part of a larger release.
Manifest layout
The installer's pinned copies live under exo-install/manifests/:
1crds/ agents.yaml tools.yaml mcps.yaml2 llmgateways.yaml claws.yaml3operator/ 00-namespace.yaml (agentkube-system)4 01-serviceaccount.yaml5 02-clusterrole.yaml 03-clusterrolebinding.yaml6 04-manager.yaml (Deployment + Service)7 05-admission.yaml (pods/exec + tool webhook)8platform/ 00-namespace.yaml 01-secret.yaml9 02-configmap.yaml 03-postgres.yaml (optional)10 04-app.yaml (Deployment + Service)Apply them in order: crds/ → operator/ → platform/. The operator and platform sources are templated (namespace, image, managed mode, secrets, service type), so prefer exo-install render to materialise a concrete copy:
1exo-install render crds | kubectl apply -f -2exo-install render operator | kubectl apply -f -3exo-install render platform | kubectl apply -f -Platform · deploy.yaml
The repo root ships a standalone deploy.yaml for the control plane (Namespace, Secret exo-secrets, ConfigMap exo-config, Service + Deployment exo-app on port 9092, 2 replicas with a rolling update). Two edits are required before it's production-usable:
1stringData:2 EXO_JWT_SECRET: "<openssl rand -base64 48>"3 EXO_ENCRYPTION_KEY: "<openssl rand -hex 16>" # exactly 32 bytes4 EXO_DATABASE_DSN: "host=db user=exo dbname=exo sslmode=require"5 EXO_CLAUDE_API_KEY: "" # optional, base64-encoded1kubectl apply -f deploy.yaml2kubectl -n exo rollout status deploy/exo-appOperator · Helm chart
The operator ships a Helm chart at agentkube/helm/agentkube. CRDs sit in the chart's native crds/ directory (installed on helm install, never touched on upgrade/uninstall).
1helm install agentkube ./agentkube/helm/agentkube \2 --namespace agentkube-system --create-namespace \3 --set manager.managed=true \4 --set manager.baseURL=https://exo.example.com1namespace:2 name: agentkube-system3 create: true4image:5 manager:6 repository: docker.io/adaptivelive/agentkube-manager7 tag: "" # empty → chart appVersion8 pullPolicy: IfNotPresent9 pullSecrets: [] # for private registries10manager:11 replicas: 112 args: [--leader-elect]13 managed: false # phone home to baseURL when true14 baseURL: https://exo.adaptive.live15 authTokenSecret: # read when managed=true16 name: agentkube-auth17 key: token18webhook:19 enabled: true # pods/exec admission webhook20 failurePolicy: Fail21crds:22 install: trueCRDs
If you manage CRDs out-of-band, the generated definitions live at agentkube/config/crd-generated/*.yaml (the verbatim source for the installer's crds/ bundle). Apply them directly and set crds.install=false in Helm or skip exo-install crds. See CRD overview.