Блог
DevOps · мониторингDevOps 8 мин чтения

Мониторинг VPS: node_exporter + Prometheus + Grafana за 15 минут

Установка node_exporter на боевой VPS, приём метрик на management-VPS с Prometheus, готовые Grafana-дашборды. Минимум конфигов, максимум готовых чарт.

Мониторить VPS обязательно. Без метрик выявление проблем — гадание по чайной гуще. Ниже — минимальная схема: node_exporter на каждой ноде + Prometheus + Grafana на управляющей ноде. За 15 минут работы.

Архитектура

3 компонента.

  • node_exporter — на каждой боевой ноде. Отдаёт метрики (CPU, RAM, диск, сеть) на порту 9100.
  • Prometheus — на management-ноде. Опрашивает node_exporter'ы каждые 15 сек, хранит TSDB.
  • Grafana — на management-ноде. Строит графики из Prometheus.

Установка node_exporter на боевую ноду

Официальный бинарник + systemd unit.

# скачиваем актуальную версию (2026)
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.0/node_exporter-1.9.0.linux-amd64.tar.gz
tar xzf node_exporter-*.tar.gz
sudo mv node_exporter-*/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter

# systemd unit
sudo tee /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=127.0.0.1:9100

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl http://127.0.0.1:9100/metrics | head -20   # видим метрики
На заметку

Слушаем только 127.0.0.1 — снаружи метрики не публикуем. Prometheus заберёт через SSH-tunnel или WireGuard.

Prometheus на management-ноде

Через docker-compose (быстрее apt).

# /opt/monitoring/docker-compose.yml
services:
  prometheus:
    image: prom/prometheus:v3.0.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prom-data:/prometheus
    ports:
      - "127.0.0.1:9090:9090"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:11.4.0
    environment:
      GF_SECURITY_ADMIN_PASSWORD: change_me_strong
    volumes:
      - grafana-data:/var/lib/grafana
    ports:
      - "127.0.0.1:3000:3000"
    restart: unless-stopped

volumes:
  prom-data:
  grafana-data:

prometheus.yml — targets

Указываем, кого опрашивать.

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: nodes
    static_configs:
      - targets:
          - "10.100.0.10:9100"   # боевая нода 1 (по WireGuard)
          - "10.100.0.11:9100"   # боевая нода 2
        labels:
          env: production

Grafana: готовый дашборд

Grafana → Dashboards → Import → ID: 1860 (Node Exporter Full). Один клик — 30+ панелей: CPU, RAM, диск, сеть, IO. Универсальный старт.

Что мониторить обязательно

Метрики + алерты.

  • CPU load > 80 % 5 мин → warning.
  • RAM used > 90 % → critical (запаса нет).
  • Disk used > 85 % → warning, > 95 % → critical.
  • Disk IO wait > 30 % → warning (диск не справляется).
  • Sysem load average / cores > 2.0 → warning.
  • Network errors / sec > 10 → warning.

Частые вопросы

Опрос метрик даёт нагрузку?
node_exporter — ~5 МБ RAM, < 0.1 % CPU. Prometheus scrape 15 сек — незаметно.
Сколько дисковой памяти под TSDB?
Для 5 нод + retention 30 дней — ~5 ГБ. Регулировать через `--storage.tsdb.retention.time=30d`.
Managed-мониторинг вместо своего?
Grafana Cloud, Datadog, New Relic — от €10/мес за 5 нод. Свой стек — 0 доп-цен, но час-два настройки. Свой выигрывает для < 20 нод.