ACP Engine Helm Chart
This chart deploys the ACP platform as independent Kubernetes workloads:
manager: Next.js Manager web application.engine: public/api/v1entrypoint.mcp: public MCP JSON-RPC facade plus internal MCP server management, discovery, routing, proxying, and tool execution.auth: authentication, users, realms, memberships, API keys, and themes.runtime: flows, prompts, sessions, context, agent config, and routing rules.ai: AI chat, AI usage, and AI provider management.catalog: private merchant/store Catalog API used by Engine and the merchant-authenticated MCP profile.usage: usage records, transaction counting, and usage summaries.enrichment: store-scoped enrichment providers, jobs, and usage.data: anonymous event ingestion and OpenSearch-backed exploration.safezone: global Safe Zone connections and scoped policies.- optional bundled Redis and OpenSearch data services;
- optional Prometheus, Alertmanager, and Grafana monitoring stack.
Expose Manager for the web UI, the engine for REST API traffic, and the public paths of mcp for MCP JSON-RPC traffic. Other Engine domain services stay internal ClusterIP services.
Install
helm upgrade --install acp-engine ./deployment/helm-chart \
--namespace acp-engine \
--create-namespace \
--set secrets.dbUrl='postgres://user:pass@postgres:5432/acp_engine?sslmode=disable' \
--set secrets.jwtSecret='change-me' \
--set secrets.apiKeyEncryptionKey='change-me-32-chars' \
--set secrets.grafanaAdminPassword='change-me'
Render Locally
helm template acp-engine ./deployment/helm-chart
Images
Set image repositories and tags per service:
services:
manager:
image:
repository: registry.example.com/acp-engine/engine/manager
tag: "1.0.0"
engine:
image:
repository: registry.example.com/acp-engine/engine
tag: "1.0.0"
auth:
image:
repository: registry.example.com/acp-engine/auth-service
tag: "1.0.0"
mcp:
image:
repository: registry.example.com/acp-engine/mcp-service
tag: "1.0.0"
Secrets
By default, the chart creates a Kubernetes Secret from:
secrets.dbUrlsecrets.redisUrlsecrets.jwtSecretsecrets.internalServiceSecretsecrets.mcpSharedSecretsecrets.apiKeyEncryptionKey
For production, prefer ExternalSecret or sealed secret workflows. If you provide an existing Secret, set:
secrets:
create: false
name: acp-engine-secrets
The Secret must contain:
DB_URLREDIS_URLJWT_SECRETINTERNAL_SERVICE_SECRETMCP_SHARED_SECRETCATALOG_PAYMENT_VERIFICATION_SECRETAPI_KEY_ENCRYPTION_KEYDATA_INTERNAL_TOKENDATA_ANONYMIZATION_SECRETSAFE_ZONE_INTERNAL_TOKENENRICHMENT_INTERNAL_TOKENENRICHMENT_CREDENTIAL_SECRETMCP_SECRET_REFERENCES_JSONGRAFANA_ADMIN_PASSWORDwhen bundled Grafana is enabled
Redis
The chart can deploy an internal Redis instance:
redis:
enabled: true
persistence:
enabled: true
size: 1Gi
For managed Redis, disable the bundled Redis workload and provide the external URL:
redis:
enabled: false
secrets:
redisUrl: redis://redis.example.internal:6379/0
OpenSearch
The bundled single-node OpenSearch StatefulSet is enabled by default and uses persistent storage. A post-install/post-upgrade Job creates realm-log and anonymous-data index templates, indexes, and retention policies:
opensearch:
enabled: true
persistence:
enabled: true
size: 50Gi
init:
logRetentionDays: 30
dataRetentionDays: 90
The bundled profile disables the OpenSearch security plugin and is intended for a namespace-internal development or controlled single-node installation. Production HA deployments should use a secured managed or dedicated cluster:
opensearch:
enabled: false
externalUrl: https://opensearch.example.internal
Use NetworkPolicy, TLS, authentication, backup, restore, and multi-node settings appropriate to the target environment. An external OpenSearch URL is required when the bundled component is disabled.
Monitoring
Prometheus, Alertmanager, and Grafana are enabled by default. Prometheus discovers enabled ACP services, loads the ACP alert rules, and sends alerts to Alertmanager. Grafana is provisioned with Prometheus and OpenSearch datasources plus the ACP service overview dashboard.
monitoring:
prometheus:
enabled: true
persistence:
size: 20Gi
alertmanager:
enabled: true
config:
route:
receiver: platform-alerts
receivers:
- name: platform-alerts
webhook_configs:
- url: https://alerts.example.internal/acp
grafana:
enabled: true
publicUrl: https://grafana.example.com
publicUrls:
prometheus: https://prometheus.example.com
alertmanager: https://alertmanager.example.com
All monitoring services are ClusterIP. Expose them only through an approved Ingress or port-forward policy. Public URL values configure Manager links; they do not create public exposure. When using an external platform, disable the corresponding bundled component and configure its externalUrl for Manager's server-side access.
Database and Migrations
PostgreSQL is intentionally external to this chart. Set secrets.dbUrl to a reachable database and apply repository migrations through the approved deployment pipeline before rolling out application pods. The chart does not silently initialize or mutate a production database.
Engine Ingress
Ingress is disabled by default. Enable it for the engine only:
ingress:
enabled: true
className: nginx
hosts:
- host: engine.example.com
paths:
- path: /
pathType: Prefix
Manager Ingress
Manager has a separate ingress so the UI and API hostnames can be managed independently:
managerIngress:
enabled: true
className: nginx
hosts:
- host: manager.example.com
paths:
- path: /
pathType: Prefix
By default, Manager receives NEXT_PUBLIC_ENGINE_URL pointing to the in-cluster engine service. Override it when the browser must call a public API hostname:
services:
manager:
engineUrl: https://engine.example.com
MCP Ingress
The unified MCP service has its own ingress so MCP clients can use a dedicated endpoint:
mcpIngress:
enabled: true
className: nginx
hosts:
- host: mcp.example.com
paths:
- path: /
pathType: Prefix
By default, mcp receives ENGINE_BASE_URL pointing to the in-cluster engine service. Override it only when the public MCP facade must call another engine hostname:
services:
mcp:
engineUrl: https://engine.example.com
Built-in Catalog MCP tools authenticate with a merchant API key created in Merchant Dashboard > Developers. Send it as Authorization: Bearer or x-api-key; its merchant, store, or custom scope controls the available stores.
Realm-bound Engine MCP tools authenticate with a realm service identity created through the engine:
POST /api/v1/realms/:id/identities/services
Then pass the returned service credentials to the MCP endpoint:
X-ACP-Realm-IDX-ACP-Access-KeyX-ACP-Secret-Key
The MCP service rejects realm service credentials whose token realm does not match a realm-bound Engine request and rejects merchant keys for stores outside their allowed scope.
Scaling
Each service has independent replica, resource, HPA, and PDB settings:
services:
ai:
replicaCount: 3
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 70
Internal Routing
The engine receives internal service URLs automatically through Kubernetes service DNS:
AUTH_SERVICE_URLRUNTIME_SERVICE_URLAI_SERVICE_URLMCP_SERVICE_URLUSAGE_SERVICE_URLCATALOG_SERVICE_URLDATA_SERVICE_URLSAFE_ZONE_SERVICE_URL
Frontend, mobile, SDK, ADK, and Manager clients should call only the engine.
MCP clients should call the public endpoint of mcp-service, which then calls the engine.
Catalog, Enrichment, Data, and Safe Zone
The chart defines private Catalog, Enrichment, Data, and Safe Zone workloads and wires their service URLs into Engine or Manager as appropriate. Keep these services private by default. If an approved merchant integration requires a dedicated Catalog ingress, add TLS, network controls, rate limits, and Auth-backed merchant/store scope validation explicitly. Data and Safe Zone routes must remain behind Engine or their signed internal-service boundaries.