Мониторинг через 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.
Cхема работы
Заголовок раздела «Cхема работы»Конфигурация вашего сервера с Grafana и Victoria Metrics
Заголовок раздела «Конфигурация вашего сервера с Grafana и Victoria Metrics»-
Установка Docker:
Окно терминала curl -fsSL https://get.docker.com | sh -
Создаем директории и
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.0container_name: vmsinglehostname: vmsinglerestart: unless-stoppedvolumes:- ./victoria-metrics-data:/victoria-metrics-datacommand:- '--storageDataPath=/victoria-metrics-data'networks:- grafana-networkports:- IP:8428:8428 # Тут указываем адрес NetBird (в данном случае сервера Grafana)grafana:image: grafana/grafana:12.2.0-17027759091container_name: grafanahostname: grafanarestart: unless-stoppedvolumes:- grafana-data:/var/lib/grafana- ./grafana/provisioning:/etc/grafana/provisioningenvironment:- 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=falsenetworks:- grafana-networkxray-checker:image: kutovoys/xray-checkercontainer_name: xray-checkerhostname: xraycheckerrestart: unless-stoppedenvironment:- "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:2112networks:- grafana-networkgrafana-nginx:image: nginx:1.28container_name: grafana-nginxvolumes:- ./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:rorestart: unless-stoppedports:- 443:443networks:- grafana-networkvolumes:grafana-data:networks:grafana-network:name: grafana-networkdriver: bridgeexternal: false -
Создаём
nginx.conf
:Окно терминала 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
Окно терминала docker compose up -d && docker compose logs -f -t
Установка и настройка Grafana сервера
Заголовок раздела «Установка и настройка Grafana сервера»-
Установка 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 -
Создаем файл конфигурации vmagent:
Окно терминала nano /opt/monitoring/vmagent/scrape.ymlВставляем следующее содержимое:
scrape.yml scrape_config_files:- "/opt/monitoring/vmagent/conf.d/*.yml"global:scrape_interval: 15s -
Создаем файл конфигурации cadvisor:
Окно терминала nano /opt/monitoring/vmagent/conf.d/cadvisor.ymlВставляем следующее содержимое:
cadvisor.yml - job_name: integrations/cAdvisorscrape_interval: 15sstatic_configs:- targets: ['localhost:9101']labels:instance: "ваше_название_инстанса(сервера Grafana)" -
Создаем файл конфигурации node_exporter:
Окно терминала nano /opt/monitoring/vmagent/conf.d/nodeexporter.ymlВставляем следующее содержимое:
nodeexporter.yml - job_name: integrations/node_exporterscrape_interval: 15sstatic_configs:- targets: ['localhost:9100']labels:instance: "ваше_название_инстанса(сервера Grafana)" -
Создаем файл конфигурации xray checker:
Окно терминала nano /opt/monitoring/vmagent/conf.d/xraychecker.ymlВставляем следующее содержимое:
xraychecker.yml - job_name: xray_checkerscrape_interval: 15sstatic_configs:- targets: ['127.0.0.1:2112']labels:instance: "ваше_название_инстанса(сервера Grafana)" -
Создаем файл службы cadvisor:
Окно терминала nano /etc/systemd/system/cadvisor.serviceВставляем следующее содержимое:
cadvisor.service [Unit]Description=cAdvisorWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/cadvisor/cadvisor \-listen_ip=127.0.0.1 \-logtostderr \-port=9101 \-docker_only=trueRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы node_exporter:
Окно терминала nano /etc/systemd/system/nodeexporter.serviceВставляем следующее содержимое:
nodeexporter.service [Unit]Description=Node ExporterWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы vmagent:
Окно терминала nano /etc/systemd/system/vmagent.serviceВставляем следующее содержимое:
vmagent.service [Unit]Description=VictoriaMetrics AgentWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/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/writeRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Запускаем службы и добавляем их в автозагрузку:
Окно терминала systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent -
Проверим статус служб:
Окно терминала systemctl status cadvisorsystemctl status nodeexportersystemctl status vmagent
Установка и настройка сервера c панелью Remnawave
Заголовок раздела «Установка и настройка сервера c панелью Remnawave»-
Создаем директории и устанавливаем 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 -
Создаем файл конфигурации vmagent:
Окно терминала nano /opt/monitoring/vmagent/scrape.ymlВставляем следующее содержимое:
scrape.yml scrape_config_files:- "/opt/monitoring/vmagent/conf.d/*.yml"global:scrape_interval: 15s -
Создаем файл конфигурации cadvisor:
Окно терминала nano /opt/monitoring/vmagent/conf.d/cadvisor.ymlВставляем следующее содержимое:
cadvisor.yml - job_name: integrations/cAdvisorscrape_interval: 15sstatic_configs:- targets: ['localhost:9101']labels:instance: "ваше_название_инстанса(сервера Remnawave панели)" -
Создаем файл конфигурации node_exporter:
Окно терминала nano /opt/monitoring/vmagent/conf.d/nodeexporter.ymlВставляем следующее содержимое:
nodeexporter.yml - job_name: integrations/node_exporterscrape_interval: 15sstatic_configs:- targets: ['localhost:9100']labels:instance: "ваше_название_инстанса(сервера Remnawave панели)" -
Создаем файл конфигурации remnawave панели:
Окно терминала nano /opt/monitoring/vmagent/conf.d/remnawave.ymlВставляем следующее содержимое:
Пример
.env ### PROMETHEUS ###### Metrics are available at /api/metricsMETRICS_USER=gjlToiPHMETRICS_PASS=VsCNutHFremnawave.yml - job_name: remnawavescrape_interval: 15sstatic_configs:- targets: ['127.0.0.1:3001']labels:instance: "ваше_название_инстанса(сервера Remnawave панели)"basic_auth:username: "xxxxxxx"password: "xxxxxxx" -
Прокидываем порт метрики в
docker-compose.yml
:Окно терминала nano /opt/remnawave/docker-compose.ymlНаходим следующее содержимое и добавляем:
docker-compose.yml remnawave:image: remnawave/backend:latestcontainer_name: remnawavehostname: remnawaverestart: alwaysenv_file:- .envports:- '127.0.0.1:3000:3000'- '127.0.0.1:3001:3001' # Порт метрикиnetworks:- remnawave-networkdepends_on:remnawave-db:condition: service_healthyremnawave-redis:condition: service_healthylogging:driver: 'json-file'options:max-size: '30m'max-file: '5' -
Перезапускаем docker-compose::
Окно терминала cd /opt/remnawave && docker compose down && docker compose up -d && docker compose logs -f -t -
Создаем файл службы cadvisor:
Окно терминала nano /etc/systemd/system/cadvisor.serviceВставляем следующее содержимое:
cadvisor.service [Unit]Description=cAdvisorWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/cadvisor/cadvisor \-listen_ip=127.0.0.1 \-logtostderr \-port=9101 \-docker_only=trueRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы node_exporter:
Окно терминала nano /etc/systemd/system/nodeexporter.serviceВставляем следующее содержимое:
nodeexporter.service [Unit]Description=Node ExporterWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы vmagent:
Окно терминала nano /etc/systemd/system/vmagent.serviceВставляем следующее содержимое:
vmagent.service [Unit]Description=VictoriaMetrics AgentWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/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/writeRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Запускаем службы и добавляем их в автозагрузку:
Окно терминала systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent -
Проверим статус служб:
Окно терминала systemctl status cadvisorsystemctl status nodeexportersystemctl status vmagent
Установка и настройка сервера c нодой Remnawave
Заголовок раздела «Установка и настройка сервера c нодой Remnawave»-
Создаем директории и устанавливаем 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 -
Создаем файл конфигурации vmagent:
Окно терминала nano /opt/monitoring/vmagent/scrape.ymlВставляем следующее содержимое:
scrape.yml scrape_config_files:- "/opt/monitoring/vmagent/conf.d/*.yml"global:scrape_interval: 15s -
Создаем файл конфигурации cadvisor:
Окно терминала nano /opt/monitoring/vmagent/conf.d/cadvisor.ymlВставляем следующее содержимое:
cadvisor.yml - job_name: integrations/cAdvisorscrape_interval: 15sstatic_configs:- targets: ['localhost:9101']labels:instance: "ваше_название_инстанса(сервера Remnawave ноды)" -
Создаем файл конфигурации node_exporter:
Окно терминала nano /opt/monitoring/vmagent/conf.d/nodeexporter.ymlВставляем следующее содержимое:
nodeexporter.yml - job_name: integrations/node_exporterscrape_interval: 15sstatic_configs:- targets: ['localhost:9100']labels:instance: "ваше_название_инстанса(сервера Remnawave ноды)" -
Создаем файл службы cadvisor:
Окно терминала nano /etc/systemd/system/cadvisor.serviceВставляем следующее содержимое:
cadvisor.service [Unit]Description=cAdvisorWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/cadvisor/cadvisor \-listen_ip=127.0.0.1 \-logtostderr \-port=9101 \-docker_only=trueRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы node_exporter:
Окно терминала nano /etc/systemd/system/nodeexporter.serviceВставляем следующее содержимое:
nodeexporter.service [Unit]Description=Node ExporterWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/opt/monitoring/nodeexporter/node_exporter --web.listen-address=127.0.0.1:9100Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Создаем файл службы vmagent:
Окно терминала nano /etc/systemd/system/vmagent.serviceВставляем следующее содержимое:
vmagent.service [Unit]Description=VictoriaMetrics AgentWants=network-online.targetAfter=network-online.target[Service]User=rootGroup=rootType=simpleExecStart=/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/writeRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target -
Запускаем службы и добавляем их в автозагрузку:
Окно терминала systemctl daemon-reload && systemctl enable cadvisor nodeexporter vmagent && systemctl start cadvisor nodeexporter vmagent -
Проверим статус служб:
Окно терминала systemctl status cadvisorsystemctl status nodeexportersystemctl status vmagent
Настройка Grafana Dashboards
Заголовок раздела «Настройка Grafana Dashboards»-
Заходим в Grafana по адресу, который вы указали в
nginx.conf
Пример Grafana URL https://grafana.yourdomain.com/grafana -
Нас встречает страница авторизации, вводим
admin
иadmin
, затем меняем пароль -
Попадаем в главное меню Grafana
-
Переходим в раздел Connections —> Data Sources
-
Нажимаем кнопку Add data source и выбираем prometheus
-
В секции Connection в поле
URL
вводимhttp://vmsingle:8428
-
Нажимаем в самом низу страницы кнопку Save & Test и проверяем, что подключение установлено
Добавление новых Dashboard
Заголовок раздела «Добавление новых Dashboard»Список Dashboard:
- Remnawave Dashboard от kastov
- cAdvisor Dashboard от grafana official
- Node Overview от Kutovoys
- Network System от Kutovoys
- Memory System от Kutovoys
- Filesystem Disks от Kutovoys
- CPU System от Kutovoys
-
Переходим в раздел Dashboards
-
Нажимаем справа вверху кнопку New и выбираем Import
-
Загружаем наш Dashboard
-
Где victoriametrics выбираем наш prometheus
-
Нажимаем кнопку Import данный шаблон будет загружен