Grafana + Prometheus: мониторинг VPS с нуля

Администрирование
Grafana + Prometheus: мониторинг VPS с нуля

Связка Grafana + Prometheus — стандарт де-факто для мониторинга Linux-серверов: её используют и в стартапах с одним VPS, и в компаниях с сотнями нод. Prometheus собирает метрики (CPU, память, диск, сеть) через лёгкие экспортеры, а Grafana превращает их в наглядные дашборды и шлёт алерты, когда что-то идёт не так. В этой инструкции мы с нуля поднимем полноценный мониторинг VPS на Ubuntu 24.04: установим node_exporter и Prometheus, разберём prometheus.yml, подключим готовый дашборд Grafana и настроим уведомления. Всё займёт 30–40 минут, из софта — только open source.

Как устроена связка Prometheus + Grafana

Прежде чем копировать команды, полезно понять роли компонентов:

  • node_exporter — маленький демон на каждом наблюдаемом сервере. Отдаёт метрики ОС (загрузка CPU, память, диски, сеть) по HTTP на порту 9100 в текстовом формате.
  • Prometheus — база данных временных рядов. Раз в 15 секунд сам опрашивает экспортеры (pull-модель), сохраняет метрики и умеет считать по ним выражения на языке PromQL.
  • Grafana — веб-интерфейс. Подключается к Prometheus как к источнику данных, рисует графики и управляет алертами.

Плюс pull-модели: серверы ничего никуда не «пушат», достаточно открыть порт экспортера для сервера мониторинга. Один Prometheus легко обслуживает десятки VPS.

Для комфортной работы связки рядом с боевыми сервисами нужен запас по памяти. На тарифе Pro у Cheap-Host (750 ₽/мес, 12 vCPU, 16 ГБ RAM, 128 ГБ NVMe) мониторинг занимает меньше 5% ресурсов — NVMe здесь кстати, потому что Prometheus активно пишет на диск.

Шаг 1. Устанавливаем node_exporter

node_exporter ставим на каждый сервер, который хотим мониторить. Создаём системного пользователя и скачиваем бинарник (версию проверьте на странице релизов prometheus/node_exporter на GitHub):

sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
cd /tmp
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-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

Создаём systemd-службу /etc/systemd/system/node_exporter.service:

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

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Запускаем и проверяем:

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s http://localhost:9100/metrics | head

Если в ответ посыпались строки вида node_cpu_seconds_total — экспортер работает. Подробнее о создании собственных служб — в статье про systemd-службы.

Шаг 2. Устанавливаем Prometheus и настраиваем prometheus.yml

Prometheus ставим на сервер мониторинга (он может совпадать с наблюдаемым — для старта это нормально):

sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.53.1/prometheus-2.53.1.linux-amd64.tar.gz
tar xzf prometheus-2.53.1.linux-amd64.tar.gz
cd prometheus-2.53.1.linux-amd64
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Главный конфиг — /etc/prometheus/prometheus.yml. Минимальный рабочий вариант:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
      - targets: ["localhost:9100"]
        labels:
          instance: "vps-main"

Здесь два задания (job): Prometheus мониторит сам себя и опрашивает node_exporter. Чтобы добавить второй сервер, допишите его адрес в targets, например "203.0.113.10:9100". Проверить синтаксис можно командой promtool check config /etc/prometheus/prometheus.yml.

Служба /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --storage.tsdb.retention.time=30d

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus

Откройте http://IP-сервера:9090/targets (временно, с ограничением по файрволу) — оба таргета должны быть в состоянии UP.

Шаг 3. Устанавливаем Grafana

Grafana ставится из официального APT-репозитория:

sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl enable --now grafana-server

Веб-интерфейс доступен на порту 3000, логин и пароль по умолчанию — admin/admin (при первом входе система попросит сменить пароль). Дальше: Connections → Data sources → Add data source → Prometheus, в поле URL укажите http://localhost:9090 и нажмите Save & test.

Шаг 4. Готовые дашборды Grafana

Рисовать графики вручную не нужно — у Grafana есть каталог готовых дашбордов. Импорт: Dashboards → New → Import, вводите ID и выбираете источник данных Prometheus.

ДашбордIDЧто показывает
Node Exporter Full1860Всё о сервере: CPU, RAM, диски, сеть, load average — главный дашборд для VPS
Node Exporter Server Metrics405Компактная сводка по нескольким серверам
Prometheus 2.0 Overview3662Здоровье самого Prometheus

Начните с Node Exporter Full (ID 1860): после импорта вы сразу увидите загрузку процессора по ядрам, использование памяти без учёта кеша, задержки диска и трафик по интерфейсам. Если серверов несколько, переключение между ними — в выпадающем списке Instance.

Шаг 5. Настраиваем алерты

