Quellcode durchsuchen

Add Docker Compose + Caddy load balancer setup

- docker-compose.yml:
  - Redpanda (event store)
  - 2 Go server instances (server1, server2)
  - Caddy load balancer

- Caddyfile:
  - WebSocket load balancer on port 3843
  - HTTP API on port 3844
  - Health checks
  - Sticky sessions via WebSocket

Architecture:
  Router → Caddy:3843 → server1/server2 → Redpanda
                                   ↓
                              Redpanda (shared)
                                   ↓
                              (all events persisted)

Run:
  TOKEN=*** docker-compose up -d
Luis Rosales vor 2 Monaten
Ursprung
Commit
3f8160ada7
2 geänderte Dateien mit 210 neuen und 0 gelöschten Zeilen
  1. 93 0
      Caddyfile
  2. 117 0
      docker-compose.yml

+ 93 - 0
Caddyfile

@@ -0,0 +1,93 @@
+# Caddyfile for client2server
+# Supports multiple server instances via Docker Compose
+
+{
+    # Global options
+    email your@email.com
+    admin off
+    auto_https off
+}
+
+# ========================================
+# WebSocket Load Balancer (port 3843)
+# ========================================
+ws://:3843 {
+    # Backend servers (Docker network DNS)
+    to server1:3843 server2:3843
+    
+    # Load balancing
+    lb_try_duration 2s
+    lb_try_interval 500ms
+    
+    # Keep WebSocket connections alive
+    websocket
+    
+    # Health check
+    health_check /health {
+        interval 10s
+        timeout 5s
+        fails 2
+        passes 1
+    }
+    
+    # Preserve client info
+    header_up X-Real-IP {remote}
+    header_up X-Forwarded-For {remote}
+    header_up X-Forwarded-Proto {scheme}
+    header_up X-Client-ID {client_ip}
+    
+    # Timeouts for long-lived connections
+    timeouts {
+        read 300s
+        write 300s
+        idle 300s
+    }
+}
+
+# ========================================
+# HTTP API (port 3844)
+# ========================================
+:3844 {
+    # Health endpoint for each server
+    handle /health* {
+        respond "OK" 200
+    }
+    
+    # Events webhook (HTTP fallback)
+    handle /api/events* {
+        reverse_proxy server1:3843
+    }
+    
+    # Router management
+    handle /api/routers* {
+        reverse_proxy server1:3843
+    }
+    
+    # Command endpoint
+    handle /api/command* {
+        reverse_proxy server1:3843
+    }
+    
+    # Default
+    respond "client2server API" 200
+}
+
+# ========================================
+# Dashboard (port 80/443)
+# ========================================
+:80, :443 {
+    # Redirect to HTTPS
+    respond / https://{$host}/dashboard {302}
+}
+
+# Dashboard placeholder (enable if you have a web UI)
+# localhost/dashboard {
+#     reverse_proxy dashboard:3000
+# }
+
+# ========================================
+# TLS for HTTPS (optional)
+# ========================================
+# tls {
+#     # Let's Encrypt (automatic)
+# }

+ 117 - 0
docker-compose.yml

@@ -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: