Files
dex/docker/compose.prod.yml

265 lines
6.2 KiB
YAML

version: '3.8'
services:
# DEX Node 1 - Primary Validator
dex-node-1:
build:
context: ..
dockerfile: docker/backend/Dockerfile
container_name: lx-dex-node-1
environment:
- NODE_ID=1
- LOG_LEVEL=info
- BLOCK_TIME=1ms
- ENABLE_MLX=true
- ENABLE_QZMQ=true
- QZMQ_PUB_PORT=5555
- QZMQ_SUB_PORT=5556
- QZMQ_ROUTER_PORT=5557
- QZMQ_DEALER_PORT=5558
- DB_PATH=/data/badgerdb
- CONSENSUS_K=3
- CONSENSUS_N=3
volumes:
- node1-data:/data
ports:
- "8080:8080" # JSON-RPC
- "8081:8081" # WebSocket
- "50051:50051" # gRPC
- "9091:9090" # Metrics
networks:
- dex-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
# DEX Node 2 - Secondary Validator
dex-node-2:
build:
context: ..
dockerfile: docker/backend/Dockerfile
container_name: lx-dex-node-2
environment:
- NODE_ID=2
- LOG_LEVEL=info
- BLOCK_TIME=1ms
- ENABLE_MLX=true
- ENABLE_QZMQ=true
- QZMQ_PUB_PORT=5565
- QZMQ_SUB_PORT=5566
- QZMQ_ROUTER_PORT=5567
- QZMQ_DEALER_PORT=5568
- DB_PATH=/data/badgerdb
- CONSENSUS_K=3
- CONSENSUS_N=3
- QZMQ_PEERS=dex-node-1:5555,dex-node-3:5575
volumes:
- node2-data:/data
ports:
- "8082:8080" # JSON-RPC
- "8083:8081" # WebSocket
- "50052:50051" # gRPC
- "9092:9090" # Metrics
networks:
- dex-network
restart: unless-stopped
depends_on:
- dex-node-1
# DEX Node 3 - Tertiary Validator
dex-node-3:
build:
context: ..
dockerfile: docker/backend/Dockerfile
container_name: lx-dex-node-3
environment:
- NODE_ID=3
- LOG_LEVEL=info
- BLOCK_TIME=1ms
- ENABLE_MLX=true
- ENABLE_QZMQ=true
- QZMQ_PUB_PORT=5575
- QZMQ_SUB_PORT=5576
- QZMQ_ROUTER_PORT=5577
- QZMQ_DEALER_PORT=5578
- DB_PATH=/data/badgerdb
- CONSENSUS_K=3
- CONSENSUS_N=3
- QZMQ_PEERS=dex-node-1:5555,dex-node-2:5565
volumes:
- node3-data:/data
ports:
- "8084:8080" # JSON-RPC
- "8085:8081" # WebSocket
- "50053:50051" # gRPC
- "9093:9090" # Metrics
networks:
- dex-network
restart: unless-stopped
depends_on:
- dex-node-1
- dex-node-2
# Load Balancer (HAProxy)
load-balancer:
image: haproxy:2.9-alpine
container_name: lx-dex-lb
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "80:80" # HTTP API
- "443:443" # HTTPS API
- "8080:8080" # JSON-RPC
- "8081:8081" # WebSocket
- "50051:50051" # gRPC
networks:
- dex-network
restart: unless-stopped
depends_on:
- dex-node-1
- dex-node-2
- dex-node-3
# UI Frontend
dex-ui:
build:
context: ..
dockerfile: docker/ui/Dockerfile
container_name: lx-dex-ui
environment:
- NEXT_PUBLIC_API_URL=http://load-balancer:8080
- NEXT_PUBLIC_WS_URL=ws://load-balancer:8081
ports:
- "3000:3000"
networks:
- dex-network
restart: unless-stopped
depends_on:
- load-balancer
# Prometheus
prometheus:
image: prom/prometheus:v2.48.0
container_name: lx-prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
volumes:
- ../monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
ports:
- "9090:9090"
networks:
- dex-network
- monitoring
restart: unless-stopped
# Grafana
grafana:
image: grafana/grafana:10.2.3
container_name: lx-grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_SERVER_ROOT_URL=http://localhost:3001
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
volumes:
- ../monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ../monitoring/grafana/datasources:/etc/grafana/provisioning/datasources:ro
- grafana-data:/var/lib/grafana
ports:
- "3001:3000"
networks:
- monitoring
restart: unless-stopped
depends_on:
- prometheus
# PostgreSQL with TimescaleDB
postgres:
image: timescale/timescaledb:latest-pg16
container_name: lx-postgres
environment:
- POSTGRES_DB=lxdex
- POSTGRES_USER=lxdex
- POSTGRES_PASSWORD=lxdex123
- TS_TUNE_MAX_CONNS=200
- TS_TUNE_MAX_BG_WORKERS=16
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
ports:
- "5432:5432"
networks:
- dex-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lxdex"]
interval: 10s
timeout: 5s
retries: 5
# Redis Cache
redis:
image: redis:7-alpine
container_name: lx-redis
command: redis-server --appendonly yes --maxmemory 2gb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
ports:
- "6379:6379"
networks:
- dex-network
restart: unless-stopped
# NATS Message Bus
nats:
image: nats:2.10-alpine
container_name: lx-nats
command: "-js -m 8222"
ports:
- "4222:4222" # Client connections
- "8222:8222" # Monitoring
networks:
- dex-network
restart: unless-stopped
# Nginx Reverse Proxy
nginx:
image: nginx:alpine
container_name: lx-nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
ports:
- "443:443"
- "80:80"
networks:
- dex-network
restart: unless-stopped
depends_on:
- dex-ui
- load-balancer
networks:
dex-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
monitoring:
driver: bridge
volumes:
node1-data:
node2-data:
node3-data:
prometheus-data:
grafana-data:
postgres-data:
redis-data: