Overview
The CrewAI Platform Helm chart provides a production-ready deployment with:- PostgreSQL database (internal StatefulSet or external)
- 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 (optional — not required with
PROVIDER: KUBERNETES_V3)
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)
Auth0
Okta
WorkOS
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. Automation Pod Scheduling
Control where crew pods (automation workloads) are scheduled within your Kubernetes cluster. These settings apply to all crew pods provisioned by the platform, including web servers, workers, and Redis instances for each automation.Requires chart version 0.1.14 or later. Earlier versions ignore these settings.
- Isolate automation workloads on dedicated nodes
- Ensure crews run on nodes with specific hardware (GPU, high CPU, SSD)
- Separate automation pods from platform infrastructure pods
- Control costs by placing crews on spot/preemptible instances
9. 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, BuildKit, Redis, Busybox images
- Environment variables:
CONTAINER_REGISTRY_HOSTNAME,AUTOMATION_ECR_REPOSITORY_PREFIX
Additional Private Registries
9. Observability and Monitoring
The chart supports Prometheus metrics collection with flexible deployment topologies for different monitoring architectures. Enable Prometheus Metrics:- Chart injects
prometheus_exportersidecar into web and worker pods - Metrics exposed on
:9394/metricsendpoint - Prometheus scrapes pods via ServiceMonitor or pod annotations
- Chart injects
prometheus_exporter+metrics-shippersidecars - OpenTelemetry Collector scrapes
localhost:9394and remote-writes to external endpoint - Supports Basic Auth and Bearer Token authentication
-
External Secrets Operator (recommended for production) — create an
ExternalSecretthat syncs from your vault (AWS Secrets Manager, GCP Secret Manager, Vault, etc.). See Metrics Configuration Reference for a full ESO example. - Sealed Secrets / SOPS / any GitOps-managed Secret — same shape; the tool materializes a plain Kubernetes Secret in the namespace and the chart references it by name and key.
-
Manual
kubectl(quick / dev only) — the token lives in shell history and is not rotated automatically:
kubectl -n crewai rollout restart deployment/crewai-web deployment/crewai-worker
so the shipper sidecar picks up the new value.
Distributed Tracing (Wharf):
For OpenTelemetry trace collection:
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
No-Build Deployment (Default): The chart defaults to
envVars.PROVIDER: KUBERNETES_V3 for maximum security and reduced resource requirements. This eliminates the BuildKit dependency entirely by running crews on shared, pre-scanned base images. See PROVIDER Configuration for details. If you need BuildKit-based builds, explicitly set PROVIDER: BUILDKIT_KUBERNETES.PROVIDER: BUILDKIT_KUBERNETES, 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 availability (when enabled)
- Executes
bin/rails db:migrate:with_datafor main database (schema + data migrations interleaved by timestamp) - Executes
bin/rails db:migrate:cablefor ActionCable database - Executes
bin/rails db:seedto populate initial data - 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:migrate:with_datafor main database (schema + data migrations interleaved by timestamp) - Executes
bin/rails db:migrate:cablefor ActionCable database - Job retries up to 3 times on failure
- Upgrade proceeds only after successful migration
Schema and data migrations are automatically applied in timestamp order via
bin/rails db:migrate:with_data during both initial installation and upgrades, ensuring data transformations are properly interleaved 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
