2501 CLI, how the Kubernetes backend selects itself, and the RBAC the engine needs.
Docker Swarm remains the default deployment target, with a fully managed
deploy lifecycle. The Kubernetes target is generate-only: the CLI renders a complete manifest tree and you apply it with kubectl (or your distribution’s equivalent CLI). This keeps you in control of how changes reach the cluster, including through GitOps tooling.Generating the manifests
Run the deploy command with the Kubernetes target:<configDir>/kubernetes/:
--image-tag (alias --tag) is required with --yes. --stack-name and --namespace both default to ai-2501, and both are validated as DNS-1123 labels.
Flags
2501 infra deploy -h
--remove, --stop, --restart, --history, --cleanup-resources, and --disable-services drive the Swarm lifecycle; on the Kubernetes target the relevant options are --target, --stack-name, --namespace, --image-tag, -d, --dir, and -y, --yes.
Filling in secrets
Secret manifests usestringData, so every value is plain text and the cluster encodes it server-side on apply. Before applying, fill in any blank values directly in the YAML:
AWS_*andELASTICSEARCH_*insecret/engine.ymlandsecret/command-center.ymlBASE_URLinconfigmap/command-center.yml(your real ingress hostname)- The license public key in
secret/license-public-key.yml, unless a PEM file already exists at<configDir>/license.public.pem
Applying
kubectl — oc, k3s kubectl, etc.)
Self-hosted Elasticsearch (optional)
The Elasticsearch prompt during generation (URL, username, password) points the stack at an external Elasticsearch cluster you already run. If you don’t have one, the CLI can deploy its own single-node Elasticsearch in-cluster instead — useful for on-premises installs that want structured logs (for the Debug page and remote troubleshooting) without standing up a separate cluster. Enable it in2501-infra.yml before generating manifests:
enabled: true, generation renders its own deployment/elasticsearch.yml, service/elasticsearch.yml, and secret/elasticsearch.yml, and wires ELASTICSEARCH_URL to the in-cluster service automatically. The generated instance serves HTTPS with a self-signed certificate, so leave the Elasticsearch prompt’s URL empty when this is set — the two are mutually exclusive ways of getting the same env vars filled in.
PostgreSQL TLS
The Postgres pod this target generates now serves TLS 1.3 by default, using a self-signed certificate built at pod start. The engine’s connection string defaults itssslmode to require to match; override it with postgres.sslmode in 2501-infra.yml (disable, allow, prefer, require, verify-ca, or verify-full) if your setup needs something different.
Executor backend selection
The engine picks an executor backend automatically:- When it detects that it is running inside a Kubernetes cluster, it uses the Kubernetes pod backend.
- Otherwise it falls back to Docker / Swarm.
EXECUTOR_MCP_BACKEND environment variable, set to kube or docker.
The engine talks to the in-cluster Kubernetes API directly using the pod’s auto-mounted service-account token. It does not shell out to
kubectl, and you do not supply a kubeconfig.Required access (RBAC)
The generatedrbac/executor.yml provisions a dedicated engine-executor ServiceAccount with a namespace-scoped Role and RoleBinding granting:
Executor pods spawn in the same namespace as the engine. To use a separate sandbox namespace, change the RoleBinding’s namespace and override
EXECUTOR_MCP_K8S_NAMESPACE on the engine pod, which is otherwise set to the engine’s own namespace via the Downward API.
For the full set of engine and Command Center environment variables (database, security keys, LLM providers, optional integrations), see Configuration.

