Skip to main content

Overview

This guide walks through a complete, production-ready deployment of CrewAI Enterprise on Amazon EKS with the following stack:
  • Database: Amazon Aurora for PostgreSQL 16 (external RDS)
  • Storage: Amazon S3
  • Container registry: Amazon ECR
  • Load balancer: AWS Application Load Balancer (ALB) via AWS Load Balancer Controller
  • IAM: EKS Pod Identity (no static credentials)
  • Authentication: WorkOS (AuthKit)
  • Trace collection: Wharf (OTLP)
  • Studio V2: Post-install activation
The values.yaml in this guide is self-contained and deployable. No cross-references to other guides are required to complete this installation.

Prerequisites Checklist

Complete every item before running helm install. Missing any one will cause a failed or broken deployment.

EKS Cluster

  • EKS cluster running Kubernetes 1.32.0+, AMD64 worker nodes
  • AWS Load Balancer Controller installed in the cluster
  • Public subnets tagged kubernetes.io/role/elb=1 (for internet-facing ALB)
  • kubectl context pointed at the target cluster
  • Helm 3.10+ installed

Amazon RDS

  • Aurora PostgreSQL 16 cluster provisioned (see sizing table)
  • PostgreSQL user crewai created with login privileges
  • All four databases pre-created and grants applied (see Database Setup)
  • RDS security group allows TCP 5432 inbound from EKS worker node security group

Amazon S3

  • S3 bucket created for crew artifact storage
  • Bucket versioning enabled (recommended)

Amazon ECR

  • ECR repository created with path ending in /crewai-enterprise (e.g., <account>.dkr.ecr.<region>.amazonaws.com/<org>/crewai-enterprise)
  • Image tag mutability set to MUTABLE on the repository

IAM — Pod Identity

  • EKS Pod Identity Agent DaemonSet running (kubectl get ds -n kube-system eks-pod-identity-agent)
  • IAM role CrewAIPodIdentityRole created with the combined S3 + ECR policy (see IAM Setup)
  • Pod Identity association created for namespace crewai, service account crewai-sa

ACM Certificate

  • ACM certificate issued and validated for <YOUR_DOMAIN> in the deployment region

WorkOS

  • WorkOS Application created; note the Client ID and AuthKit domain
  • WorkOS API key generated (format: sk_live_...)
  • Redirect URI added to the WorkOS application: https://<YOUR_DOMAIN>/auth/workos/callback
  • WORKOS_COOKIE_PASSWORD generated (must be ≤ 32 characters — see WorkOS Setup)

Helm Registry Access

  • Authenticated to the CrewAI Helm registry: helm registry login registry.crewai.com

Infrastructure Setup

Aurora Instance Sizing

Use gp3 storage with a minimum of 3000 IOPS for production. Memory-optimized instances (R6g family) are strongly preferred for CrewAI’s Rails workload.

Database Setup

Connect to your RDS instance as a superuser and run the following before helm install. The Helm chart does not create databases when postgres.enabled: false.
The OAuth database name must be crewai_plus_oauth_production. The chart default for POSTGRES_OAUTH_DB is oauth_db. If you do not override it in envVars, the application will attempt to connect to a database named oauth_db which does not exist, causing authentication failures.The Wharf database name must be wharf. This matches postgres.wharfDatabase chart default and requires no override.

S3 Bucket

ECR Repository

Do NOT include /crewai-enterprise in CREW_IMAGE_REGISTRY_OVERRIDE. The platform appends this suffix automatically. Set CREW_IMAGE_REGISTRY_OVERRIDE to the prefix only — for example <account>.dkr.ecr.<region>.amazonaws.com/<org>. Including the suffix results in push failures to a double-suffixed path.

IAM — Pod Identity Setup

Create a single IAM role that covers both S3 and ECR access. Pod Identity attaches this role to the crewai-sa service account without OIDC configuration. 1. Create the combined S3 + ECR policy Save the following to crewai-policy.json, substituting your bucket name, region, and account ID:
2. Create the IAM role and attach the policy
3. Create the Pod Identity association
rbac.create: true in the Helm values (shown below) causes the chart to automatically create a ServiceAccount named crewai-sa in the deployment namespace. The Pod Identity association must reference this exact name.