Мониторинг без алертов — просто красивые картинки. Самый быстрый путь — встроенный алертинг Grafana: Alerting → Alert rules → New alert rule. Типовые правила для VPS:

  • CPU выше 85% дольше 10 минут: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
  • Свободной памяти меньше 10%: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
  • Диск заполнен на 85%: 100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100) > 85
  • Сервер недоступен: up == 0 в течение 2 минут — самое важное правило.

Каналы доставки настраиваются в Alerting → Contact points: e-mail, Telegram (нужен токен бота и chat ID), webhook. Более простой вариант уведомлений без Prometheus мы разбирали в статье про мониторинг VPS с htop и netdata — но у Grafana алерты гибче: с задержками срабатывания, группировкой и расписанием тишины.

Безопасность: закрываем порты

Обязательный финальный штрих. Порты 9090 (Prometheus) и 9100 (node_exporter) не должны торчать в интернет — метрики раскрывают устройство сервера, а API Prometheus позволяет выполнять запросы. Через UFW:

sudo ufw allow 3000/tcp
sudo ufw deny 9090/tcp
sudo ufw deny 9100/tcp

Если node_exporter стоит на другом сервере, откройте 9100 только для IP сервера мониторинга: sudo ufw allow from 203.0.113.20 to any port 9100 proto tcp. Базовую настройку файрвола мы подробно разбирали в руководстве по UFW. Grafana для продакшена лучше спрятать за Nginx с бесплатным сертификатом Let's Encrypt.

Сколько ресурсов нужно и когда выносить мониторинг отдельно

Ориентиры по потреблению для связки с 1–5 наблюдаемыми серверами и шагом сбора 15 секунд:

  • Prometheus: 200–500 МБ RAM, 1–2 ГБ диска в месяц на сервер;
  • Grafana: 150–300 МБ RAM;
  • node_exporter: ~20 МБ RAM, нагрузка на CPU незаметна.

Пока сервер один, мониторинг живёт на нём же. Но у такой схемы есть слепая зона: если VPS упадёт целиком, алерт «сервер недоступен» отправлять будет некому. Поэтому, когда серверов становится два и больше, Prometheus и Grafana выносят на отдельную машину. Здесь не нужен мощный тариф: у Cheap-Host для выделенного сервера мониторинга хватит тарифа Start за 450 ₽/мес (6 vCPU, 8 ГБ RAM, 96 ГБ NVMe) — с KVM-виртуализацией ресурсы выделенные, и соседи по ноде не смажут графики. Сервер разворачивается за 45–60 секунд, так что весь стек мониторинга реально поднять за один вечер.

FAQ

Сколько ресурсов потребляет связка Grafana + Prometheus?

Для мониторинга 1–5 серверов достаточно 1–2 ГБ RAM и пары ядер: Prometheus с периодом сбора 15 секунд занимает 200–500 МБ памяти, Grafana — ещё 150–300 МБ. На VPS с 16 ГБ RAM мониторинг спокойно живёт рядом с основными сервисами.

Можно ли ставить Prometheus и Grafana на тот же сервер, который мониторишь?

Можно, для одного-двух серверов это нормальная практика. Минус: если сервер упадёт целиком, мониторинг упадёт вместе с ним и алерт не придёт. При росте инфраструктуры мониторинг выносят на отдельный недорогой VPS.

Чем Prometheus лучше netdata или Zabbix?

Netdata проще для одного сервера, но хранит меньше истории и хуже масштабируется. Zabbix мощный, но тяжелее в настройке и требует отдельной БД. Prometheus + Grafana — золотая середина: pull-модель, лёгкие экспортеры, язык запросов PromQL и огромная база готовых дашбордов.

Как долго Prometheus хранит метрики?

По умолчанию 15 дней, срок меняется флагом --storage.tsdb.retention.time (например, 90d). Один сервер со стандартным набором метрик занимает 1–2 ГБ за месяц, так что NVMe-диск даже начального тарифа выдержит длинную историю.

Нужно ли закрывать порты Prometheus и node_exporter от интернета?

Обязательно. Порты 9090 и 9100 закрывайте файрволом и открывайте только для IP сервера мониторинга. Наружу смотрит только Grafana (3000), в идеале — за Nginx с HTTPS.

Вывод

Grafana + Prometheus дают уровень наблюдаемости, который раньше был доступен только крупным компаниям: история метрик за месяцы, готовые дашборды и алерты в Telegram до того, как упавший сервис заметят посетители. Весь стек — открытый и бесплатный, а поднять его по этой инструкции можно за вечер. Если для мониторинга или основного проекта нужен сервер — у Cheap-Host тариф Pro за 750 ₽/мес (12 vCPU, 16 ГБ RAM, 128 ГБ NVMe): KVM, безлимитный трафик, выдача за минуту. Тарифы — на cheap-host.onl.

Читайте также