|
|
@@ -0,0 +1,117 @@
|
|
|
+# docker-compose.yml
|
|
|
+# client2server with Caddy load balancer
|
|
|
+
|
|
|
+services:
|
|
|
+ # ========================================
|
|
|
+ # Redpanda (Kafka-compatible event store)
|
|
|
+ # ========================================
|
|
|
+ redpanda:
|
|
|
+ image: docker.redpanda.com/vectorized/redpanda:v23.11.10
|
|
|
+ container_name: client2server-redpanda
|
|
|
+ hostname: redpanda
|
|
|
+ command: redpanda start --overprovisioned --smp 1 --memory 1G --node-id 0 --pandaproxy-port=8082 --schema-registry-port=8081
|
|
|
+ ports:
|
|
|
+ - "8082:8082" # REST API
|
|
|
+ - "8081:8081" # Schema registry
|
|
|
+ - "9092:9092" # Kafka
|
|
|
+ environment:
|
|
|
+ - REDPANDA_AUTO_CREATE_TOPICS=true
|
|
|
+ volumes:
|
|
|
+ - redpanda_data:/var/lib/redpanda/data
|
|
|
+ networks:
|
|
|
+ - client2server
|
|
|
+ healthcheck:
|
|
|
+ test: ["CMD", "curl", "-f", "http://localhost:8082/health"]
|
|
|
+ interval: 10s
|
|
|
+ timeout: 5s
|
|
|
+ retries: 5
|
|
|
+
|
|
|
+ # ========================================
|
|
|
+ # Go Server Instance 1
|
|
|
+ # ========================================
|
|
|
+ server1:
|
|
|
+ build:
|
|
|
+ context: ./server
|
|
|
+ dockerfile: Dockerfile
|
|
|
+ container_name: client2server-server1
|
|
|
+ environment:
|
|
|
+ - REDPANDA_BROKERS=redpanda:9092
|
|
|
+ - TOKEN=${TOKEN:-secret-token}
|
|
|
+ - PORT=3843
|
|
|
+ depends_on:
|
|
|
+ redpanda:
|
|
|
+ condition: service_healthy
|
|
|
+ networks:
|
|
|
+ - client2server
|
|
|
+ restart: unless-stopped
|
|
|
+
|
|
|
+ # ========================================
|
|
|
+ # Go Server Instance 2
|
|
|
+ # ========================================
|
|
|
+ server2:
|
|
|
+ build:
|
|
|
+ context: ./server
|
|
|
+ dockerfile: Dockerfile
|
|
|
+ container_name: client2server-server2
|
|
|
+ environment:
|
|
|
+ - REDPANDA_BROKERS=redpanda:9092
|
|
|
+ - TOKEN=${TOKEN:-secret-token}
|
|
|
+ - PORT=3843
|
|
|
+ depends_on:
|
|
|
+ redpanda:
|
|
|
+ condition: service_healthy
|
|
|
+ networks:
|
|
|
+ - client2server
|
|
|
+ restart: unless-stopped
|
|
|
+
|
|
|
+ # ========================================
|
|
|
+ # Go Server Instance 3 (optional)
|
|
|
+ # ========================================
|
|
|
+ # server3:
|
|
|
+ # build:
|
|
|
+ # context: ./server
|
|
|
+ # dockerfile: Dockerfile
|
|
|
+ # container_name: client2server-server3
|
|
|
+ # environment:
|
|
|
+ # - REDPANDA_BROKERS=redpanda:9092
|
|
|
+ # - TOKEN=${TOKEN:-secret-token}
|
|
|
+ # - PORT=3843
|
|
|
+ # depends_on:
|
|
|
+ # redpanda:
|
|
|
+ # condition: service_healthy
|
|
|
+ # networks:
|
|
|
+ # - client2server
|
|
|
+ # restart: unless-stopped
|
|
|
+
|
|
|
+ # ========================================
|
|
|
+ # Caddy Load Balancer
|
|
|
+ # ========================================
|
|
|
+ caddy:
|
|
|
+ image: caddy:2-alpine
|
|
|
+ container_name: client2server-caddy
|
|
|
+ ports:
|
|
|
+ - "80:80"
|
|
|
+ - "443:443"
|
|
|
+ - "3843:3843" # WebSocket
|
|
|
+ - "3844:3844" # HTTP API
|
|
|
+ volumes:
|
|
|
+ - ./Caddyfile:/etc/caddy/Caddyfile:ro
|
|
|
+ - caddy_data:/data
|
|
|
+ - caddy_config:/config
|
|
|
+ environment:
|
|
|
+ - CADDY_INGRESS_NETWORK=caddy
|
|
|
+ depends_on:
|
|
|
+ - server1
|
|
|
+ - server2
|
|
|
+ networks:
|
|
|
+ - client2server
|
|
|
+ restart: unless-stopped
|
|
|
+
|
|
|
+networks:
|
|
|
+ client2server:
|
|
|
+ driver: bridge
|
|
|
+
|
|
|
+volumes:
|
|
|
+ redpanda_data:
|
|
|
+ caddy_data:
|
|
|
+ caddy_config:
|