compose.yaml, your .env settings and Docker secrets. Keep site-specific changes in a separate site.yaml so they survive upgrades.
Prepare the Swarm
1
Download the build
Get
compose.yaml and env.example from installation releases. Verify the files.2
Prepare Docker
Use Docker 23.0 or newer on every node. Initialize the Swarm if needed and join its nodes.
3
Choose the data node
Run
docker node update --label-add 2501-data=true <node> for the node that stores the supplied PostgreSQL database.4
Copy the release images
Copy every image into your registry under the same paths and digests. Set its prefix as
IMAGE_REGISTRY below.Write your .env
Copyenv.example to .env beside compose.yaml. Use Docker secrets for passwords and keys.
The first three variables are required. Identity and LLM values initialize a new installation only; change them later in Command Center. Without initial LLM settings, add a model after sign-in. See the configuration reference for other settings.
Create the secrets
Run the secret-creation commands at the top ofcompose.yaml on a manager, after replacing every placeholder. Existing secrets are skipped. Before the first deploy, remove and recreate any secret accidentally made with a placeholder.
Create llm-api-key-v1 even without LLM settings; any value is sufficient when those settings are absent because the stack still mounts the secret.
Deploy
Load the settings and sign in to your registry:site.yaml, add -c site.yaml to both stack commands. Review the merged configuration before deploying. Pruning removes services dropped by a build and retains data volumes.
The bootstrap service migrates the database and initializes missing identity and model settings. It retries while the database starts. Investigate persistent migration errors in its logs instead of treating a running web service as a completed installation.
Bootstrap retries stop at the configured limit of 10 attempts. Fix the cause shown in the logs, then remove the failed bootstrap service and redeploy the stack:
-c site.yaml again if you use it.
Adapt to your site
Keep the publishedcompose.yaml unchanged. Start site.yaml with its version: value and merge the required recipes below. Apply with both files after each change.
HTTP proxy and corporate CA
HTTP proxy and corporate CA
Create the CA configuration with Keep only the proxy or CA lines if you need one. Add your internal domains to
docker config create corporate-ca corporate-ca.pem:NO_PROXY.HTTPS to the engine
HTTPS to the engine
Issue a certificate for With a corporate CA too, list both paths in
engine. Create Docker secrets engine-tls.tls.crt and engine-tls.tls.key from its certificate and key:CA_BUNDLE_FILES, separated by a space. Renew certificates under new secret names and update the references.Your PostgreSQL
Your PostgreSQL
Create Keep
pg-connection-v1.DATABASE_URL and pg-connection-v1.DIRECT_URL as Docker secrets containing your connection strings with TLS verification. The direct URL bypasses any pooler.postgres-password-v1: services still mount it. Check the bootstrap logs after deploying.Check
Swarm’s supplied health check uses
/health; it does not wait for database readiness. Check /ready separately before opening access. After its first success, readiness remains successful even during a later database outage.
Sign in at https://<your host>. The engine stops before its replacement starts during upgrades; allow running tasks to finish first.
gMSA hosts
For Windows targets using gMSA, the engine’s manager must reach domain controllers over LDAPS and Kerberos. Include the build’skerberos-worker image when copying release images. The worker starts automatically when needed.
The worker service is separate from the stack. If the engine did not stop cleanly before docker stack rm, remove the remaining worker with docker service rm kerberos-worker.
Hosted MCP servers
Hosted plugins run as containers on the engine’s manager. Supply private-registry access in theregistry-auth secret’s Docker config.json, or pre-pull images on each manager.
After the hosted network first exists, apply isolation on every eligible manager before assigning production work:
Centrals
Local Centrals need a dedicated internal, non-attachable overlay network and a controlled dialback proxy. ConfigureCENTRAL_LOCAL_SWARM_NETWORK and CENTRAL_LOCAL_SWARM_PROXY in the engine’s site.yaml environment. Set CENTRAL_LOCAL_DIALBACK_URL to the engine’s reachable HTTPS address. The network and proxy settings must contain {org_id} for organization-specific routing.
The standard stack does not provision this environment. Use the preparation recipe below, or select a registered cluster that meets these requirements. Run the Central’s dry run before assigning work; it checks execution and cleanup, not task credentials.
Prepare local Central execution
Prepare local Central execution
Centrals require Docker Engine API 1.47 or newer and registry access at each launch. Prepare a separate network per organization. Use your actual tenant and organization IDs for Proxy service labels belong under Labels record your verification; they do not implement filtering. Swarm permits traffic between tasks on the same overlay. Provide and verify an external filter if you require task-to-task isolation.Replace the proxy and callback addresses with your reachable services. The callback certificate must be trusted. Use a separate proxy service for each organization, with its corresponding network and labels. Requalify the setup after network or proxy changes before admitting more Central work.
TENANT_ID and ORG_ID below.1
Create the dedicated network
Use the command below only after your site has qualified the proxy and network filtering. Do not attach application infrastructure or Host executors.
2
Deploy your controlled proxy
Attach your approved proxy service to the network. Give the service the labels below, using the same tenant and organization IDs.
3
Verify isolation
Permit the installation’s HTTPS callback and required tool destinations through the proxy. Verify denial of private infrastructure, metadata and unwanted incoming traffic before approving this network.
4
Configure and test
Set the engine environment below in
site.yaml, redeploy, then run the Central’s Test in Dry run and confirm cleanup.deploy.labels in its Compose definition:
