Lagrix

16. Node Operator Guide: Deployment (Docker Compose, Prometheus, Grafana и правила алертинга)

1 мин чтения
16. Node Operator Guide: Deployment (Docker Compose, Prometheus, Grafana и правила алертинга)

Финальный этап развертывания Супер-Узла Lagrix — сборка изолированной контейнеризированной среды с автоматической оркестрацией и непрерывным мониторингом. Ошибки в работе инфраструктуры (простой, проваленные проверки агентами, потерянные соседи в Kademlia, задержки ответа Envoy Proxy) стоят оператору дохода, а после 30 дней вне сети узел выбывает без отметки; к proveViolation() в контракте SuperNodeRegistry.sol ведёт только доказанное нарушение (документ 06).

Стек мониторинга на базе Prometheus, Grafana и Alertmanager с интегрированным Node Exporter и Envoy Statsd гарантирует оператору мгновенное обнаружение аномалий до того, как они будут стоить оператору дохода или места.

16.1 Манифест контейнеризации (docker-compose.yml)

Для обеспечения изоляции сетевых ресурсов, ограничения потребления RAM и автоматического перезапуска при сбоях узел разворачивается в виде мульти-контейнерного стека.

version: '3.8'

networks:
  lagrix-mesh:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

volumes:
  lagrix-data:
  prometheus-data:
  grafana-data:

services:
  # 1. Главный исполнительный узел (Control Plane + Kademlia DHT)
  lagrix-core:
    image: ghcr.io/lagrix-dev/lagrix-supernode:<release>
    container_name: lagrix-core
    restart: unless-stopped
    network_mode: host # Обязательно для пробивки NAT и работы STUN/TURN
    volumes:
      - /etc/lagrix/node.toml:/etc/lagrix/node.toml:ro
      - /etc/lagrix/node_key.json:/etc/lagrix/node_key.json:ro
      - lagrix-data:/var/lib/lagrix/data
    environment:
      - RUST_LOG=info,lagrix_core=debug
      - NODE_CONFIG=/etc/lagrix/node.toml
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"

  # 2. Envoy Proxy (Data Plane / mTLS / Dynamic xDS)
  lagrix-envoy:
    image: envoyproxy/envoy:v1.30-latest
    container_name: lagrix-envoy
    restart: unless-stopped
    network_mode: host
    volumes:
      - /etc/lagrix/envoy.yaml:/etc/envoy/envoy.yaml:ro
    command: envoy -c /etc/envoy/envoy.yaml --service-cluster super-relay --service-node lagrix-core
    depends_on:
      - lagrix-core

  # 3. Сервер сбора метрик (Prometheus)
  prometheus:
    image: prom/prometheus:v2.51.0
    container_name: lagrix-prometheus
    restart: unless-stopped
    networks:
      lagrix-mesh:
        ipv4_address: 172.28.0.10
    ports:
      - "127.0.0.1:9090:9090" # Закрыт извне, доступен локально или через SSH-туннель
    volumes:
      - /etc/lagrix/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'

  # 4. Система визуализации (Grafana)
  grafana:
    image: grafana/grafana:10.4.0
    container_name: lagrix-grafana
    restart: unless-stopped
    networks:
      lagrix-mesh:
        ipv4_address: 172.28.0.11
    ports:
      - "127.0.0.1:24690:3000" # порт хоста вне 3000, закрыт снаружи
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=CHANGE_THIS_SECURE_PASSWORD
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana-data:/var/lib/grafana
      - /etc/lagrix/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
    depends_on:
      - prometheus

  # 5. Менеджер оповещений (Alertmanager)
  alertmanager:
    image: prom/alertmanager:v0.27.0
    container_name: lagrix-alertmanager
    restart: unless-stopped
    networks:
      lagrix-mesh:
        ipv4_address: 172.28.0.12
    volumes:
      - /etc/lagrix/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro

16.2 Конфигурация Prometheus (prometheus.yml)

Prometheus непрерывно собирает метрики состояния p2p-сети, задержек Envoy и баланса стейблкоинов/газа.

