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 | sh

It confirms the cluster and namespace (3am unless you pass --namespace), fetches kubectl and Helm if they're missing, then asks:

  1. Your licence. Start a free trial, paste a code you have, or add the licence in the console later.
  2. Where the models run. On a cluster without GPU nodes: your own endpoint, or OpenRouter.
  3. 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-key

Create 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.key

Leave 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/systemone

Your endpoint needs to serve System 1 too (Models).

Open the console

kubectl -n 3am port-forward svc/threeam 8700:8700

Open 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; echo

For 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:

ValueWhat it's for
trialCodeA trial code. 3AM starts the trial on its first start
licence.existingSecretA Secret holding licence.json, instead of adding it in the console
externalModel.url, .model, .keySecretYour model endpoint and its key
systemOne.url, .keySecretSystem 1's endpoint, if it isn't OpenRouter
consoleUrlThe console's address, for links in on-call messages
ingress.enabled, .host, .tlsSecretA permanent address with TLS
persistence.size, .storageClassThe data volume. 20 GiB by default; use 100 GiB of SSD in production
mail.resendKeySecret or mail.smtp.*Mail for sign-in codes
networkPolicy.allowFromNamespacesWho may reach the console, for example [ingress-nginx]
image.repositoryYour 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 tokens

Common questions

On this page