services: # DEX Backend - Single Node with K=1 Consensus dex-node: build: context: ../backend dockerfile: ../docker/backend/Dockerfile container_name: lux-dex-node hostname: dex-node-1 environment: - NODE_ID=node-1 - NODE_PORT=5000 - HTTP_PORT=8080 - WS_PORT=8081 - CONSENSUS_K=1 # Single node consensus - CONSENSUS_N=1 # Total nodes = 1 - ENGINE_TYPE=hybrid - TEST_MODE=true - ENABLE_PERPS=true - ENABLE_VAULTS=true - ENABLE_LENDING=true - LOG_LEVEL=info - METRICS_ENABLED=true - METRICS_PORT=9090 ports: - "8080:8080" # HTTP API - "8081:8081" # WebSocket - "5000:5000" # P2P/Consensus - "9090:9090" # Metrics volumes: - dex-data:/data - ../backend/config:/config networks: - dex-network - lux-monitoring healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # UI Frontend dex-ui: build: context: ../ui dockerfile: ../docker/ui/Dockerfile args: - NEXT_PUBLIC_WS_URL=ws://localhost:8081 - NEXT_PUBLIC_API_URL=http://localhost:8080 container_name: lux-dex-ui environment: - NODE_ENV=production - NEXT_PUBLIC_WS_URL=ws://localhost:8081 - NEXT_PUBLIC_API_URL=http://localhost:8080 - NEXT_PUBLIC_BASE_PATH=/v2 ports: - "3000:3000" # Next.js server depends_on: dex-node: condition: service_healthy networks: - dex-network - lux-monitoring healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/v2"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # NATS Message Bus for inter-node communication nats: image: nats:2.10-alpine container_name: lux-dex-nats command: "-p 4222 -m 8222 --cluster_name LX_DEX" ports: - "4222:4222" # Client connections - "8222:8222" # HTTP monitoring networks: - dex-network - lux-monitoring healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8222/healthz"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # Prometheus Metrics prometheus: image: prom/prometheus:latest container_name: lux-dex-prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' ports: - "9091:9090" volumes: - ../monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus networks: - dex-network depends_on: - dex-node restart: unless-stopped # Grafana Dashboard grafana: image: grafana/grafana:latest container_name: lux-dex-grafana environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123 - GF_INSTALL_PLUGINS=grafana-clock-panel ports: - "3001:3000" volumes: - ../monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ../monitoring/grafana/datasources:/etc/grafana/provisioning/datasources - grafana-data:/var/lib/grafana networks: - dex-network depends_on: - prometheus restart: unless-stopped # Nginx Reverse Proxy nginx: image: nginx:alpine container_name: lux-dex-nginx ports: - "80:80" - "443:443" volumes: - ../nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ../nginx/ssl:/etc/nginx/ssl:ro - nginx-cache:/var/cache/nginx networks: - dex-network depends_on: - dex-ui - dex-node restart: unless-stopped # Test Runner (Optional - for automated testing) test-runner: build: context: ../ui dockerfile: ../docker/ui/Dockerfile.test container_name: lux-dex-tests environment: - PLAYWRIGHT_BASE_URL=http://dex-ui:3000 - API_URL=http://dex-node:8080 - WS_URL=ws://dex-node:8081 volumes: - ../ui/test-results:/app/test-results - ../ui/playwright-report:/app/playwright-report networks: - dex-network depends_on: - dex-ui - dex-node profiles: - test command: npm run test:e2e networks: dex-network: driver: bridge ipam: config: - subnet: 172.25.0.0/16 # Connect to Lux monitoring network if available lux-monitoring: external: true name: monitoring_lux-monitoring volumes: dex-data: driver: local prometheus-data: driver: local grafana-data: driver: local nginx-cache: driver: local