Skip to content

Docker Deployment

The fastest way to self-host AMP.

Prerequisites

  • Docker 24.0+
  • Docker Compose 2.20+
  • Git

Quick Start

# Clone repository
git clone https://github.com/ubiship/amp.git
cd amp

# Copy environment template
cp .env.example .env

# Edit configuration
nano .env

# Start all services
docker compose up -d

# Check status
docker compose ps

# View logs
docker compose logs -f api

Docker Compose File

version: '3.8'

services:
  api:
    build: .
    command: /app/api serve
    ports:
      - "8080:8080"
    environment:
      - DATABASE_URL=postgres://amp:amp@postgres:5432/amp?sslmode=disable
      - REDIS_URL=redis://redis:6379
      - NATS_URL=nats://nats:4222
    env_file:
      - .env
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      nats:
        condition: service_started
    restart: unless-stopped

  worker:
    build: .
    command: /app/worker
    environment:
      - DATABASE_URL=postgres://amp:amp@postgres:5432/amp?sslmode=disable
      - REDIS_URL=redis://redis:6379
      - NATS_URL=nats://nats:4222
    env_file:
      - .env
    depends_on:
      - api
    restart: unless-stopped

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: amp
      POSTGRES_PASSWORD: amp
      POSTGRES_DB: amp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U amp"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  nats:
    image: nats:2.10-alpine
    command: ["--jetstream", "--store_dir=/data"]
    volumes:
      - nats_data:/data
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:
  nats_data:

Environment Configuration

Create .env file:

# Server
PORT=8080
ENVIRONMENT=production

# Authentication
CLERK_SECRET_KEY=sk_live_xxxxx
CLERK_PUBLISHABLE_KEY=pk_live_xxxxx
JWT_SECRET=your-secure-jwt-secret-min-32-chars

# AI Providers (at least one required)
ANTHROPIC_API_KEY=sk-ant-xxxxx
OPENAI_API_KEY=sk-xxxxx

# Publishing
METRICOOL_TOKEN=xxxxx

Running Migrations

# Run migrations
docker compose exec api /app/api migrate up

# Check migration status
docker compose exec api /app/api migrate status

Scaling

Horizontal Scaling

# Scale API servers
docker compose up -d --scale api=3

# Scale workers
docker compose up -d --scale worker=4

With Load Balancer

Add nginx to docker-compose.yml:

nginx:
  image: nginx:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro
    - ./certs:/etc/nginx/certs:ro
  depends_on:
    - api

Monitoring

Health Checks

# API health
curl http://localhost:8080/health

# Readiness (includes dependencies)
curl http://localhost:8080/ready

Logs

# All services
docker compose logs -f

# Specific service
docker compose logs -f api

# Last 100 lines
docker compose logs --tail=100 api

Resource Usage

docker stats

Backup and Restore

Database Backup

# Backup
docker compose exec postgres pg_dump -U amp amp > backup.sql

# Restore
cat backup.sql | docker compose exec -T postgres psql -U amp amp

Full Backup

# Stop services
docker compose stop

# Backup volumes
docker run --rm -v amp_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres.tar.gz /data
docker run --rm -v amp_redis_data:/data -v $(pwd):/backup alpine tar czf /backup/redis.tar.gz /data
docker run --rm -v amp_nats_data:/data -v $(pwd):/backup alpine tar czf /backup/nats.tar.gz /data

# Start services
docker compose start

Updating

# Pull latest code
git pull origin main

# Rebuild images
docker compose build

# Rolling update
docker compose up -d --no-deps api
docker compose up -d --no-deps worker

# Or full restart
docker compose down
docker compose up -d

Troubleshooting

Container won't start

# Check logs
docker compose logs api

# Check configuration
docker compose config

Database connection issues

# Test connection
docker compose exec api /app/api db:ping

# Check PostgreSQL logs
docker compose logs postgres

Memory issues

# Check memory usage
docker stats

# Increase limits in docker-compose.yml
services:
  api:
    deploy:
      resources:
        limits:
          memory: 2G