Связка 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 Full | 1860 | Всё о сервере: CPU, RAM, диски, сеть, load average — главный дашборд для VPS |
| Node Exporter Server Metrics | 405 | Компактная сводка по нескольким серверам |
| Prometheus 2.0 Overview | 3662 | Здоровье самого 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.