Skip to main content
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

  1. Go to AWS EC2 Console
  2. Click Launch Instance
  3. 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
  4. Click Launch Instance

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_IP>

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.

Step 4: Clone and Configure

# 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

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:
1

Point domain to instance

Create an A record: proliferate.yourdomain.com → <PUBLIC_IP>
2

Create Caddyfile

proliferate.yourdomain.com {
    reverse_proxy web:3000

    handle_path /gateway/* {
        reverse_proxy gateway:8787
    }
}
3

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:
4

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
5

Restart

docker-compose down
docker-compose up -d

Instance Sizing

Use CaseInstance TypevCPUsMemoryCost/month
Testingt3.medium24 GB~$30
Small teamt3.large28 GB~$60
Productionm6i.xlarge416 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
  • Check security group allows your IP
  • Verify instance is running in AWS Console