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¶
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¶
Database connection issues¶
# Test connection
docker compose exec api /app/api db:ping
# Check PostgreSQL logs
docker compose logs postgres