Deploy Proliferate on a single AWS EC2 instance using Docker Compose.
Prerequisites
AWS account with EC2 access
Domain name (optional, for HTTPS)
API keys:
Anthropic API key
Sandbox provider credentials (Modal or E2B)
Step 1: Launch EC2 Instance
Go to AWS EC2 Console
Click Launch Instance
Configure:
Name : proliferate
AMI : Amazon Linux 2023 (or Ubuntu 22.04)
Instance type : t3.large (recommended)
Key pair : Create or select existing
Security group : Allow SSH (22), HTTP (80), HTTPS (443), and ports 3000, 8787
Storage : 50 GB gp3
Click Launch Instance
# Create key pair
aws ec2 create-key-pair --key-name proliferate-key \
--query 'KeyMaterial' --output text > proliferate-key.pem
chmod 400 proliferate-key.pem
# Create security group
aws ec2 create-security-group \
--group-name proliferate-sg \
--description "Proliferate security group"
# Add rules
aws ec2 authorize-security-group-ingress --group-name proliferate-sg \
--protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name proliferate-sg \
--protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name proliferate-sg \
--protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name proliferate-sg \
--protocol tcp --port 3000 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name proliferate-sg \
--protocol tcp --port 8787 --cidr 0.0.0.0/0
# Launch instance
aws ec2 run-instances \
--image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
--instance-type t3.large \
--key-name proliferate-key \
--security-groups proliferate-sg \
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":50,"VolumeType":"gp3"}}]' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=proliferate}]'
Step 2: Connect to Instance
# Get public IP from AWS Console or CLI
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=proliferate" \
--query 'Reservations[0].Instances[0].PublicIpAddress' \
--output text
# SSH into instance
ssh -i proliferate-key.pem ec2-user@ < PUBLIC_I P >
Step 3: Install Docker
# Update system
sudo dnf update -y
# Install Docker
sudo dnf install -y docker git
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$( uname -s )-$( uname -m )" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Log out and back in for docker group
exit
You must log out and SSH back in for the docker group membership to take effect.
# Clone repository
git clone https://github.com/proliferate-ai/proliferate.git
cd proliferate
# Copy environment template
cp .env.example .env
Edit .env with your settings:
# Deployment profile
DEPLOYMENT_PROFILE = self_host
# Core URLs
NEXT_PUBLIC_APP_URL = http:// < PUBLIC_IP > :3000
NEXT_PUBLIC_API_URL = http:// < PUBLIC_IP > :3000
NEXT_PUBLIC_GATEWAY_URL = ws:// < PUBLIC_IP > :8787
# Database
POSTGRES_PASSWORD = change-this-secure-password
# Auth secrets (generate with: openssl rand -base64 32)
BETTER_AUTH_SECRET =< generate >
SERVICE_TO_SERVICE_AUTH_TOKEN =< generate >
USER_SECRETS_ENCRYPTION_KEY =< generate-hex-64 >
# Optional feature flags
NEXT_PUBLIC_BILLING_ENABLED = false
NEXT_PUBLIC_INTEGRATIONS_ENABLED = false
NEXT_PUBLIC_ENFORCE_EMAIL_VERIFICATION = false
# LLM + sandbox (required)
ANTHROPIC_API_KEY = sk-ant-...
DEFAULT_SANDBOX_PROVIDER = modal # or "e2b"
# See Local Setup for provider-specific variables (MODAL_* or E2B_*)
Set the provider-specific variables for Modal or E2B in your .env. See the Local Setup guide for the full list.
Step 5: Launch
docker-compose -f docker-compose.prod.yml up -d
docker-compose up -d --build
Check status:
docker-compose ps
docker-compose logs -f
Step 6: Access
Open in your browser: http://<PUBLIC_IP>:3000
Enable HTTPS (Production)
For production, use Caddy as a reverse proxy with automatic HTTPS:
Point domain to instance
Create an A record: proliferate.yourdomain.com → <PUBLIC_IP>
Create Caddyfile
proliferate.yourdomain.com {
reverse_proxy web:3000
handle_path /gateway/* {
reverse_proxy gateway:8787
}
}
Create docker-compose.override.yml
services :
caddy :
image : caddy:2-alpine
ports :
- "80:80"
- "443:443"
volumes :
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
depends_on :
- web
- gateway
volumes :
caddy_data :
Update .env
NEXT_PUBLIC_APP_URL = https://proliferate.yourdomain.com
NEXT_PUBLIC_API_URL = https://proliferate.yourdomain.com
NEXT_PUBLIC_GATEWAY_URL = wss://proliferate.yourdomain.com/gateway
Restart
docker-compose down
docker-compose up -d
Instance Sizing
Use Case Instance Type vCPUs Memory Cost/month Testing t3.medium 2 4 GB ~$30 Small team t3.large 2 8 GB ~$60 Production m6i.xlarge 4 16 GB ~$140
Maintenance
Update Proliferate
cd ~/proliferate
git pull
docker-compose down
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d
Backup Database
docker-compose exec postgres pg_dump -U postgres proliferate > backup.sql
View Logs
docker-compose logs -f web
docker-compose logs -f gateway
docker-compose logs -f worker
Troubleshooting
docker-compose logs
docker-compose down && docker-compose up -d
Upgrade to a larger instance
Add swap: sudo fallocate -l 4G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
Can't connect to instance
Check security group allows your IP
Verify instance is running in AWS Console