global:
  scrape_interval: 10s
  evaluation_interval: 10s

rule_files:
  - "/etc/prometheus/alerts.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['172.28.0.12:9093']

scrape_configs:
  - job_name: 'lagrix-core-node'
    static_configs:
      - targets: ['localhost:9090'] # Локальный эндпоинт метрик Rust-ядра

  - job_name: 'lagrix-envoy-proxy'
    static_configs:
      - targets: ['localhost:9901'] # Envoy Admin / Stats endpoint
    metrics_path: '/stats/prometheus'

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['localhost:9100']

16.3 Правила алертинга (alerts.yml)

Система оповещений должна мгновенно триггерить тревогу при возникновении условий, угрожающих доходу или месту оператора:

groups:
  - name: LagrixNodeCriticalAlerts
    rules:
      # 1. Потеря дохода (Выпадение из сети)
      - alert: LagrixNodeDown
        expr: up{job="lagrix-core-node"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "КРИТИЧЕСКАЯ ОШИБКА: Супер-Узел Lagrix отключен!"
          description: "Контейнер lagrix-core недоступен более 1 минуты. Пока узел недоступен, он ничего не зарабатывает, а после 30 дней вне сети выбывает (документ 06)."

      # 2. Потеря связности Kademlia DHT
      - alert: KademliaPeersLow
        expr: lagrix_kademlia_active_peers < 5
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "Низкое количество P2P-соседей"
          description: "Узел подключен всего к {{ $value }} узлам Kademlia. Проверьте блокировку UDP порта 4001."

      # 3. Рост задержек маршрутизации (Envoy Latency)
      - alert: HighMtlsLatency
        expr: histogram_quantile(0.99, sum(rate(envoy_http_downstream_rq_time_bucket[5m])) by (le)) > 200
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Высокая задержка mTLS Data Plane (>200ms)"
          description: "99-й перцентиль задержки Envoy превышает 200 мс. Риск сброса пакетов и получения Fraud Proof!"

      # 4. Истощение эфира для собственных транзакций супер-узла (журнал, запись 38)
      - alert: LowNodeGasBalance
        expr: lagrix_node_native_gas_balance_eth < 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Заканчивается ETH на кошельке узла"
          description: "Эфира для собственных транзакций супер-узла — обналичивания пачек ваучеров и получения доли комиссий — меньше 0.05 ETH. Они могут остановиться; чужих транзакций супер-узел не проводит (журнал, запись 38)."

16.4 Настройка Alertmanager (alertmanager.yml)

Настройка прямой маршрутизации критических уведомлений в Telegram/PagerDuty дежурному DevOps-инженеру:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 30s
  repeat_interval: 2h
  receiver: 'telegram-notifications'

receivers:
  - name: 'telegram-notifications'
    telegram_configs:
      - bot_token: 'YOUR_TELEGRAM_BOT_TOKEN'
        chat_id: YOUR_TELEGRAM_CHAT_ID
        send_resolved: true
        parse_mode: 'HTML'
        message: |
          <b>{{ if eq .Status "firing" }}🚨 АЛЕРТ: {{ .CommonAnnotations.summary }}{{ else }}✅ РЕШЕНО: {{ .CommonAnnotations.summary }}{{ end }}</b>
          <b>Описание:</b> {{ .CommonAnnotations.description }}
          <b>Уровень:</b> {{ .CommonLabels.severity }}
          <b>Время:</b> {{ .StartsAt }}

16.5 Итоговая архитектура панели Grafana (Core Metrics Dashboard)

Панель мониторинга Grafana включает 4 ключевых визуальных виджета:

Network Health: Количество активных соседей в k-buckets, статус прохождения PING-чеков от сетевых хранилищ.

Relay Throughput: Скорость прокачки зашифрованного E2EE-трафика в Мбит/с, количество активных TURN-сессий.

Financial Accounting: накопленная доля супер-узла в комиссиях сделок, плате за поиск и плате за доставку (USDC).

Place Risk Metrics: Счетчик зафиксированных аномалий и периодов подряд с непройденным минимумом качества.