Overview
The CrewAI Platform Helm chart provides a production-ready deployment with:- PostgreSQL database (internal StatefulSet or external)
- MinIO object storage (optional S3-compatible storage)
- Background workers (Rails ActiveJob for async processing)
- Web application (Rails-based with flexible ingress support)
- Intelligent secret management with auto-population from Replicated license fields
- Multi-provider ingress support (AWS ALB, NGINX, Istio)
- BuildKit service for container image building
Quick Start for Production
Minimum Required Configuration
For a production deployment with external database and object storage:my-values.yaml
This is a generic template. For cloud-specific values and infrastructure setup, see the AWS Guide, GCP Guide, or Azure Guide.
Critical Production Configuration Areas
1. Database Configuration
For External PostgreSQL (Recommended):2. Object Storage Configuration
For External S3 (Recommended):GCS_IAM_SIGNING: "true" enables Workload Identity-based signing for signed URL generation, which avoids the need to supply a service account key. Requires the platform’s Kubernetes service account to be bound to a GCP service account with Storage Object Admin and Service Account Token Creator roles. See the GCP Integration Guide for IAM setup.3. Secret Management
The chart supports three secret management approaches:Option A: Direct Secret Values (Simple)
Secrets are base64-encoded automatically. Some secrets like
SECRET_KEY_BASE
are auto-generated with upgrade persistence using the lookup function if not
provided. ArgoCD users must set these values explicitly — see ArgoCD Deployment Guide.helm upgrade, pods automatically restart with a rolling update to pick up the new credentials. This ensures credential rotation is applied without manual intervention or downtime.
Option B: External Secret Store (Recommended for Enterprise)
4. Ingress and Networking
AWS Application Load Balancer
NGINX Ingress Controller
Application-Level TLS (Self-Signed)
For environments without ingress TLS, enable application-level HTTPS:5. Authentication Configuration
Local Authentication
Microsoft Entra ID (Azure AD)
Okta
WorkOS
WORKOS_API_KEY is placed under envVars: rather than secrets: due to a known chart template gap — the chart does not render secrets.WORKOS_API_KEY into the pod environment. The key is therefore stored in a ConfigMap rather than a Kubernetes Secret. Verify after install:WORKOS_COOKIE_PASSWORD must be 32 characters or fewer. Generate one with: openssl rand -base64 32 | cut -c -32It is stored as a plain environment variable (not a Kubernetes Secret) by the chart. Supply it via --set or a gitignored values file to avoid committing it.Keycloak
6. Resource Sizing
Production-grade resource defaults are included, but adjust based on your workload:The default resource requests are conservative. For production workloads,
increase requests to ensure reliable scheduling and performance.
7. High Availability Configuration
For production HA deployments:8. Image Registry Configuration
Using Replicated Proxy (Default)
Private Registry with Simplified Paths
Choosing the right registry override — key distinction:
If you only need crew build images in your private registry, set
CREW_IMAGE_REGISTRY_OVERRIDE and omit global.imageRegistry and global.imageNamePrefixOverride.global.imageNamePrefixOverride to simplify image paths:
- Registry endpoint is reachable from build and runtime pods
- Credentials grant image push and pull permissions
- The platform automatically appends
/crewai-enterprise; ensure the resulting repository path exists and accepts pushes
envVars.CREW_IMAGE_REGISTRY_OVERRIDE.
How it works:
- Without override:
images.crewai.com/proxy/crewai/dockerhub/library/postgres:16 - With override:
123456789012.dkr.ecr.us-west-2.amazonaws.com/crewai/postgres:16
imageNamePrefixOverride replaces complex multi-level paths (like proxy/crewai/dockerhub/library/) with a simple prefix. It extracts only the final image name component (e.g., postgres) and applies the override prefix to it. This is not a simple prepend operation - it completely replaces the path structure, making image management in private registries easier.
Affected components:
- Main application, PostgreSQL, MinIO, BuildKit, Redis, Busybox images
- Environment variables:
CONTAINER_REGISTRY_HOSTNAME,AUTOMATION_ECR_REPOSITORY_PREFIX
Additional Private Registries
Security Best Practices
1. Secret Management
- Never commit secrets to version control
- Use external secret stores (AWS Secrets Manager, Azure Key Vault) for production
- Rotate secrets regularly
2. Network Security
- Enable TLS for all external endpoints
- Configure ingress whitelist restrictions
- Use private subnets for database and internal services
- Enable CORS with restrictive origin policies
3. RBAC and Service Accounts
4. Database Security
- Use encrypted connections to database (SSL/TLS)
- Store database credentials in secret stores
- Enable audit logging on database
5. BuildKit Security
For enhanced security, enable rootless BuildKit mode to run container builds without privileged containers:- No privileged container required for image builds
- Runs as non-root user with user namespace remapping
- Reduces attack surface for container build operations
- Kubernetes nodes must allow
seccompProfile: UnconfinedandappArmorProfile: Unconfined - May not be compatible with restrictive security policies (e.g., GKE Autopilot)
6. Database Migration Management
The chart implements automatic database migrations via Helm hooks, ensuring schema changes and data migrations are applied safely during installation and upgrades. Migration Process: During Initial Installation (helm install):
- After deployment, a setup Job runs automatically
- Job waits for PostgreSQL and MinIO availability (when enabled)
- Executes
bin/rails db:migratefor main database - Executes
bin/rails db:migrate:cablefor ActionCable database - Executes
bin/rails db:seedto populate initial data - Executes
bin/rails data:migrateto apply data migrations - Sets up default permissions and syncs feature flags
- Job retries up to 10 times on failure
helm upgrade):
- Before each upgrade, a pre-upgrade Job runs automatically
- Job waits for PostgreSQL availability (when using internal PostgreSQL)
- Executes
bin/rails db:migratefor main database - Executes
bin/rails db:migrate:cablefor ActionCable database - Executes
bin/rails data:migrateto apply data migrations - Job retries up to 3 times on failure
- Upgrade proceeds only after successful migration
Data migrations (
bin/rails data:migrate) are automatically applied during both initial installation and upgrades, ensuring data transformations are kept in sync with schema changes.Common Deployment Scenarios
Scenario 1: AWS Production Deployment
Scenario 2: Azure Production Deployment
my-values.yaml
AZURE_CONTAINER_NAME must match the blob container name you created in Azure Blob Storage. If omitted, uploads will fail at runtime.Scenario 3: GCP Production Deployment (Cloud SQL + GCS + Artifact Registry)
my-values-gcp.yaml
