🚀 Deployment Guide
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.
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 /getting-started/wizard and enforce first control | 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.
📞 Support
- Documentation: Documentation Home
- General inquiries: info@controlcore.io
- Deployment and technical support: support@controlcore.io