Мониторинг через Prometheus и Grafana
Автор: OMchik33
Полная инструкция по настройке мониторинга панели Remnawave с помощью Prometheus, Grafana и Node Exporter, а также безопасного доступа к метрикам через SSH-туннель и Nginx.
📦 Настройка docker-compose.yml на сервере с Remnawave
Заголовок раздела «📦 Настройка docker-compose.yml на сервере с Remnawave»Убедитесь, что в docker-compose.yml Remnawave открыт порт 3001, по которому отдаются метрики:
ports: - '127.0.0.1:3001:3001'Пример конфигурации (вариант установки по скрипту eGames)
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'🔐 Настройка SSH-туннеля
Заголовок раздела «🔐 Настройка SSH-туннеля»-
Генерация ключа, пароль не задаем:
Окно терминала ssh-keygen -t ed25519 -f ~/.ssh/remna_tunnel_key -
Добавление публичного ключа на сервере с Remnawave, в файл
~/.ssh/authorized_keys. ВместоAAAAC3...вставьте содержимоеremna_tunnel_key.pub, начинающееся наAAAAC3:Окно терминала from="IP_мониторингового_сервера",no-pty,no-agent-forwarding,no-X11-forwarding,command="/bin/false" ssh-ed25519 AAAAC3... remna_tunnel_key -
Установка
autossh(продолжаем на мониторинговом сервере):Окно терминала sudo apt install autossh -
Создание systemd-сервиса
/etc/systemd/system/remna-tunnel.service. Заменитеremnauser@REMNA_SERVER_IP, это ssh логин и адрес сервера панели Remnawave.[Unit]Description=SSH tunnel to Remnawave for Prometheus and Node ExporterAfter=network.target[Service]User=rootEnvironment="AUTOSSH_GATETIME=0"ExecStart=/usr/bin/autossh -N \-o "ServerAliveInterval 60" \-o "ServerAliveCountMax 3" \-i /root/.ssh/remna_tunnel_key \-L 9001:localhost:3001 \-L 9002:localhost:9100 \remnauser@REMNA_SERVER_IPRestart=always[Install]WantedBy=multi-user.target -
На первом сервере (где запускается autossh) важно добавить ключ второго сервера в known_hosts, где 12.345.678.91 - IP адрес панели Remnawave, чтобы избежать ошибки проверки подлинности хоста, иначе служба просто не будет подключаться к серверу с панелью.
Окно терминала ssh-keyscan -H 12.345.678.91 >> ~/.ssh/known_hosts -
Запуск сервиса:
Окно терминала sudo systemctl daemon-reexecsudo systemctl enable remna-tunnelsudo systemctl start remna-tunnel -
Проверка успешности запуска:
Окно терминала sudo systemctl status remna-tunnel
Теперь метрики Remnawave и Node Exporter доступны по http://localhost:9001/metrics и http://localhost:9002/metrics на мониторинговом сервере.
📈 Установка Prometheus и Grafana
Заголовок раздела «📈 Установка Prometheus и Grafana»-
Создание директорий:
Окно терминала mkdir -p /opt/monitoring/{grafana,prometheus} -
Создание файл
/opt/monitoring/docker-compose.ymlservices:prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: unless-stoppedvolumes:- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml- prometheus-data:/prometheuscommand:- '--config.file=/etc/prometheus/prometheus.yml'- '--storage.tsdb.path=/prometheus'- '--web.console.libraries=/etc/prometheus/console_libraries'- '--web.console.templates=/etc/prometheus/consoles'- '--web.external-url=https://sub.mydomain.com/prometheus/'- '--web.route-prefix=/'network_mode: hostgrafana:image: grafana/grafana:latestcontainer_name: grafanarestart: unless-stoppedvolumes:- grafana-data:/var/lib/grafana- ./grafana/provisioning:/etc/grafana/provisioningenvironment:- GF_SERVER_DOMAIN=mydomain.com- GF_SERVER_ROOT_URL=https://sub.mydomain.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=falsenetwork_mode: hostxray-checker:image: kutovoys/xray-checkerenvironment:- "SUBSCRIPTION_URL=https://podpiska.mydomain.com/6f5g46df46g45f54"- "PROXY_STATUS_CHECK_URL=http://google.com/generate_204"- "PROXY_CHECK_INTERVAL=60"network_mode: hostvolumes:prometheus-data:grafana-data:
Здесь sub.mydomain.com - адрес домена, прикрепленного к мониторинговому VPS, на котором устанавливаются Grafana и Prometheus
https://podpiska.mydomain.com/6f5g46df46g45f54 - подписка, сделайте отдельного пользователя для этой роли.
⚙️ Конфигурация Prometheus
Заголовок раздела «⚙️ Конфигурация Prometheus»-
Файл
/opt/monitoring/prometheus/prometheus.yml.usernameиpasswordиз.envфайла Remnawave (секция### PROMETHEUS ###)global:scrape_interval: 15sscrape_configs:# Для корректной работы Grafana-дашбордов, которые указаны в ссылках ниже# используйте job_name: integrations/node_exporter.- job_name: 'node_exporter'static_configs:- targets: ['127.0.0.1:9002']labels:cluster: "test"instance: "127.0.0.1:9002"- job_name: 'remnawave_exporter'static_configs:- targets: ['127.0.0.1:9001']basic_auth:username: "XXXXXXXXXXXXXXX"password: "XXXXXXXXXXXXXXX"- job_name: "xray-checker"metrics_path: "/metrics"static_configs:- targets: ["localhost:2112"]scrape_interval: 1m -
Запуск всех контейнеров:
Окно терминала cd /opt/monitoring && docker compose up -d
🌐 Настройка Nginx и SSL
Заголовок раздела «🌐 Настройка Nginx и SSL»-
Установка nginx (локальная установка, не в контейнере Docker):
Окно терминала apt install nginx -
Получение SSL-сертификатов, домен 3 уровня уже должен быть настроен на IP адрес мониторингового сервера:
Окно терминала sudo apt install certbot python3-certbot-nginxsudo certbot --nginx -d sub.mydomain.com -
Добавляем автообновление сертификатов в crontab:
Окно терминала 0 5 * * * root certbot renew --quiet -
Настройка конфига nginx
Окно терминала nano /etc/nginx/sites-available/default
Пример конфигурации nginx
# Проверка по cookiemap $http_cookie $auth_cookie { default 0; "~*fd4gd54fg2dfg4241=1" 1;}
# Проверка по GET-параметруmap $arg_fd4gd54fg2dfg4241 $auth_query { default 0; "1" 1;}
# Общий флаг авторизацииmap "$auth_cookie$auth_query" $authorized { "~1" 1; default 0;}
# Установка куки, если есть параметрmap $arg_fd4gd54fg2dfg4241 $set_cookie_header { "1" "fd4gd54fg2dfg4241=1; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=31536000"; default "";}
# HTTP редирект на HTTPSserver { listen 80; server_name sub.mydomain.com; return 301 https://$server_name$request_uri;}
# HTTPS сервер блокserver { listen 443 ssl http2; server_name sub.mydomain.com;
# SSL конфигурация ssl_certificate /etc/letsencrypt/live/sub.mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sub.mydomain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
# Устанавливаем куку, если пользователь авторизуется по ссылке add_header Set-Cookie $set_cookie_header;
# Редирект с основного домена сразу на нужный открытый дашбоард в Графане location = / { return 301 /grafana/public-dashboards/f5g4df4g5df4gd5f4g63d4834379e; }
# Grafana конфигурация location /grafana { proxy_pass http://localhost: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; proxy_set_header X-Forwarded-Host $server_name;
# WebSocket поддержка proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
# Убираем Authorization header proxy_set_header Authorization ""; }
# Grafana Live WebSocket location /grafana/api/live/ { proxy_pass http://localhost:3000/api/live/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; 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; }
# Prometheus location /prometheus/ { if ($authorized = 0) { return 404; }
proxy_pass http://localhost:9090/; 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; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header Authorization ""; }
# Xray Checker location /checker/ { if ($authorized = 0) { return 404; }
proxy_pass http://localhost:2112/; 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; proxy_set_header X-Forwarded-Host $server_name; }}Здесь sub.mydomain.com - адрес домена, прикрепленного к тестовому VPS, на котором устанавливаются Графана и Прометей
fd4gd54fg2dfg4241 - уникальное куки значение, НУЖНО заменить на свое
/grafana/public-dashboards/f5g4df4g5df4gd5f4g63d4834379e; - уникальная ссылка на общедоступный Dashboard в Grafana. Вы получите его после выполнения всей инструкции и самостоятельной сборки нужного Dashboard. После этого сможете получить ссылку для внешнего подключения, вставить сюда и перезапустить nginx. Ссылка в конфиге nginx задается для того, чтобы пользователи при переходе по домену sub.mydomain.com сразу перенаправлялись на общедоступный Dashboard
-
Редактируем
/etc/nginx/nginx.conf, добавляем туда:# Карта для WebSocket соединений Grafanamap $http_upgrade $connection_upgrade {default upgrade;'' close;} -
Применение конфигурации nginx
nginx -t && systemctl restart nginx
Пример дефолтного nginx.conf с добавлением нужной map
Открыть пример
user www-data;worker_processes auto;pid /run/nginx.pid;error_log /var/log/nginx/error.log;include /etc/nginx/modules-enabled/*.conf;
events { worker_connections 768; # multi_accept on;}
http {
## # Basic Settings ##
sendfile on; tcp_nopush on; types_hash_max_size 2048; # server_tokens off;
# server_names_hash_bucket_size 64; # server_name_in_redirect off;
include /etc/nginx/mime.types; default_type application/octet-stream;
# Карта для WebSocket соединений Grafana map $http_upgrade $connection_upgrade { default upgrade; '' close; } ## # SSL Settings ##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on;
## # Logging Settings ##
access_log /var/log/nginx/access.log;
## # Gzip Settings ##
gzip on;
# gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/jav>
## # Virtual Host Configs ##
include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;}🧠 Node Exporter
Заголовок раздела «🧠 Node Exporter»-
Установка на сервер с Remnawave:
Окно терминала . <(wget -qO- https://raw.githubusercontent.com/g7AzaZLO/NodeExporter-autoinstaller/main/NodeExporter-auto-install.sh) -
Можно установить на другие ноды и добавить в
prometheus.yml:- job_name: 'external_nodes'static_configs:- targets: ['1.2.3.4:9100']
Node Exporter доступен на мониторинговом сервере по localhost:9002 (через SSH-туннель).
Здесь 1.2.3.4 - адрес очередной ноды, на которую мы также установили Node Exporter
Или использовать SSH-туннели по аналогии с данной инструкцией.
📊 Проверка и настройка Grafana
Заголовок раздела «📊 Проверка и настройка Grafana»Аутентифицкация в Grafana
Заголовок раздела «Аутентифицкация в Grafana»- Перейдите:
https://sub.mydomain.com/grafana - Вход:
admin / admin, затем смените пароль - Добавьте источник данных: Prometheus
- URL:
http://localhost:9090
- URL:
- Перейдите в Explore → Metrics → Grafana Drilldown → Metrics
После всех манипуляций мы добавили в Grafana новый источник данных - Prometheus. Теперь необходимо самостоятельно создать новый Dashboard, добавляя в него необходимые визуализации и подключая к ним нужные источники данных из Prometheus
Проверка работоспособности источников данных (метрик) в Prometheus
Заголовок раздела «Проверка работоспособности источников данных (метрик) в Prometheus»-
Зайдите по ссылке
https://sub.mydomain.com/prometheus/graph?fd4gd54fg2dfg4241=1 -
Откройте меню
Status-Target Healthи убедитесь, что напротив каждого источника данных стоитUP. -
Открыть Prometheus
https://sub.mydomain.com/prometheus/graph?fd4gd54fg2dfg4241=1 -
Открыть Grafana
https://sub.mydomain.com/grafana/ -
Открыть xray checker
https://sub.mydomain.com/checker/?fd4gd54fg2dfg4241=1