Долгое время мой «мониторинг» выглядел так: зайти по 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, а не от пользователей.