Skip to main content
Install 2501 from a verified release chart and your own values.yaml. Use oc in place of kubectl on OpenShift.

Install

Use one namespace per installation. For an existing installation, follow Upgrade or Move from the CLI.
1

Download the build

Get 2501-<build>.tgz and values.example.yaml from installation releases. Verify the files.
2

Prepare image access

Configure access to 2501’s registry, or copy the build’s images into your registry.
3

Prepare the namespace

Set NS=ai-2501 in your shell, then run kubectl create namespace "$NS".
4

Configure the installation

Write your values and create the required secrets below.
5

Apply and verify

Choose the kubectl, Helm or ArgoCD path below, then complete Check.

Write your values.yaml

Copy values.example.yaml to values.yaml. This minimal example uses Kubernetes, a supplied PostgreSQL database and a certificate secret:
Without LLM settings, add the model in Command Center after installation. Identity and LLM settings initialize the first installation; change them in Command Center afterwards. See the configuration reference for all values.

Create the secrets

Print the commands for your chosen values without installing anything:
Replace the placeholders and run the printed secret commands once. Include the certificate for commandCenter.host when using tls.mode: secret. Your secret manager can create the same names and keys instead. Pods wait for missing secrets.
Keep secret values out of Git. Preserve the installation’s encryption keys and database credentials across upgrades; replacing them can make existing data inaccessible.

Apply

Render, review and apply the complete file. The same pruning flags make removed resources visible in the diff:
Review deletions before applying. This allowlist excludes volume claims and secrets. Repeat the render, review and apply after changing values.

With Helm or ArgoCD

The chart is also available at oci://ghcr.io/2501-ai/charts/2501. Verify the chart before installing it.
Select an exact build, such as 0.19.0-r1. Helm and ArgoCD skip pre-release builds in ordinary version ranges such as 0.19.x. They also skip them when no version is specified.
Use the same namespace, values and pre-created secrets:
To install the verified build from the registry instead:

Your site’s values

Apply changes through values.yaml so they survive upgrades. Expand the relevant recipe; the configuration reference lists the remaining options.
The installation’s own services bypass the proxy. Executors inherit these settings.
Create a ConfigMap with your PEM certificate, then set caBundle: corporate-ca:
Issue a certificate covering ai-2501-engine, ai-2501-engine.<namespace>.svc and ai-2501-engine.<namespace>.svc.cluster.local. Adapt the prefix if you change stackName.
Command Center trusts this certificate. Restart both services after renewal.
Create pg-connection-v1 with DATABASE_URL and DIRECT_URL; the latter bypasses any connection pooler. Use your database’s connection strings with TLS verification.
Supply database-ca as a ConfigMap with ca.crt when your database needs a corporate CA. Otherwise omit caBundle.
Create es-credentials with ELASTICSEARCH_USERNAME and ELASTICSEARCH_PASSWORD:
Trust a corporate certificate with caBundle. For an existing installation, also enable Elasticsearch in Command Center as described in Operations.
Set storageClass, database.size and elasticsearch.size before creating volumes. Bound claims cannot change storage class or shrink. Choose sizing.preset for the installation’s capacity; reserve additional namespace capacity for task and plugin containers.

Executors in another namespace

Create the namespace and its image pull secrets, then set executors.namespace. The chart places executor permissions and the hosted MCP policy there. With this setting, rendered objects name their namespaces: omit -n "$NS" from the file’s diff and apply commands.

Additional installation settings

Put non-secret settings in engine.extraEnv. For secret values, create an engine-extra-env Secret and restart the engine after changing it. For example, MCP_OAUTH_ALLOW_PRIVATE_PROVIDERS: "true" allows OAuth identity providers on private addresses, still over HTTPS.

Check

The bootstrap log should show successful database migration and initialization. Investigate repeated failures before signing in at https://<your host>. The bootstrap Job has backoffLimit: 10. After it reaches that limit, fix the cause shown in the logs and delete the failed Job:
Then repeat your deployment method: render and apply the manifests, run Helm upgrade, or sync ArgoCD. Check the new bootstrap Job’s logs before signing in. Command Center keeps previous pods serving during the rollout until new pods become ready. Readiness stays successful after the first successful check; it is not an ongoing database health test. The engine is replaced during upgrades, so allow running work to finish first.
Windows targets using gMSA require Docker Swarm. They are not supported by this Kubernetes deployment.

Hosted MCP servers

Hosted plugins run as non-root pods without a service account token. The chart supplies namespace-scoped permissions and a policy allowing DNS and public destinations, while blocking private and link-local destinations. Your network plugin must enforce NetworkPolicy. Add an explicit policy exception for required internal services or NodeLocal DNSCache. Review the network plugin’s startup enforcement before using untrusted images. Ensure image pull secrets and namespace quotas cover these pods.

Centrals

For local Central execution, prepare a dedicated namespace with restricted pod security, image access, scoped pod/attach permissions and network policies. Set engine.extraEnv.CENTRAL_LOCAL_K8S_NAMESPACE to that namespace. The chart does not prepare this separate Central environment for you. Leave Cluster (optional) at No cluster (default) to use this local environment, or select a registered cluster. Run the Central’s dry run before assigning work; a successful check does not validate task credentials.
This example uses ai-2501 for the installation and central for task containers. Replace ai-2501 in the binding if your installation uses another namespace. Save the following as central.yaml:
1

Apply isolation and permissions

Run kubectl apply -f central.yaml. Confirm your network plugin enforces the policy; other policies must not grant broader access to these pods.
2

Prepare registry access

Create the configured executor image pull secret in central too. It must allow both the release image and your Central images.
3

Select the namespace

Add the values below and reapply the chart. Keep the Central manifest’s namespace unset to use this default.
4

Verify execution

Run the Central’s Test in Dry run and confirm command success and container removal.
The service account also needs permission to read its own pod in the installation namespace. Check this especially if executors use a separate namespace. Allow only the internal destinations your Central tools require; the example permits cluster DNS and public destinations.