Files
EventHubBack/docker/docker-compose.yml

199 lines
8.2 KiB
YAML

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