Долгое время мой «мониторинг» выглядел так: зайти по SSH, запустить htop, посмотреть что всё живо, выйти. Работало, пока серверов было два. Когда стало четыре — надоело.

Что хочу получить

Минимальный набор: CPU, RAM, диск, аптайм, количество HTTP-ошибок. Алерты — если сервер не отвечает или диск заполнен на 90%. Без лишней сложности.

Архитектура

[VPS-1: node_exporter] ──┐
[VPS-2: node_exporter] ──┼──▶ [VPS-мониторинг: Prometheus + Grafana]
[VPS-3: node_exporter] ──┘

node_exporter — лёгкий агент, собирает метрики системы. Prometheus — раз в 15 секунд ходит за ними. Grafana — рисует графики.

Установка node_exporter на каждом сервере

useradd --no-create-home --shell /bin/false node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-*.tar.gz
cp node_exporter-*/node_exporter /usr/local/bin/
chown node_exporter:node_exporter /usr/local/bin/node_exporter

Systemd-юнит:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter --web.listen-address=127.0.0.1:9100
Restart=always

[Install]
WantedBy=multi-user.target

Слушает только на localhost — снаружи не достучаться. Prometheus забирает метрики через SSH-туннель или WireGuard.

Prometheus

На сервере мониторинга:

global:
  scrape_interval: 30s

scrape_configs:
  - job_name: 'vps1'
    static_configs:
      - targets: ['10.0.0.1:9100']
        labels:
          instance: 'vps-production'

  - job_name: 'vps2'
    static_configs:
      - targets: ['10.0.0.2:9100']
        labels:
          instance: 'vps-staging'

30 секунд — достаточно для моих задач. Дефолтные 15 секунд генерируют больше данных, чем мне нужно.

Grafana

Стандартный дашборд Node Exporter Full (ID: 1860) покрывает 95% потребностей. Импортируешь его, указываешь Prometheus как datasource — и через минуту видишь красивые графики.

Из кастомного — добавил панель с rate(node_disk_written_bytes_total[5m]), потому что на одном из серверов SSD деградировал, и я хотел следить за нагрузкой на диск.

Алерты

Минимальный набор правил для Alertmanager:

groups:
  - name: basic
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1
        for: 5m
        labels:
          severity: warning

      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
        for: 10m
        labels:
          severity: warning

Алерты шлю в Telegram через бот. Настройка Alertmanager с Telegram — тема для отдельного поста.

Потребление ресурсов

node_exporter:  ~12 MB RAM, CPU незаметен
Prometheus:     ~150-200 MB RAM (зависит от количества метрик)
Grafana:        ~80-100 MB RAM

На VPS с 1 GB ставить Prometheus + Grafana тесновато, лучше выделить под мониторинг отдельную машину или использовать Oracle Free Tier.

Теперь, когда что-то ломается, я узнаю об этом из Telegram, а не от пользователей.