ACM Certificate


WorkOS Setup

1. Create a WorkOS Application In the WorkOS Dashboard:
  • Create a new Application
  • Note the Client ID (format: client_<...>)
  • Note the AuthKit domain (format: https://<subdomain>.authkit.app)
  • Navigate to Redirects and add: https://<YOUR_DOMAIN>/auth/workos/callback
  • Generate an API key (format: sk_live_...)
2. Generate WORKOS_COOKIE_PASSWORD The cookie password must be 32 characters or fewer. Longer values are silently truncated by the runtime, which can produce intermittent auth failures.
Store both WORKOS_API_KEY and the generated cookie password. You will place them under envVars: in the values file.
Chart bug — WORKOS_API_KEY and WORKOS_COOKIE_PASSWORD must be placed under envVars:, not secrets:.If placed under secrets:, these values are silently absent from pods — authentication fails with no clear error message, and the pods start normally with no indication of misconfiguration. This is a known chart limitation. Both values must appear under envVars: as shown in the complete values.yaml below.

Complete values.yaml

Replace every <PLACEHOLDER> with your environment-specific values before running helm install.
values.yaml

Install

Run the following command from the directory containing your values.yaml:
Wait for all pods to reach Running state before proceeding to post-install:

Post-Install

Required Initialization

These commands must be run before any user can log in. Run them in the order shown.
Organization IDs are sequential integers. The internal CrewAI organization always receives ID 1. The first customer-facing organization created in the UI receives ID 2. To list all organizations: kubectl exec -it deploy/crewai-web -n crewai -- bin/rails runner "puts Organization.all.map { |o| \"#{o.id}: #{o.name}\" }.join(\"\\n\")"
WorkOS users must log in before factory:add_owner and factory:grant_admin can reference their user record. With SSO providers, the user record is created on first login. Run studio:install_internal_organization and factory:setup_permissions_defaults first, then have the admin user log in via WorkOS, then run factory:add_owner and factory:grant_admin.

Studio V2 Activation

Studio V2 cannot be configured in values.yaml. Adding studioV2.enabled: true or STUDIO_V2_ENABLED to your values file has no effect — Helm silently ignores unknown keys. Setup is always performed post-install through the following UI and kubectl steps.
Studio V2 requires three ordered steps: two in the web UI and three kubectl commands. All UI steps must be completed before running the kubectl commands. Step 1 — Create the LLM Connection (UI)
  1. Log in as an admin user
  2. Navigate to SettingsLLM Connections
  3. Click New Connection
  4. Name the connection exactly studio-v2 (case-sensitive, with hyphen)
  5. Configure the LLM provider and model for the Studio agent
  6. Save the connection
Step 2 — Set as Default Connection (UI)
  1. Navigate to SettingsCrew Studio
  2. Set studio-v2 as the Default Connection
  3. Save
Step 3 — Run activation commands (kubectl) Run these three commands in order. studio:agent:install will fail if the studio-v2 LLM Connection does not exist yet.

Verify

Pods and Services

ALB Provisioning

Common causes of ALB not provisioning:
  • scheme value is not lowercase — "internet-facing" and "internal" only; "Internet-Facing" silently fails
  • Public subnets are missing the kubernetes.io/role/elb=1 tag
  • AWS Load Balancer Controller is not installed or lacks IAM permissions

Database Connectivity

WorkOS Authentication

  1. Navigate to https://<YOUR_DOMAIN> in a browser
  2. You should be redirected to the WorkOS AuthKit login page
  3. After login, you should land on the CrewAI dashboard
If authentication fails with no clear error, verify that WORKOS_API_KEY and WORKOS_COOKIE_PASSWORD are under envVars: and not secrets: in your values file.

Pod Identity (S3 + ECR)

Platform Health Check

All components should report "status": "ok". For detailed diagnostics, see the Factory Health guide.