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

Мониторинг через Prometheus и Grafana

Автор: OMchik33
Полная инструкция по настройке мониторинга панели Remnawave с помощью Prometheus, Grafana и Node Exporter, а также безопасного доступа к метрикам через SSH-туннель и Nginx.

Убедитесь, что в 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'
  1. Генерация ключа, пароль не задаем:

    Окно терминала
    ssh-keygen -t ed25519 -f ~/.ssh/remna_tunnel_key
  2. Добавление публичного ключа на сервере с 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
  3. Установка autossh (продолжаем на мониторинговом сервере):

    Окно терминала
    sudo apt install autossh
  4. Создание systemd-сервиса /etc/systemd/system/remna-tunnel.service. Замените remnauser@REMNA_SERVER_IP, это ssh логин и адрес сервера панели Remnawave.

    [Unit]
    Description=SSH tunnel to Remnawave for Prometheus and Node Exporter
    After=network.target
    [Service]
    User=root
    Environment="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_IP
    Restart=always
    [Install]
    WantedBy=multi-user.target
  5. На первом сервере (где запускается autossh) важно добавить ключ второго сервера в known_hosts, где 12.345.678.91 - IP адрес панели Remnawave, чтобы избежать ошибки проверки подлинности хоста, иначе служба просто не будет подключаться к серверу с панелью.

    Окно терминала
    ssh-keyscan -H 12.345.678.91 >> ~/.ssh/known_hosts
  6. Запуск сервиса:

    Окно терминала
    sudo systemctl daemon-reexec
    sudo systemctl enable remna-tunnel
    sudo systemctl start remna-tunnel
  7. Проверка успешности запуска:

    Окно терминала
    sudo systemctl status remna-tunnel

Теперь метрики Remnawave и Node Exporter доступны по http://localhost:9001/metrics и http://localhost:9002/metrics на мониторинговом сервере.

  1. Создание директорий:

    Окно терминала
    mkdir -p /opt/monitoring/{grafana,prometheus}
  2. Создание файл /opt/monitoring/docker-compose.yml

    services:
    prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    - prometheus-data:/prometheus
    command:
    - '--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: host
    grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    volumes:
    - grafana-data:/var/lib/grafana
    - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
    - 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=false
    network_mode: host
    xray-checker:
    image: kutovoys/xray-checker
    environment:
    - "SUBSCRIPTION_URL=https://podpiska.mydomain.com/6f5g46df46g45f54"
    - "PROXY_STATUS_CHECK_URL=http://google.com/generate_204"
    - "PROXY_CHECK_INTERVAL=60"
    network_mode: host
    volumes:
    prometheus-data:
    grafana-data:

Здесь sub.mydomain.com - адрес домена, прикрепленного к мониторинговому VPS, на котором устанавливаются Grafana и Prometheus

https://podpiska.mydomain.com/6f5g46df46g45f54 - подписка, сделайте отдельного пользователя для этой роли.

  1. Файл /opt/monitoring/prometheus/prometheus.yml. username и password из .env файла Remnawave (секция ### PROMETHEUS ###)

    global:
    scrape_interval: 15s
    scrape_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
  2. Запуск всех контейнеров:

    Окно терминала
    cd /opt/monitoring && docker compose up -d
  1. Установка nginx (локальная установка, не в контейнере Docker):

    Окно терминала
    apt install nginx
  2. Получение SSL-сертификатов, домен 3 уровня уже должен быть настроен на IP адрес мониторингового сервера:

    Окно терминала
    sudo apt install certbot python3-certbot-nginx
    sudo certbot --nginx -d sub.mydomain.com
  3. Добавляем автообновление сертификатов в crontab:

    Окно терминала
    0 5 * * * root certbot renew --quiet
  4. Настройка конфига nginx

    Окно терминала
    nano /etc/nginx/sites-available/default
Пример конфигурации nginx
# Проверка по cookie
map $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 редирект на HTTPS
server {
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

  1. Редактируем /etc/nginx/nginx.conf, добавляем туда:

    # Карта для WebSocket соединений Grafana
    map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
    }
  2. Применение конфигурации 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/*;
}
  1. Установка на сервер с Remnawave:

    Окно терминала
    . <(wget -qO- https://raw.githubusercontent.com/g7AzaZLO/NodeExporter-autoinstaller/main/NodeExporter-auto-install.sh)
  2. Можно установить на другие ноды и добавить в 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-туннели по аналогии с данной инструкцией.

  • Перейдите: https://sub.mydomain.com/grafana
  • Вход: admin / admin, затем смените пароль
  • Добавьте источник данных: Prometheus
    • URL: http://localhost:9090
  • Перейдите в Explore → Metrics → Grafana Drilldown → Metrics

После всех манипуляций мы добавили в Grafana новый источник данных - Prometheus. Теперь необходимо самостоятельно создать новый Dashboard, добавляя в него необходимые визуализации и подключая к ним нужные источники данных из Prometheus

Проверка работоспособности источников данных (метрик) в Prometheus

Заголовок раздела «Проверка работоспособности источников данных (метрик) в Prometheus»
  1. Зайдите по ссылке https://sub.mydomain.com/prometheus/graph?fd4gd54fg2dfg4241=1

  2. Откройте меню Status - Target Health и убедитесь, что напротив каждого источника данных стоит UP.

  3. Открыть Prometheus https://sub.mydomain.com/prometheus/graph?fd4gd54fg2dfg4241=1

  4. Открыть Grafana https://sub.mydomain.com/grafana/

  5. Открыть xray checker https://sub.mydomain.com/checker/?fd4gd54fg2dfg4241=1