Kubernetes
Install 3AM into a Kubernetes or OpenShift cluster, with one command or with Helm directly. Models, the console, the values you'll change, and upgrades.
Install with one command
From any machine where kubectl points at your cluster:
curl -fsSL https://get.3am.si/k8s | shIt confirms the cluster and namespace (3am unless you pass --namespace), fetches kubectl and Helm if they're
missing, then asks:
- Your licence. Start a free trial, paste a code you have, or add the licence in the console later.
- Where the models run. On a cluster without GPU nodes: your own endpoint, or OpenRouter.
- How to open the console. A port-forward from your laptop (nothing is exposed), or a load balancer.
It installs 3AM's Helm chart and waits until 3AM is answering. At the end it prints how to open the console, how to get the admin token, and how to upgrade.
No cluster yet? On a Linux machine, the same command offers to set up k3s, a single-node Kubernetes, and installs 3AM into it.
Install with Helm
If you'd rather run Helm yourself, the chart is in 3AM's Helm repository, and the images are public:
helm repo add 3am https://get.3am.si/charts
helm repo update
helm install 3am 3am/3am -n 3am --create-namespace \
--set trialCode=3AM-TRIAL-XXXXX-XXXXX-XXXXX \
--set model.enabled=false \
--set externalModel.url=https://openrouter.ai/api/v1 \
--set externalModel.model=meta-llama/llama-3.3-70b-instruct \
--set externalModel.keySecret=3am-model-keyCreate the model key's Secret first, from a file:
kubectl create namespace 3am
kubectl -n 3am create secret generic 3am-model-key --from-file=token=openrouter.keyLeave out trialCode to add a licence in the console instead. Kubernetes names can't start with a digit, so the
chart's objects are called threeam: statefulset/threeam, svc/threeam, the pod threeam-0.
Where the models run
The chart won't run the models on CPU nodes. Choose one:
--set model.enabled=false \
--set externalModel.url=https://llm.example.internal/v1 \
--set externalModel.model=meta-llama/Llama-3.3-70B-Instruct \
--set externalModel.keySecret=3am-model-key \
--set systemOne.url=https://llm.example.internal/v1/systemoneYour endpoint needs to serve System 1 too (Models).
Open the console
kubectl -n 3am port-forward svc/threeam 8700:8700Open http://localhost:8700 and sign in with the admin token, which the chart generates once and keeps across upgrades:
kubectl -n 3am get secret threeam-admin -o jsonpath='{.data.token}' | base64 -d; echoFor a permanent address with TLS, turn on the ingress (ingress.enabled, ingress.host, ingress.tlsSecret) and
set consoleUrl to that address.
Values you'll change
The chart works with its defaults. These are the values most installs set:
| Value | What it's for |
|---|---|
trialCode | A trial code. 3AM starts the trial on its first start |
licence.existingSecret | A Secret holding licence.json, instead of adding it in the console |
externalModel.url, .model, .keySecret | Your model endpoint and its key |
systemOne.url, .keySecret | System 1's endpoint, if it isn't OpenRouter |
consoleUrl | The console's address, for links in on-call messages |
ingress.enabled, .host, .tlsSecret | A permanent address with TLS |
persistence.size, .storageClass | The data volume. 20 GiB by default; use 100 GiB of SSD in production |
mail.resendKeySecret or mail.smtp.* | Mail for sign-in codes |
networkPolicy.allowFromNamespaces | Who may reach the console, for example [ingress-nginx] |
image.repository | Your registry, for clusters that can't pull from the internet |
Everything else is documented in the chart: helm show values 3am/3am.
OpenShift
helm install 3am 3am/3am -n 3am --create-namespace --set openshift.enabled=true …The pod then runs with the UID the project assigns. The licence is tied to the cluster, not to a pod or node, so pods can be rescheduled freely.
Upgrade and remove
helm repo update && helm upgrade 3am 3am/3am -n 3am --reuse-values
helm uninstall 3am -n 3am # keeps the data volume and tokensCommon questions
The cluster: the UID of its kube-system namespace. Print it with
kubectl get namespace kube-system -o jsonpath='{.metadata.uid}'.
The audit log has a single writer, so 3AM runs as a one-replica StatefulSet. A restart picks up where it left off.
Yes. The cluster gets its own, separate install, which counts as another install on your licence.
Load the images from a release bundle into your registry and set image.repository. See
Air-gapped sites.
kubectl -n 3am exec statefulset/threeam -- /opt/3am/3am-core doctorLinux
Install 3AM on a Linux server or VM with one command. What the installer asks, how to open the console, the options worth knowing, RHEL, and Compose.
Air-gapped sites
Install 3AM where servers can't reach the internet. Download a signed release elsewhere, check it, carry it in, and install it with nothing fetched.