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

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

Состав мониторинга: Grafana для дашбордов, Victoria Metrics для хранения метрик, Node Exporter и cAdvisor для сбора метрик серверов и контейнеров, Xray Checker для контроля хостов и NetBird для безопасной сети между серверами. Всё живёт на отдельном мониторинговом VPS: панель и ноды только отдают метрики изнутри сети NetBird, сборкой на каждом сервере занимается vmagent.

Гайд и дашборды подготовили два автора:

Гайд по мониторингу

Пошаговая инструкция и хранилище готовых дашбордов awesome-docs: от compose-файла до импорта в Grafana.

АвторpluralplayХранилищерепозиторий awesome-docsДашборд панелиот kastov

Системные дашборды

Пять дашбордов для наблюдения за серверами (Node, Network, Memory, Filesystem, CPU) и соавторство в гайде.

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

  • Victoria Metrics (VMetrics) сама собирает и хранит метрики со всех серверов, а vmagent доставляет их в VMetrics.

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

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

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

NetBird · WireGuard meshпанель + ноды + мониторинг — одна приватная сетьсервер панелиnode_exporter · :9100cAdvisor · :9101панель · :3001сервер нодыnode_exporter · :9100cAdvisor · :9101vmagentvmagentremote_writeмониторинговый VPSVictoria Metricsvmsingle · :8428Xray Checker:2112 · подпискаGrafana:3000 · дашбордыnginx · :443grafana.yourdomain.comбраузер · https

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

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

    root@server: ~
    curl -fsSL https://get.docker.com | sh
  2. Создаем директории для мониторинга:

    root@server: ~
    mkdir -p /opt/monitoring/{cadvisor,nodeexporter,nginx,vmagent/conf.d} && cd /opt/monitoring && nano docker-compose.yml

Конфигурация веб-сервера на выбор, вставьте свой вариант в docker-compose.yml:

docker-compose.yml
services:
vmsingle:
image: victoriametrics/victoria-metrics:v1.153.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:13.2.3
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:v1.3.1
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.30.5
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

Сертификаты подключаются томами в сервисе grafana-nginx, а сайт описывается в nginx.conf:

root@server: ~
nano /opt/monitoring/nginx/nginx.conf
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;
}
}

Запускаем docker-compose:

root@server: ~
docker compose up -d && docker compose logs -f -t
  1. Установка cadvisor, node_exporter, vmagent:

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

    root@server: ~
    nano /opt/monitoring/vmagent/scrape.yml

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

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

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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. Запускаем службы и добавляем их в автозагрузку:

    root@server: ~
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  10. Проверим статус служб:

    root@server: ~
    systemctl status cadvisor
    systemctl status nodeexporter
    systemctl status vmagent

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

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

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

    root@server: ~
    nano /opt/monitoring/vmagent/scrape.yml

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

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

    root@server: ~
    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:

    root@server: ~
    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 панели:

    root@server: ~
    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:

    root@server: ~
    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::

    root@server: ~
    cd /opt/remnawave && docker compose down && docker compose up -d && docker compose logs -f -t
  8. Создаем файл службы cadvisor:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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. Запускаем службы и добавляем их в автозагрузку:

    root@server: ~
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  12. Проверим статус служб:

    root@server: ~
    systemctl status cadvisor
    systemctl status nodeexporter
    systemctl status vmagent

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

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

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

    root@server: ~
    nano /opt/monitoring/vmagent/scrape.yml

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

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

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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:

    root@server: ~
    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. Запускаем службы и добавляем их в автозагрузку:

    root@server: ~
    systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent
  9. Проверим статус служб:

    root@server: ~
    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, шаблон будет загружен