sockudo 2.3.2

A simple, fast, and secure WebSocket server for real-time applications.
Documentation
# =============================================================================
# Sockudo WebSocket Server - Docker Compose Configuration
# =============================================================================

name: sockudo-ws  # Add this line to set project name

services:
  # ---------------------------------------------------------------------------
  # Sockudo WebSocket Server
  # ---------------------------------------------------------------------------
  sockudo:
    build:
      context: .
      dockerfile: Dockerfile
      target: runtime
    # Alternative: Use simple dockerfile if main one fails
    # build:
    #   context: .
    #   dockerfile: Dockerfile.simple
    #   target: runtime
    container_name: sockudo-server
    restart: unless-stopped
    
    # Environment variables
    environment:
      RUST_LOG: "info,sockudo=debug"
      DEBUG: "false"
      HOST: "0.0.0.0"
      PORT: "6001"
      METRICS_PORT: "9601"
      
      # Database Configuration
      DATABASE_REDIS_HOST: "redis"
      DATABASE_REDIS_PORT: "6379"
      DATABASE_REDIS_PASSWORD: "${REDIS_PASSWORD:-}"
      DATABASE_REDIS_DB: "0"
      DATABASE_REDIS_KEY_PREFIX: "sockudo:"
      
      # Driver Configuration
      ADAPTER_DRIVER: "redis"
      CACHE_DRIVER: "redis"
      QUEUE_DRIVER: "redis"
      APP_MANAGER_DRIVER: "memory"
      METRICS_DRIVER: "prometheus"
      RATE_LIMITER_DRIVER: "redis"
      
      # Application Configuration
      INSTANCE_PROCESS_ID: "${HOSTNAME:-sockudo-1}"
      SHUTDOWN_GRACE_PERIOD: "10"
      
      # Metrics Configuration
      METRICS_ENABLED: "true"
      METRICS_HOST: "0.0.0.0"
      METRICS_PROMETHEUS_PREFIX: "sockudo_"
      
      # Default App Configuration (for development)
      SOCKUDO_DEFAULT_APP_ID: "demo-app"
      SOCKUDO_DEFAULT_APP_KEY: "demo-key"
      SOCKUDO_DEFAULT_APP_SECRET: "demo-secret"
      SOCKUDO_ENABLE_CLIENT_MESSAGES: "true"
      SOCKUDO_DEFAULT_APP_ENABLED: "true"
      SOCKUDO_DEFAULT_APP_MAX_CONNECTIONS: "1000"
      SOCKUDO_DEFAULT_APP_MAX_CLIENT_EVENTS_PER_SECOND: "100"
      SOCKUDO_DEFAULT_APP_MAX_READ_REQUESTS_PER_SECOND: "100"
      SOCKUDO_DEFAULT_APP_ENABLE_USER_AUTHENTICATION: "false"
      SOCKUDO_DEFAULT_APP_ENABLE_WATCHLIST_EVENTS: "false"
    
    # Port mappings
    ports:
      - "6001:6001"  # WebSocket/HTTP API port
      - "9601:9601"  # Metrics port
    
    # Volume mounts
    volumes:
      - ./config:/app/config:ro
      - ./logs:/app/logs
      # Uncomment for SSL certificates
      # - ./ssl:/app/ssl:ro
    
    # Health check
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:6001/up/demo-app"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    
    # Dependencies
    depends_on:
      redis:
        condition: service_healthy
      # mysql:
      #   condition: service_healthy
    
    # Resource limits
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1.0'
        reservations:
          memory: 256M
          cpus: '0.5'
    
    # Logging
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    
    # Networks
    networks:
      - sockudo-network

  # ---------------------------------------------------------------------------
  # Redis - Primary cache and message broker
  # ---------------------------------------------------------------------------
  redis:
    image: redis:7-alpine
    container_name: sockudo-redis
    restart: unless-stopped
    
    # Redis configuration
    command: >
      sh -c "
        if [ -n \"$${REDIS_PASSWORD}\" ]; then
          redis-server --requirepass $${REDIS_PASSWORD} --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
        else
          redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
        fi
      "
    
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD:-}
    
    # Port mapping (optional, for external access)
    ports:
      - "6379:6379"
    
    # Persistent storage
    volumes:
      - redis-data:/data
    
    # Health check
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    
    # Resource limits
    deploy:
      resources:
        limits:
          memory: 256M
          cpus: '0.5'
    
    # Logging
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    
    networks:
      - sockudo-network

  # ---------------------------------------------------------------------------
  # MySQL Database (Optional - uncomment if using MySQL for app management)
  # ---------------------------------------------------------------------------
  # mysql:
  #   image: mysql:8.0
  #   container_name: sockudo-mysql
  #   restart: unless-stopped
  #   
  #   environment:
  #     - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123}
  #     - MYSQL_DATABASE=sockudo
  #     - MYSQL_USER=sockudo
  #     - MYSQL_PASSWORD=${MYSQL_PASSWORD:-sockudo123}
  #   
  #   ports:
  #     - "3306:3306"
  #   
  #   volumes:
  #     - mysql-data:/var/lib/mysql
  #     - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
  #   
  #   healthcheck:
  #     test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "sockudo", "-p${MYSQL_PASSWORD:-sockudo123}"]
  #     interval: 30s
  #     timeout: 10s
  #     retries: 3
  #     start_period: 30s
  #   
  #   deploy:
  #     resources:
  #       limits:
  #         memory: 512M
  #         cpus: '1.0'
  #   
  #   logging:
  #     driver: "json-file"
  #     options:
  #       max-size: "10m"
  #       max-file: "3"
  #   
  #   networks:
  #     - sockudo-network

  # ---------------------------------------------------------------------------
  # Redis Cluster Setup (Optional - uncomment for high availability)
  # ---------------------------------------------------------------------------
  # redis-cluster-1:
  #   image: redis:7-alpine
  #   container_name: sockudo-redis-cluster-1
  #   restart: unless-stopped
  #   command: redis-server --port 7000 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
  #   ports:
  #     - "7000:7000"
  #   volumes:
  #     - redis-cluster-1-data:/data
  #   networks:
  #     - sockudo-network
  # 
  # redis-cluster-2:
  #   image: redis:7-alpine
  #   container_name: sockudo-redis-cluster-2
  #   restart: unless-stopped
  #   command: redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
  #   ports:
  #     - "7001:7001"
  #   volumes:
  #     - redis-cluster-2-data:/data
  #   networks:
  #     - sockudo-network
  # 
  # redis-cluster-3:
  #   image: redis:7-alpine
  #   container_name: sockudo-redis-cluster-3
  #   restart: unless-stopped
  #   command: redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
  #   ports:
  #     - "7002:7002"
  #   volumes:
  #     - redis-cluster-3-data:/data
  #   networks:
  #     - sockudo-network

  # ---------------------------------------------------------------------------
  # Prometheus (Optional - for advanced metrics collection)
  # ---------------------------------------------------------------------------
  # prometheus:
  #   image: prom/prometheus:latest
  #   container_name: sockudo-prometheus
  #   restart: unless-stopped
  #   
  #   ports:
  #     - "9090:9090"
  #   
  #   volumes:
  #     - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
  #     - prometheus-data:/prometheus
  #   
  #   command:
  #     - '--config.file=/etc/prometheus/prometheus.yml'
  #     - '--storage.tsdb.path=/prometheus'
  #     - '--web.console.libraries=/etc/prometheus/console_libraries'
  #     - '--web.console.templates=/etc/prometheus/consoles'
  #     - '--storage.tsdb.retention.time=200h'
  #     - '--web.enable-lifecycle'
  #   
  #   networks:
  #     - sockudo-network

  # ---------------------------------------------------------------------------
  # Grafana (Optional - for metrics visualization)
  # ---------------------------------------------------------------------------
  # grafana:
  #   image: grafana/grafana:latest
  #   container_name: sockudo-grafana
  #   restart: unless-stopped
  #   
  #   environment:
  #     - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin123}
  #     - GF_USERS_ALLOW_SIGN_UP=false
  #   
  #   ports:
  #     - "3000:3000"
  #   
  #   volumes:
  #     - grafana-data:/var/lib/grafana
  #     - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
  #     - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources:ro
  #   
  #   networks:
  #     - sockudo-network

  # ---------------------------------------------------------------------------
  # NATS (Optional - alternative message broker)
  # ---------------------------------------------------------------------------
  # nats:
  #   image: nats:latest
  #   container_name: sockudo-nats
  #   restart: unless-stopped
  #   
  #   ports:
  #     - "4222:4222"
  #     - "8222:8222"  # HTTP monitoring
  #   
  #   command: ["-js", "-m", "8222"]
  #   
  #   volumes:
  #     - nats-data:/data
  #   
  #   networks:
  #     - sockudo-network

  # ---------------------------------------------------------------------------
  # Load Balancer (Optional - for multiple Sockudo instances)
  # ---------------------------------------------------------------------------
  # nginx:
  #   image: nginx:alpine
  #   container_name: sockudo-nginx
  #   restart: unless-stopped
  #   
  #   ports:
  #     - "80:80"
  #     - "443:443"
  #   
  #   volumes:
  #     - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
  #     - ./nginx/ssl:/etc/nginx/ssl:ro
  #   
  #   depends_on:
  #     - sockudo
  #   
  #   networks:
  #     - sockudo-network

# =============================================================================
# Volumes
# =============================================================================
volumes:
  redis-data:
    driver: local
  # mysql-data:
  #   driver: local
  # redis-cluster-1-data:
  #   driver: local
  # redis-cluster-2-data:
  #   driver: local
  # redis-cluster-3-data:
  #   driver: local
  # prometheus-data:
  #   driver: local
  # grafana-data:
  #   driver: local
  # nats-data:
  #   driver: local

# =============================================================================
# Networks
# =============================================================================
networks:
  sockudo-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16