# docker/docker-compose.yml services: # ================== Балансировщик нагрузки ================== traefik: image: traefik:latest user: "0:1001" # группа docker на хосте (подберите при необходимости, см. ls -la /var/run/docker.sock) command: - "--api.insecure=true" # дашборд (можно отключить в production) - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" # пользовательский REST - "--entrypoints.ws.address=:8081" # пользовательский WebSocket - "--entrypoints.admin-web.address=:8445" # админский REST - "--entrypoints.admin-ws.address=:8446" # админский WebSocket # === Включаем метрики Prometheus === - "--metrics.prometheus=true" - "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0" - "--metrics.prometheus.addEntryPointsLabels=true" - "--metrics.prometheus.addServicesLabels=true" ports: - "80:80" - "8080:8080" - "8081:8081" - "8445:8445" - "8446:8446" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" networks: - eventhub-net restart: unless-stopped # ================== Кластер EventHub ================== eventhub-node1: build: context: .. dockerfile: docker/Dockerfile hostname: eventhub-node1.local environment: - NODE_NAME=eventhub-node1@eventhub-node1.local - RELEASE_COOKIE=${RELEASE_COOKIE} - JWT_SECRET=${JWT_SECRET} - JOIN_NODES=eventhub-node1@eventhub-node1.local,eventhub-node2@eventhub-node2.local,eventhub-node3@eventhub-node3.local networks: - eventhub-net volumes: - eventhub-node1-data:/app/data labels: - "traefik.enable=true" # REST API пользователей - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - "traefik.http.routers.api.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" # WebSocket пользователей - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - "traefik.http.routers.ws.entrypoints=ws" - "traefik.http.routers.ws.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" # Админский REST - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - "traefik.http.routers.admin-api.entrypoints=admin-web" - "traefik.http.routers.admin-api.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" # Админский WebSocket - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - "traefik.http.routers.admin-ws.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped eventhub-node2: build: context: .. dockerfile: docker/Dockerfile hostname: eventhub-node2.local environment: - NODE_NAME=eventhub-node2@eventhub-node2.local - RELEASE_COOKIE=${RELEASE_COOKIE} - JWT_SECRET=${JWT_SECRET} - JOIN_NODES=eventhub-node1@eventhub-node1.local,eventhub-node2@eventhub-node2.local,eventhub-node3@eventhub-node3.local networks: - eventhub-net volumes: - eventhub-node2-data:/app/data labels: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - "traefik.http.routers.api.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - "traefik.http.routers.ws.entrypoints=ws" - "traefik.http.routers.ws.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - "traefik.http.routers.admin-api.entrypoints=admin-web" - "traefik.http.routers.admin-api.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - "traefik.http.routers.admin-ws.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped eventhub-node3: build: context: .. dockerfile: docker/Dockerfile hostname: eventhub-node3.local environment: - NODE_NAME=eventhub-node3@eventhub-node3.local - RELEASE_COOKIE=${RELEASE_COOKIE} - JWT_SECRET=${JWT_SECRET} - JOIN_NODES=eventhub-node1@eventhub-node1.local,eventhub-node2@eventhub-node2.local,eventhub-node3@eventhub-node3.local networks: - eventhub-net volumes: - eventhub-node3-data:/app/data labels: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - "traefik.http.routers.api.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - "traefik.http.routers.ws.entrypoints=ws" - "traefik.http.routers.ws.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - "traefik.http.routers.admin-api.entrypoints=admin-web" - "traefik.http.routers.admin-api.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - "traefik.http.routers.admin-ws.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped # ================== Мониторинг ================== prometheus: image: prom/prometheus:latest 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' # === Ограничение retention === - '--storage.tsdb.retention.time=30d' # хранить данные 30 дней - '--storage.tsdb.retention.size=15GB' # максимальный размер 15 ГБ volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus networks: - eventhub-net ports: - "9090:9090" restart: unless-stopped grafana: image: grafana/grafana:latest environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} - GF_SECURITY_DISABLE_INITIAL_ADMIN_PASSWORD_CHANGE=false # обязательно сменить пароль после первого входа - GF_USERS_ALLOW_SIGN_UP=false # запретить самостоятельную регистрацию - GF_AUTH_ANONYMOUS_ENABLED=false # запретить анонимный доступ volumes: - ./grafana/provisioning:/etc/grafana/provisioning - ./grafana/dashboards:/etc/grafana/dashboards - grafana-data:/var/lib/grafana networks: - eventhub-net ports: - "3000:3000" restart: unless-stopped # ================== Инструмент отладки ================== observer_web: build: context: .. dockerfile: docker/ObserverWeb.Dockerfile environment: - RELEASE_COOKIE=${RELEASE_COOKIE} networks: - eventhub-net ports: - "4000:4000" restart: unless-stopped # ================== Сети и тома ================== networks: eventhub-net: driver: bridge volumes: eventhub-node1-data: eventhub-node2-data: eventhub-node3-data: prometheus-data: grafana-data: