# ===================================================================== # netrunner-data — стек наблюдаемости (Prometheus + Loki + Grafana), # ОТДЕЛЬНО от docker-compose.yml (Postgres+Vaultwarden+backup) — разный # жизненный цикл: рестарт/редеплой мониторинга не должен трогать БД. # # Топология: этот стек — единственное место сбора для backend, лендинга и # КАЖДОЙ прокси-ноды ("ядро"), которые физически живут на других серверах. # - Prometheus САМ ходит наружу (scrape) в /metrics на тех хостах — тут # ничего дополнительно открывать не нужно, только у НИХ надо будет # открыть порт метрик для IP этого VPS (см. документацию по мере # инструментирования backend/landing/нод). # - Loki, наоборот, принимает пуши логов ИЗВНЕ (тонкий promtail на каждом # удалённом хосте пушит сюда) — порт 3100 публикуется наружу и # ОБЯЗАТЕЛЬНО фильтруется firewall'ом по IP тех хостов (см. # LOKI_ALLOWED_CIDR ниже, заглушка 0.0.0.0/0 — заменить по мере аренды # серверов, тот же паттерн что postgres/pg_hba.conf в соседнем стеке). # - Prometheus/Grafana UI НЕ публикуются напрямую (127.0.0.1-only) — доступ # к Grafana только через Caddy с auth-гейтом (см. фазу 7 плана # мониторинга), Prometheus UI вообще не нужен наружу. # # Список нод для scrape (observability/targets/nodes.json) генерится и # заливается сюда отдельным шагом деплоя netrunner-proxy — см. # netrunner-proxy/scripts/generate-prometheus-targets.mjs. Пустой массив — # нормальное состояние до первой реальной интеграции нод. # ===================================================================== services: prometheus: image: prom/prometheus:latest container_name: netrunner-prometheus volumes: - ./observability/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./observability/targets:/etc/prometheus/targets:ro - prometheus_data:/prometheus ports: - "127.0.0.1:9090:9090" restart: always networks: - netrunner_observability loki: image: grafana/loki:latest container_name: netrunner-loki volumes: - ./observability/loki-config.yml:/etc/loki/local-config.yaml:ro - loki_data:/tmp/loki ports: # Не 127.0.0.1 — сюда пушат тонкие promtail с других хостов. # Обязательно firewall на конкретные IP, см. шапку файла. - "3100:3100" command: -config.file=/etc/loki/local-config.yaml restart: always networks: - netrunner_observability promtail: image: grafana/promtail:latest container_name: netrunner-observability-promtail volumes: - ./observability/promtail-config.yml:/etc/promtail/config.yml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro command: -config.file=/etc/promtail/config.yml restart: always user: root depends_on: - loki networks: - netrunner_observability grafana: image: grafana/grafana:latest container_name: netrunner-grafana ports: - "127.0.0.1:3030:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} # allow_embedding нужен для iframe-встройки в React-админку (см. # Caddyfile + frontend/src/ObservabilityPage.tsx) — без него Grafana # сама шлёт X-Frame-Options: deny. - GF_SECURITY_ALLOW_EMBEDDING=true - GF_AUTH_ANONYMOUS_ENABLED=false volumes: - grafana_data:/var/lib/grafana - ./observability/grafana-datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml:ro - ./observability/grafana-dashboards-provider.yml:/etc/grafana/provisioning/dashboards/dashboards.yml:ro - ./observability/grafana-dashboards:/etc/grafana/provisioning/dashboards/files:ro depends_on: - prometheus - loki restart: always networks: - netrunner_observability # Единственный публичный вход в Grafana — гейтит доступ через существующую # cookie-сессию netrunner-backend (Owner/Moderator), см. observability/Caddyfile. # Порт Grafana выше (3030) остаётся 127.0.0.1-only — снаружи только через это. caddy: image: caddy:2-alpine container_name: netrunner-observability-caddy restart: always ports: - "80:80" - "443:443" volumes: - ./observability/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - grafana networks: - netrunner_observability networks: netrunner_observability: driver: bridge volumes: prometheus_data: loki_data: grafana_data: caddy_data: caddy_config: