Перейти к содержимому

Мониторинг через Grafana и Victoria Metrics

Автор: pluralplay, kutovoys
Развертывание интеллектуального стека мониторинга, включающего Grafana для создания динамичных дашбордов, Victoria Metrics для хранения и обработки метрик, Node Exporter для мониторинга серверов, cAdvisor для анализа контейнеров, Xray Checker для контроля сетевых соединений и Netbird для построения безопасной сетевой архитектуры. Это решение обеспечивает максимальную прозрачность, производительность и безопасность вашей инфраструктуры.

  • Grafana - это инструмент, который преобразует различные формы метрик, полученных от Victoria Metrics, в визуальные формы для аналитического и системного мониторинга.

  • Victoria Metrics (VMetrics) - это непосредственно система сбора и хранения метрик со всех машин, полученных от агента, а vmagent - доставщик этих метрик в vmetrics.

  • Node Exporter - инструмент сбора метрик. Он собирает информацию о различных ресурсах узла, таких как загрузка процессора, использование памяти, дисковый ввод-вывод, сетевая статистика и другие.

  • cAdvisor - так-же является инструментом сбора метрик. Собирает информацию о производительности Docker-контейнеров.

  • Xray-Checker - проверка состояния ваших хостов, и отправка метрик в Victoria Metrics.

Scheme

Конфигурация вашего сервера с Grafana и Victoria Metrics

Заголовок раздела «Конфигурация вашего сервера с Grafana и Victoria Metrics»
  1. Установка Docker:

    Окно терминала
    curl -fsSL https://get.docker.com | sh
  2. Создаем директории и docker-compose.yml:

    Окно терминала
    mkdir -p /opt/monitoring/{cadvisor,nodeexporter,nginx,vmagent/conf.d} && cd /opt/monitoring && nano docker-compose.yml

    Вставляем следующее содержимое и заменяем поля на свои:

    docker-compose.yml
    services:
    vmsingle:
    image: victoriametrics/victoria-metrics:v1.124.0
    container_name: vmsingle
    hostname: vmsingle
    restart: unless-stopped
    volumes:
    - ./victoria-metrics-data:/victoria-metrics-data
    command:
    - '--storageDataPath=/victoria-metrics-data'
    networks:
    - grafana-network
    ports:
    - IP:8428:8428 # Тут указываем адрес NetBird (в данном случае сервера Grafana)
    grafana:
    image: grafana/grafana:12.2.0-17027759091
    container_name: grafana
    hostname: grafana
    restart: unless-stopped
    volumes:
    - grafana-data:/var/lib/grafana
    - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
    - GF_SERVER_DOMAIN=yourdomain.com # основной домен до графаны, не забываем добавить DNS-запись для него (если повесили на sub-домен, тут надо вписать целевой домен)
    - GF_SERVER_ROOT_URL=https://grafana.yourdomain.com/grafana # полный путь до графаны
    - GF_SERVER_SERVE_FROM_SUB_PATH=true
    - GF_SERVER_HTTP_PORT=3000
    - GF_SERVER_PROTOCOL=http
    - GF_SECURITY_ADMIN_USER=admin
    - GF_SECURITY_ADMIN_PASSWORD=admin
    - GF_ANALYTICS_REPORTING_ENABLED=false
    networks:
    - grafana-network
    xray-checker:
    image: kutovoys/xray-checker
    container_name: xray-checker
    hostname: xraychecker
    restart: unless-stopped
    environment:
    - "SUBSCRIPTION_URL=https://subscription_link" # Тут указываем ссылку-подписку для XrayChecker
    - "PROXY_STATUS_CHECK_URL=http://google.com/generate_204"
    - "PROXY_CHECK_INTERVAL=60"
    ports:
    - 127.0.0.1:2112:2112
    networks:
    - grafana-network
    grafana-nginx:
    image: nginx:1.28
    container_name: grafana-nginx
    volumes:
    - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    - /etc/letsencrypt/live/yourdomain.com/fullchain.pem:/etc/nginx/ssl/yourdomain.com/fullchain.pem:ro
    - /etc/letsencrypt/live/yourdomain.com/privkey.pem:/etc/nginx/ssl/yourdomain.com/privkey.pem:ro
    restart: unless-stopped
    ports:
    - 443:443
    networks:
    - grafana-network
    volumes:
    grafana-data:
    networks:
    grafana-network:
    name: grafana-network
    driver: bridge
    external: false
  3. Создаём nginx.conf:

    Окно терминала
    nano /opt/monitoring/nginx/nginx.conf
  4. Вставляем следующее содержимое:

    nginx.conf
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    server {
    listen 443 ssl;
    http2 on;
    server_name grafana.yourdomain.com; # Вписываем домен, или саб-домен для доступа к grafana извне
    ssl_certificate "/etc/nginx/ssl/yourdomain.com/fullchain.pem"; # Указываем путь до сертификата
    ssl_certificate_key "/etc/nginx/ssl/yourdomain.com/privkey.pem"; # Указываем путь до приватного ключа
    ssl_trusted_certificate "/etc/nginx/ssl/yourdomain.com/fullchain.pem"; # Указываем путь до сертификата
    location /grafana {
    proxy_pass http://grafana:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
  5. Запускаем docker-compose

    Окно терминала
    docker compose up -d && docker compose logs -f -t
  1. Установка cadvisor, node_exporter, vmagent:

    Окно терминала
    cd /opt/monitoring/cadvisor && wget https://github.com/google/cadvisor/releases/download/v0.53.0/cadvisor-v0.53.0-linux-amd64 && mv cadvisor-v0.53.0-linux-amd64 cadvisor && chmod +x cadvisor && cd /opt/monitoring/nodeexporter && wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz && tar -xvf node_exporter-1.9.1.linux-amd64.tar.gz && cd node_exporter-1.9.1.linux-amd64 && mv node_exporter /opt/monitoring/nodeexporter && cd .. && chmod +x node_exporter && rm -f node_exporter-1.9.1.linux-amd64.tar.gz && rm -r node_exporter-1.9.1.linux-amd64 && cd /opt/monitoring/vmagent && wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.123.0/vmutils-linux-amd64-v1.123.0.tar.gz && tar -xvf vmutils-linux-amd64-v1.123.0.tar.gz && mv vmagent-prod vmagent && find . ! -name 'vmagent' -type f -delete && chmod +x vmagent && cd
  2. Создаем файл конфигурации vmagent:

    Окно терминала
    nano /opt/monitoring/vmagent/scrape.yml

    Вставляем следующее содержимое:

    scrape.yml
    scrape_config_files:
    - "/opt/monitoring/vmagent/conf.d/*.yml"
    global:
    scrape_interval: 15s
  3. Создаем файл конфигурации cadvisor:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/cadvisor.yml

    Вставляем следующее содержимое:

    cadvisor.yml
    - job_name: integrations/cAdvisor
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9101']
    labels:
    instance: "ваше_название_инстанса(сервера Grafana)"
  4. Создаем файл конфигурации node_exporter:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/nodeexporter.yml

    Вставляем следующее содержимое:

    nodeexporter.yml
    - job_name: integrations/node_exporter
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9100']
    labels:
    instance: "ваше_название_инстанса(сервера Grafana)"
  5. Создаем файл конфигурации xray checker:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/xraychecker.yml

    Вставляем следующее содержимое:

    xraychecker.yml
    - job_name: xray_checker
    scrape_interval: 15s
    static_configs:
    - targets: ['127.0.0.1:2112']
    labels:
    instance: "ваше_название_инстанса(сервера Grafana)"
  6. Создаем файл службы cadvisor:

    Окно терминала
    nano /etc/systemd/system/cadvisor.service

    Вставляем следующее содержимое:

    cadvisor.service
    [Unit]
    Description=cAdvisor
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/cadvisor/cadvisor \
    -listen_ip=127.0.0.1 \
    -logtostderr \
    -port=9101 \
    -docker_only=true
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  7. Создаем файл службы node_exporter:

    Окно терминала
    nano /etc/systemd/system/nodeexporter.service

    Вставляем следующее содержимое:

    nodeexporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  8. Создаем файл службы vmagent:

    Окно терминала
    nano /etc/systemd/system/vmagent.service

    Вставляем следующее содержимое:

    vmagent.service
    [Unit]
    Description=VictoriaMetrics Agent
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/vmagent/vmagent \
    -httpListenAddr=127.0.0.1:8429 \
    -promscrape.config=/opt/monitoring/vmagent/scrape.yml \
    -promscrape.configCheckInterval=60s \
    -remoteWrite.url=http://IP:8428/api/v1/write
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  9. Запускаем службы и добавляем их в автозагрузку:

    Окно терминала
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  10. Проверим статус служб:

    Окно терминала
    systemctl status cadvisor
    systemctl status nodeexporter
    systemctl status vmagent

Установка и настройка сервера c панелью Remnawave

Заголовок раздела «Установка и настройка сервера c панелью Remnawave»
  1. Создаем директории и устанавливаем cadvisor, node_exporter, vmagent:

    Окно терминала
    mkdir -p /opt/monitoring/{cadvisor,nodeexporter,vmagent/conf.d} && cd /opt/monitoring/cadvisor && wget https://github.com/google/cadvisor/releases/download/v0.53.0/cadvisor-v0.53.0-linux-amd64 && mv cadvisor-v0.53.0-linux-amd64 cadvisor && chmod +x cadvisor && cd /opt/monitoring/nodeexporter && wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz && tar -xvf node_exporter-1.9.1.linux-amd64.tar.gz && cd node_exporter-1.9.1.linux-amd64 && mv node_exporter /opt/monitoring/nodeexporter && cd .. && chmod +x node_exporter && rm -f node_exporter-1.9.1.linux-amd64.tar.gz && rm -r node_exporter-1.9.1.linux-amd64 && cd /opt/monitoring/vmagent && wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.123.0/vmutils-linux-amd64-v1.123.0.tar.gz && tar -xvf vmutils-linux-amd64-v1.123.0.tar.gz && mv vmagent-prod vmagent && find . ! -name 'vmagent' -type f -delete && chmod +x vmagent && cd
  2. Создаем файл конфигурации vmagent:

    Окно терминала
    nano /opt/monitoring/vmagent/scrape.yml

    Вставляем следующее содержимое:

    scrape.yml
    scrape_config_files:
    - "/opt/monitoring/vmagent/conf.d/*.yml"
    global:
    scrape_interval: 15s
  3. Создаем файл конфигурации cadvisor:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/cadvisor.yml

    Вставляем следующее содержимое:

    cadvisor.yml
    - job_name: integrations/cAdvisor
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9101']
    labels:
    instance: "ваше_название_инстанса(сервера Remnawave панели)"
  4. Создаем файл конфигурации node_exporter:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/nodeexporter.yml

    Вставляем следующее содержимое:

    nodeexporter.yml
    - job_name: integrations/node_exporter
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9100']
    labels:
    instance: "ваше_название_инстанса(сервера Remnawave панели)"
  5. Создаем файл конфигурации remnawave панели:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/remnawave.yml

    Вставляем следующее содержимое:

    Пример

    .env
    ### PROMETHEUS ###
    ### Metrics are available at /api/metrics
    METRICS_USER=gjlToiPH
    METRICS_PASS=VsCNutHF
    remnawave.yml
    - job_name: remnawave
    scrape_interval: 15s
    static_configs:
    - targets: ['127.0.0.1:3001']
    labels:
    instance: "ваше_название_инстанса(сервера Remnawave панели)"
    basic_auth:
    username: "xxxxxxx"
    password: "xxxxxxx"
  6. Прокидываем порт метрики в docker-compose.yml:

    Окно терминала
    nano /opt/remnawave/docker-compose.yml

    Находим следующее содержимое и добавляем:

    docker-compose.yml
    remnawave:
    image: remnawave/backend:latest
    container_name: remnawave
    hostname: remnawave
    restart: always
    env_file:
    - .env
    ports:
    - '127.0.0.1:3000:3000'
    - '127.0.0.1:3001:3001' # Порт метрики
    networks:
    - remnawave-network
    depends_on:
    remnawave-db:
    condition: service_healthy
    remnawave-redis:
    condition: service_healthy
    logging:
    driver: 'json-file'
    options:
    max-size: '30m'
    max-file: '5'
  7. Перезапускаем docker-compose::

    Окно терминала
    cd /opt/remnawave && docker compose down && docker compose up -d && docker compose logs -f -t
  8. Создаем файл службы cadvisor:

    Окно терминала
    nano /etc/systemd/system/cadvisor.service

    Вставляем следующее содержимое:

    cadvisor.service
    [Unit]
    Description=cAdvisor
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/cadvisor/cadvisor \
    -listen_ip=127.0.0.1 \
    -logtostderr \
    -port=9101 \
    -docker_only=true
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  9. Создаем файл службы node_exporter:

    Окно терминала
    nano /etc/systemd/system/nodeexporter.service

    Вставляем следующее содержимое:

    nodeexporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  10. Создаем файл службы vmagent:

    Окно терминала
    nano /etc/systemd/system/vmagent.service

    Вставляем следующее содержимое:

    vmagent.service
    [Unit]
    Description=VictoriaMetrics Agent
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/vmagent/vmagent \
    -httpListenAddr=127.0.0.1:8429 \
    -promscrape.config=/opt/monitoring/vmagent/scrape.yml \
    -promscrape.configCheckInterval=60s \
    -remoteWrite.url=http://IP:8428/api/v1/write
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  11. Запускаем службы и добавляем их в автозагрузку:

    Окно терминала
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  12. Проверим статус служб:

    Окно терминала
    systemctl status cadvisor
    systemctl status nodeexporter
    systemctl status vmagent

Установка и настройка сервера c нодой Remnawave

Заголовок раздела «Установка и настройка сервера c нодой Remnawave»
  1. Создаем директории и устанавливаем cadvisor, node_exporter, vmagent:

    Окно терминала
    mkdir -p /opt/monitoring/{cadvisor,nodeexporter,vmagent/conf.d} && cd /opt/monitoring/cadvisor && wget https://github.com/google/cadvisor/releases/download/v0.53.0/cadvisor-v0.53.0-linux-amd64 && mv cadvisor-v0.53.0-linux-amd64 cadvisor && chmod +x cadvisor && cd /opt/monitoring/nodeexporter && wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz && tar -xvf node_exporter-1.9.1.linux-amd64.tar.gz && cd node_exporter-1.9.1.linux-amd64 && mv node_exporter /opt/monitoring/nodeexporter && cd .. && chmod +x node_exporter && rm -f node_exporter-1.9.1.linux-amd64.tar.gz && rm -r node_exporter-1.9.1.linux-amd64 && cd /opt/monitoring/vmagent && wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.123.0/vmutils-linux-amd64-v1.123.0.tar.gz && tar -xvf vmutils-linux-amd64-v1.123.0.tar.gz && mv vmagent-prod vmagent && find . ! -name 'vmagent' -type f -delete && chmod +x vmagent && cd
  2. Создаем файл конфигурации vmagent:

    Окно терминала
    nano /opt/monitoring/vmagent/scrape.yml

    Вставляем следующее содержимое:

    scrape.yml
    scrape_config_files:
    - "/opt/monitoring/vmagent/conf.d/*.yml"
    global:
    scrape_interval: 15s
  3. Создаем файл конфигурации cadvisor:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/cadvisor.yml

    Вставляем следующее содержимое:

    cadvisor.yml
    - job_name: integrations/cAdvisor
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9101']
    labels:
    instance: "ваше_название_инстанса(сервера Remnawave ноды)"
  4. Создаем файл конфигурации node_exporter:

    Окно терминала
    nano /opt/monitoring/vmagent/conf.d/nodeexporter.yml

    Вставляем следующее содержимое:

    nodeexporter.yml
    - job_name: integrations/node_exporter
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9100']
    labels:
    instance: "ваше_название_инстанса(сервера Remnawave ноды)"
  5. Создаем файл службы cadvisor:

    Окно терминала
    nano /etc/systemd/system/cadvisor.service

    Вставляем следующее содержимое:

    cadvisor.service
    [Unit]
    Description=cAdvisor
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/cadvisor/cadvisor \
    -listen_ip=127.0.0.1 \
    -logtostderr \
    -port=9101 \
    -docker_only=true
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  6. Создаем файл службы node_exporter:

    Окно терминала
    nano /etc/systemd/system/nodeexporter.service

    Вставляем следующее содержимое:

    nodeexporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  7. Создаем файл службы vmagent:

    Окно терминала
    nano /etc/systemd/system/vmagent.service

    Вставляем следующее содержимое:

    vmagent.service
    [Unit]
    Description=VictoriaMetrics Agent
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/opt/monitoring/vmagent/vmagent \
    -httpListenAddr=127.0.0.1:8429 \
    -promscrape.config=/opt/monitoring/vmagent/scrape.yml \
    -promscrape.configCheckInterval=60s \
    -remoteWrite.url=http://IP:8428/api/v1/write
    Restart=always
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
  8. Запускаем службы и добавляем их в автозагрузку:

    Окно терминала
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  9. Проверим статус служб:

    Окно терминала
    systemctl status cadvisor
    systemctl status nodeexporter
    systemctl status vmagent
  1. Заходим в Grafana по адресу, который вы указали в nginx.conf

    Пример Grafana URL
    https://grafana.yourdomain.com/grafana
  2. Нас встречает страница авторизации, вводим admin и admin, затем меняем пароль

  3. Попадаем в главное меню Grafana

    Grafana main menu

  4. Переходим в раздел Connections —> Data Sources

  5. Нажимаем кнопку Add data source и выбираем prometheus

  6. В секции Connection в поле URL вводим http://vmsingle:8428

    Grafana data source

  7. Нажимаем в самом низу страницы кнопку Save & Test и проверяем, что подключение установлено

Список Dashboard:

  1. Переходим в раздел Dashboards

  2. Нажимаем справа вверху кнопку New и выбираем Import

  3. Загружаем наш Dashboard

  4. Где victoriametrics выбираем наш prometheus

    Grafana Dashboard

  5. Нажимаем кнопку Import данный шаблон будет загружен