Deploy & Operate
New to Control Core? Start with Quick deploy — it takes you from zero to a working enforcement setup in 60 minutes using Docker Compose. This section covers everything beyond that first deployment: production configurations, Kubernetes and Helm, scaling, and multi-Bouncer topologies.
Control Core is customer-infrastructure only: the Control Plane and Bouncers run in your environment; policies, logs, and configuration stay under your operational and data-residency boundaries. Commercially, Kickstart is the 90-day trial path and Custom is the annual perpetual production path; packaging aligns to deployed Bouncers, while governance workflows for policy, security, compliance, and CIAM teams are not positioned as seat- or per-decision-metered. See Licensing and deployment options.
Control Core deploys as two customer-managed services:
- Control Plane
- Bouncer (deploy Sandbox first, then Production)
Distribution is managed directly by Control Core.
Contact info@controlcore.io to request deployment artifacts.
Deployment topologies
1. Sidecar deployment
Use a Bouncer sidecar when you want workload-local interception with the smallest blast radius and the clearest ownership boundary.
- Best for Kubernetes services, internal APIs, and per-workload MCP or AI routes
- Keeps enforcement close to the protected resource
- Ideal when sandbox and production workloads are deployed separately
- Minimal touch when the OEM partner already deploys per-service workloads
Troubleshooting: If the sidecar is running but decisions are not enforcing, check the Bouncer registration and sync status in Settings -> PEPs and verify the workload is sending traffic through the sidecar listener. Common causes: wrong
TARGET_HOST, missing API key, or policy sync not yet healthy. Full reference: /troubleshooting
2. Reverse proxy / AI Pilot deployment
Use a centralized Bouncer when multiple LLM, MCP, API, or agent routes should be governed from a shared ingress or gateway tier.
- Best for shared AI gateway patterns and centralized traffic management
- Lets platform teams apply controls without modifying each protected service
- Useful for prompt controls, MCP authorization, and cross-service audit visibility
Troubleshooting: If gateway traffic reaches the backend without policy effects, check the upstream host mapping and verify the gateway Bouncer is attached to the correct resource and environment. Common causes: host-header mismatch, route bypass, or a resource linked to the wrong environment. Full reference: /troubleshooting
3. Deep API embedding (OEM)
Use the headless OEM API when an external platform needs to generate, validate, test, and deploy controls entirely through API calls.
- Best for OEM platforms and agent-first parent systems
- Downstream tenants do not need access to the interactive Control Plane UI
- Works with
workspace_id,source_metadata, andexpires_atmetadata for time-bounded access flows
OEM API-first lifecycle (recommended):
- Bootstrap Control Core API access (
/devdocs, token, environment API keys) - Register or verify bouncer/resource bindings
- Run
generate -> validate -> test -> deployfor each control intent - Verify readiness + decisions + audit evidence through APIs
- Disable/archive/reactivate controls by lifecycle status as parent workflows change
Click to enlarge
Troubleshooting: If OEM-generated controls appear in the Control Plane but do not enforce, check the deployment environment, the target resource/bouncer binding, and whether
expires_athas already elapsed. Common causes: deploying to the wrong environment, stale resource binding, or intentionally expired access windows. Full reference: /troubleshooting
For hardened multi-infra production standards, see:
60-minute runbook
| Phase | Action | Time |
|---|---|---|
| Prepare | DNS, TLS, database, Redis, secrets, GitHub controls repo | 10 min |
| Deploy | Control Plane via Helm or Docker Compose | 15 min |
| Connect | Deploy Sandbox Bouncer and register resource | 10 min |
| Configure | Connect controls repo and verify environment config | 10 min |
| Validate | Run API-first verification (/health/ready, policy deploy, audit export) or /getting-started/wizard | 15 min |
Required inputs
CONTROL_PLANE_PUBLIC_URL(for examplehttps://controlplane.customer-domain.com)- TLS cert/key or ingress-managed TLS for the Control Plane domain
DATABASE_URLandREDIS_URL- GitHub controls repo URL, branch, and token
- Bouncer API keys for Sandbox and Production
Network and domain requirements
Use customer-owned DNS and TLS.
| Flow | Source | Destination | Protocol |
|---|---|---|---|
| Control Plane UI/API | Operators | Control Plane domain | HTTPS 443 |
| Bouncer policy updates | Bouncer | Control Plane API | HTTPS 443 |
| Policy repo sync | Control Plane | GitHub | HTTPS 443 |
| Data store access | Control Plane | PostgreSQL/Redis | Internal network only |
Recommended:
- No public database or Redis endpoints.
- Restrict ingress to required domains and paths.
- Allow outbound from Control Plane only to approved endpoints (GitHub, optional telemetry endpoint).
Helm deployment (recommended)
- Extract deployment package.
- Update values file with your environment.
- Deploy chart.
helm upgrade --install controlcore ./controlcore \
--namespace controlcore \
--create-namespace \
-f values.customer.yaml
Minimum values.customer.yaml pattern:
global:
controlPlanePublicUrl: "https://controlplane.customer-domain.com"
telemetryEndpoint: "https://business-admin.controlcore.io"
controlPlane:
env:
DATABASE_URL: "postgresql://<user>:<password>@<db-host>:5432/<db-name>"
REDIS_URL: "redis://:<password>@<redis-host>:6379/0"
SECRET_KEY: "<strong-random-secret>"
JWT_SECRET_KEY: "<strong-random-jwt-secret>"
GITHUB_REPO_URL: "https://github.com/<org>/<controls-repo>"
GITHUB_BRANCH: "main"
GITHUB_TOKEN: "<github-token>"
bouncer:
enabled: true
env:
BOUNCER_ID: "bouncer-sandbox-01"
BOUNCER_NAME: "Sandbox API Bouncer"
BOUNCER_TYPE: "sidecar"
ENVIRONMENT: "sandbox"
PAP_API_URL: "https://controlplane.customer-domain.com"
API_KEY: "<sandbox-api-key>"
RESOURCE_NAME: "Customer API"
RESOURCE_TYPE: "api"
TARGET_HOST: "customer-api.default.svc.cluster.local:8080"
ORIGINAL_HOST_URL: "https://api.customer-domain.com"
SECURITY_POSTURE: "deny-all"
Docker Compose deployment
- Extract deployment package.
- Create
.env.customer. - Start stack with your env file.
docker compose --env-file .env.customer -f controlcore-compose.yml up -d
Minimum .env.customer pattern:
CONTROL_PLANE_PUBLIC_URL=https://controlplane.customer-domain.com
DATABASE_URL=postgresql://<user>:<password>@<db-host>:5432/<db-name>
REDIS_URL=redis://:<password>@<redis-host>:6379/0
SECRET_KEY=<strong-random-secret>
JWT_SECRET_KEY=<strong-random-jwt-secret>
GITHUB_REPO_URL=https://github.com/<org>/<controls-repo>
GITHUB_BRANCH=main
GITHUB_TOKEN=<github-token>
BOUNCER_ID=bouncer-sandbox-01
BOUNCER_NAME=Sandbox API Bouncer
BOUNCER_TYPE=sidecar
ENVIRONMENT=sandbox
PAP_API_URL=https://controlplane.customer-domain.com
API_KEY=<sandbox-api-key>
RESOURCE_NAME=Customer API
RESOURCE_TYPE=api
TARGET_HOST=customer-api:8080
ORIGINAL_HOST_URL=https://api.customer-domain.com
SECURITY_POSTURE=deny-all
Bouncer resource auto-discovery parameters
These fields must be present for clean registration and linking:
BOUNCER_IDunique per deployment unitBOUNCER_NAMEhuman-readable labelBOUNCER_TYPE(sidecar,reverse-proxy, or planned future type)ENVIRONMENT(sandboxorproduction)PAP_API_URLControl Plane API URLAPI_KEYenvironment-specific Bouncer keyRESOURCE_NAMEstable logical resource nameRESOURCE_TYPE(api,webapp,database,ai-agent,mcp-server)TARGET_HOSTinternal service endpoint protected by BouncerORIGINAL_HOST_URLexternally advertised endpointSECURITY_POSTURErecommendeddeny-all
Use the same RESOURCE_NAME for Sandbox and Production counterparts when they represent the same business resource.
GitHub controls repository configuration
Control Plane requires:
GITHUB_REPO_URLGITHUB_BRANCHGITHUB_TOKENwith least-privilege read/write scope for controls management
Operational checks:
- Validate repo access from Control Plane runtime.
- Validate branch exists and is protected per your policy.
- Confirm controls sync status is healthy in the UI.
Security protocol baseline
- TLS 1.2+ for all external traffic.
- Customer-managed certificates and key rotation policy.
- Secrets from enterprise secret manager, not static files in repos.
- Environment-scoped API keys and scheduled rotation.
- Least-privilege IAM/RBAC for deployment and runtime identities.
- Backup and recovery policy for database and controls repository.
Verification checklist
- Control Plane URL resolves and serves valid TLS cert.
- Health endpoint is successful from your network zone.
- Database and Redis connectivity checks pass.
- Sandbox Bouncer appears in Settings -> PEPs.
- Resource appears in Settings -> Resources with expected metadata.
- A Sandbox control is enforced and audit events are visible.
/getting-started/wizardcompletes without failed checks.GET /health/readyreturnsreadyandGET /audit/exportreturns CSV evidence.
Support
- Documentation: Documentation Home
- General inquiries: info@controlcore.io
- Deployment and technical support: support@controlcore.io