Docker Compose Deployment

1. Prepare Docker Compose Environment

1

Create Directory Structure

mkdir -p dgraph-compose/{data,config,backups,nginx}
cd dgraph-compose
2

Create Docker Compose File

docker-compose.yml
version: '3.8'

services:
  # Dgraph Zero nodes
  dgraph-zero-1:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-zero-1
    ports:
      - "5080:5080"
      - "6080:6080"
    volumes:
      - ./data/zero1:/dgraph
    command: dgraph zero --my=dgraph-zero-1:5080 --replicas=3 --idx=1
    restart: unless-stopped
    networks:
      - dgraph-network

  dgraph-zero-2:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-zero-2
    ports:
      - "5081:5080"
      - "6081:6080"
    volumes:
      - ./data/zero2:/dgraph
    command: dgraph zero --my=dgraph-zero-2:5080 --replicas=3 --peer=dgraph-zero-1:5080 --idx=2
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-zero-1

  dgraph-zero-3:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-zero-3
    ports:
      - "5082:5080"
      - "6082:6080"
    volumes:
      - ./data/zero3:/dgraph
    command: dgraph zero --my=dgraph-zero-3:5080 --replicas=3 --peer=dgraph-zero-1:5080 --idx=3
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-zero-1

  # Dgraph Alpha nodes
  dgraph-alpha-1:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-alpha-1
    ports:
      - "8080:8080"
      - "9080:9080"
    volumes:
      - ./data/alpha1:/dgraph
    command: dgraph alpha --my=dgraph-alpha-1:7080 --zero=dgraph-zero-1:5080,dgraph-zero-2:5080,dgraph-zero-3:5080 --security whitelist=0.0.0.0/0
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-zero-1
      - dgraph-zero-2
      - dgraph-zero-3

  dgraph-alpha-2:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-alpha-2
    ports:
      - "8081:8080"
      - "9081:9080"
    volumes:
      - ./data/alpha2:/dgraph
    command: dgraph alpha --my=dgraph-alpha-2:7080 --zero=dgraph-zero-1:5080,dgraph-zero-2:5080,dgraph-zero-3:5080 --security whitelist=0.0.0.0/0
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-zero-1
      - dgraph-zero-2
      - dgraph-zero-3

  dgraph-alpha-3:
    image: dgraph/dgraph:v23.1.0
    container_name: dgraph-alpha-3
    ports:
      - "8082:8080"
      - "9082:9080"
    volumes:
      - ./data/alpha3:/dgraph
    command: dgraph alpha --my=dgraph-alpha-3:7080 --zero=dgraph-zero-1:5080,dgraph-zero-2:5080,dgraph-zero-3:5080 --security whitelist=0.0.0.0/0
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-zero-1
      - dgraph-zero-2
      - dgraph-zero-3

  # Load Balancer
  nginx:
    image: nginx:alpine
    container_name: dgraph-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
    restart: unless-stopped
    networks:
      - dgraph-network
    depends_on:
      - dgraph-alpha-1
      - dgraph-alpha-2
      - dgraph-alpha-3

  # Monitoring
  prometheus:
    image: prom/prometheus:latest
    container_name: dgraph-prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
    restart: unless-stopped
    networks:
      - dgraph-network

  grafana:
    image: grafana/grafana:latest
    container_name: dgraph-grafana
    ports:
      - "3000:3000"
    volumes:
      - ./data/grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    restart: unless-stopped
    networks:
      - dgraph-network

networks:
  dgraph-network:
    driver: bridge

volumes:
  dgraph-data:
3

Create Nginx Configuration

nginx/nginx.conf
events {
    worker_connections 1024;
}

http {
    upstream dgraph_alpha {
        least_conn;
        server dgraph-alpha-1:8080;
        server dgraph-alpha-2:8080;
        server dgraph-alpha-3:8080;
    }
    
    upstream dgraph_grpc {
        least_conn;
        server dgraph-alpha-1:9080;
        server dgraph-alpha-2:9080;
        server dgraph-alpha-3:9080;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://dgraph_alpha;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
    # HTTPS configuration (uncomment and configure as needed)
    # server {
    #     listen 443 ssl http2;
    #     server_name your-domain.com;
    #     
    #     ssl_certificate /etc/nginx/ssl/cert.pem;
    #     ssl_certificate_key /etc/nginx/ssl/key.pem;
    #     
    #     location / {
    #         proxy_pass http://dgraph_alpha;
    #         proxy_set_header Host $host;
    #         proxy_set_header X-Real-IP $remote_addr;
    #         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #         proxy_set_header X-Forwarded-Proto $scheme;
    #     }
    # }
}
4

Create Prometheus Configuration

config/prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'dgraph-alpha'
    static_configs:
      - targets: 
        - 'dgraph-alpha-1:8080'
        - 'dgraph-alpha-2:8080'
        - 'dgraph-alpha-3:8080'
    metrics_path: '/debug/prometheus_metrics'
    
  - job_name: 'dgraph-zero'
    static_configs:
      - targets: 
        - 'dgraph-zero-1:6080'
        - 'dgraph-zero-2:6080'
        - 'dgraph-zero-3:6080'
    metrics_path: '/debug/prometheus_metrics'

2. Deploy and Manage Docker Compose Cluster

# Start the entire cluster
docker-compose up -d

# Check status

docker-compose ps

# View logs

docker-compose logs -f dgraph-alpha-1