Перейти к содержанию

Сервер DOWN в Grafana

Grafana показывает VPN-сервер в статусе DOWN или срабатывает алерт «VPN Server Down». Важно сначала понять — сервер реально упал или это ложная тревога из-за node_exporter/мониторинга.


Симптомы

  • Алерт в Telegram от Grafana: VPN Server Down — SERVER_NAME (SERVER_IP)
  • На дашборде «VPN Servers» статус DOWN (красный)
  • Метрика up{job="vpn-servers"} = 0 для данного сервера
  • В отчётах: онлайн-сессии на сервере резко упали до 0

Диагностика — отличить DOWN от UNREACHABLE

Различать важно: сервер может быть физически жив, но node_exporter или Prometheus scrape сломан.

1. Проверить TCP-доступность VPN-порта

# С backend сервера (10.99.87.249), который является точкой сбора метрик
./scripts/ssh-internal.sh 10.99.87.249 \
  "timeout 5 nc -zv SERVER_IP VPN_PORT && echo OPEN || echo CLOSED"

Если VPN-порт открыт — xray жив, проблема в мониторинге, не в VPN.

2. Проверить node_exporter (порт 9100)

./scripts/ssh-internal.sh 10.99.87.249 \
  "curl -s --connect-timeout 5 http://SERVER_IP:9100/metrics | head -5"
  • Ответ с метриками → node_exporter жив, проблема в Prometheus / Grafana datasource
  • Connection refused / timeout → node_exporter не работает или firewall закрыл 9100

3. SSH на сервер

./scripts/ssh-internal.sh SERVER_IP "uptime && docker ps | grep xray"
Результат Статус
Uptime получен, xray running Сервер жив, проблема в мониторинге
Uptime получен, xray exited xray упал — нужен restart
SSH timeout Сервер недоступен — P1 инцидент

4. Проверить docker ps на сервере (node_exporter)

./scripts/ssh-internal.sh SERVER_IP "docker ps | grep -E 'node.exporter|nginx'"

node_exporter на VPN-серверах развёрнут через Docker + nginx с basic auth (порт 9100).

5. Prometheus target status

Открыть Grafana → Connections → Data sources → Prometheus → Explore:

up{job="vpn-servers", instance="SERVER_IP:9100"}

Если up = 0 при живом node_exporter — проблема в Prometheus scrape (сеть, auth, таймаут).


Различие статусов

Статус Значение Действие
DOWN Prometheus не получает метрики от node_exporter Проверить node_exporter и сеть до 9100
UNREACHABLE VPN-порт недоступен (xray не слушает) Проверить xray, перезапустить
DEGRADED Высокое время отклика / частичные ошибки Проверить нагрузку, логи xray

Исправление

node_exporter не работает — перезапустить

./scripts/ssh-internal.sh SERVER_IP "docker restart node-exporter && sleep 3 && docker ps | grep node"

nginx (ssl-прокси для node_exporter) упал

./scripts/ssh-internal.sh SERVER_IP "systemctl restart nginx && systemctl status nginx"

xray упал — перезапустить

./scripts/ssh-internal.sh SERVER_IP "docker restart xray && sleep 5 && ss -tlnp | grep xray"

Firewall закрыл порт 9100

./scripts/ssh-internal.sh SERVER_IP "ufw allow 9100/tcp && ufw reload"

Порт 9100 и basic auth

node_exporter слушает через nginx с basic auth. Prometheus scrape config должен содержать credentials. Если nginx перезапустился с новым конфигом без auth — scrape начнёт получать 401.

Проверить после исправления

# Подождать 1-2 минуты (интервал scrape Prometheus)
./scripts/ssh-internal.sh 10.99.87.249 \
  "curl -s http://SERVER_IP:9100/metrics | grep '^node_load1'"

Ложные алерты (false positive)

Возможные причины:

  • Сервер перезагружался (плановое обслуживание хостера) — кратковременный DOWN до 5 мин
  • Prometheus scrape timeout из-за высокой нагрузки на сам Prometheus (10.99.87.5)
  • Grafana alerting rule с коротким for (срабатывает при одной пропущенной точке)

Если алерт пришёл и сразу прошёл (resolved через 2-3 мин) — вероятно false positive, сервер логировать не нужно.


Эскалация

  • P1: SSH на сервер недоступен + ping не идёт → открыть тикет у хостера
  • Провайдер каждого сервера: ansible/shiva-ansible/inventory/servers.ini → имя хоста (vpn-<провайдер>-<страна>-<номер>)
  • Множественные DOWN одновременно → возможна проблема с Prometheus, не с серверами

См. также: Мониторинг · VPN сервер не работает · DevOps скрипты → check_vpn_server · Инвентарь серверов