Мониторинг Debian-сервера: Prometheus, node_exporter, Grafana за одно утро
Семёнов Евгений Сергеевич, директор АйТи Фреш. Любой новый сервер без мониторинга — это тикающая бомба. Упадёт ли там диск, разберётся ли OOM-киллер с процессом, съест ли кто-то весь swap — узнаете, только когда пользователи начнут звонить. У нас на практике на любой Debian-сервер за первый же день ставится стек Prometheus + node_exporter + Grafana + Alertmanager — с Telegram-уведомлениями и парой готовых дашбордов. Расскажу, как это делается.
Архитектура стека
| Компонент | Роль | Порт |
|---|---|---|
| node_exporter | Агент на каждом сервере — отдаёт метрики | 9100 |
| Prometheus | Сервер — собирает, хранит, умеет PromQL | 9090 |
| Grafana | Визуализация — дашборды и алерты | 3000 |
| Alertmanager | Маршрутизация алертов (Telegram/email) | 9093 |
| blackbox_exporter | Внешние probe (HTTP, ICMP, TCP) | 9115 |
Все компоненты ставятся из стандартных репозиториев Debian 12 — никакой экзотики.
Установка node_exporter на всех серверах
# На каждом сервере, который хотите мониторить
apt update
apt install -y prometheus-node-exporter
systemctl enable --now prometheus-node-exporter
ss -lntup | grep 9100
# Метрики: curl http://localhost:9100/metrics | head
Рекомендую закрыть порт 9100 от внешнего мира: либо через iptables/nftables, либо слушать только на внутреннем интерфейсе (директива --web.listen-address=10.0.0.5:9100).
Установка сервера Prometheus
# Отдельный сервер мониторинга
apt install -y prometheus prometheus-alertmanager
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- "/etc/prometheus/rules.d/*.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets:
- web01.corp.example.ru:9100
- web02.corp.example.ru:9100
- db01.corp.example.ru:9100
- backup.corp.example.ru:9100
labels:
env: production
- job_name: 'blackbox-http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://corp.example.ru
- https://mail.corp.example.ru
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115
systemctl restart prometheus
systemctl restart prometheus-alertmanager
Правила алертов
# /etc/prometheus/rules.d/node.yml
groups:
- name: node_health
interval: 30s
rules:
- alert: NodeDown
expr: up{job="node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Сервер {{ $labels.instance }} недоступен"
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|squashfs"} / node_filesystem_size_bytes{fstype!~"tmpfs|squashfs"}) < 0.1
for: 10m
labels:
severity: warning
annotations:
summary: "На {{ $labels.instance }} диск {{ $labels.mountpoint }} меньше 10%"
- alert: HighCPU
expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 15m
labels:
severity: warning
annotations:
summary: "CPU {{ $labels.instance }} > 90% более 15 минут"
- alert: MemoryLow
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.1
for: 10m
labels:
severity: warning
annotations:
summary: "RAM {{ $labels.instance }} меньше 10% свободно"
- alert: RaidDegraded
expr: node_md_disks_required - node_md_disks{state="active"} > 0
for: 5m
labels:
severity: critical
annotations:
summary: "RAID на {{ $labels.instance }} деградирован"
promtool check rules /etc/prometheus/rules.d/*.yml
systemctl reload prometheus
Alertmanager с Telegram
# /etc/prometheus/alertmanager.yml
route:
receiver: 'telegram'
group_by: [alertname, instance]
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
routes:
- receiver: 'telegram-critical'
match:
severity: critical
repeat_interval: 30m
receivers:
- name: 'telegram'
webhook_configs:
- url: 'http://localhost:8080/alert/warn'
- name: 'telegram-critical'
webhook_configs:
- url: 'http://localhost:8080/alert/crit'
# Проверка и перезапуск
amtool check-config /etc/prometheus/alertmanager.yml
systemctl restart prometheus-alertmanager
Промежуточный webhook-сервис: минимальный Go-бот alertmanager-telegram или свой. Структура POST-а от Alertmanager — JSON, шлём в Bot API.
Grafana и дашборды
# Репозиторий Grafana
apt install -y apt-transport-https software-properties-common
wget -q -O - https://apt.grafana.com/gpg.key | apt-key add -
echo "deb https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list
apt update
apt install -y grafana
systemctl enable --now grafana-server
# http://сервер:3000 admin/admin
После входа:
- Configuration → Data sources → Add → Prometheus → http://localhost:9090 → Save&Test.
- Dashboards → Import → ID 1860 (Node Exporter Full) — готовый дашборд с десятками панелей.
- Dashboards → Import → ID 7587 (Blackbox) — для внешних probe.
- Alerts → Contact points → добавляем Telegram/email для критичных.
Reinforce mit blackbox_exporter
apt install -y prometheus-blackbox-exporter
# /etc/prometheus/blackbox.yml (обычно работает из коробки)
# Перезапуск: systemctl restart prometheus-blackbox-exporter
# Проверка
curl 'http://localhost:9115/probe?target=https://corp.example.ru&module=http_2xx'
blackbox_exporter умеет HTTP(S), ICMP, TCP, DNS, SSH-probe. Настроил — забыл. Я всегда добавляю 10-15 target-ов: главные сайты клиента, почтовый порт 25, RDP 3389, DNS-серверы.
Service discovery для большого парка
При 50+ хостах ручное прописывание IP в static_configs превращается в ад. Варианты:
- file_sd_configs — JSON-файл, генерируемый Ansible/Terraform.
- consul_sd_configs — динамическая регистрация через Consul.
- dns_sd_configs — SRV-записи в DNS.
scrape_configs:
- job_name: 'node'
file_sd_configs:
- files:
- /etc/prometheus/targets/node-*.json
refresh_interval: 30s
# /etc/prometheus/targets/node-prod.json
[
{
"targets": ["web01:9100", "web02:9100"],
"labels": {"env": "production", "role": "web"}
},
{
"targets": ["db01:9100"],
"labels": {"env": "production", "role": "db"}
}
]
Реальный кейс: мониторинг на 60 серверов за один день
В марте 2025 клиент — торговая компания в ЮВАО Москвы. 60 серверов на Debian и Ubuntu, старый мониторинг на Cacti/Nagios, дыры в охвате, админы не доверяют алертам (много false positive). Задача: за один рабочий день заменить на современный стек с единой панелью и Telegram-алертами.
План был такой: утром раскатить node_exporter через Ansible-плейбук (30 минут на 60 серверов), до обеда поднять Prometheus + Alertmanager + Grafana в нашем дата-центре МТС Москва на виртуалке Dell Xeon Platinum 8280, после обеда — дашборды, правила, Telegram-бот.
К 18:30 всё работало. За первые сутки эксплуатации — два реальных алерта: забитый /var на одном сервере (96%) и деградация RAID на файлохранилище (один диск выпал неделей раньше, в старом мониторинге не ловилось). Стоимость работ — 34 000 руб.
Лучшие практики из многолетнего опыта
- Метки env/role/team на job — без них PromQL-запросы становятся нечитаемыми.
- Alert fatigue — главный враг. Начинайте с 10-15 правил, не с 150. Добавляйте по мере нужды.
- Retention = 15 дней в Prometheus + remote_write в Victoria Metrics на год.
- Grafana с Git-провижинингом дашбордов — дашборды в репо, не в БД.
- Отдельный сервер мониторинга, не совмещённый с прод-приложениями.
- Бэкап: /etc/prometheus, /var/lib/prometheus (или только snapshot), /var/lib/grafana.
- HTTPS и auth для Grafana с первого дня — не откладывайте на потом.
Поставим мониторинг Debian-серверов за один день
Prometheus + Grafana + Alertmanager + Telegram на любой парк от 5 до 500 серверов. Инфраструктура АйТи Фреш — 8 серверов Dell Xeon Platinum 8280 с 40G Mellanox в дата-центре МТС Москва — позволяет хостить ваш мониторинг у нас с резервом по ресурсам. Проект от 22 000 руб., сопровождение от 8 000 руб./мес.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — вопросы о мониторинге Debian
- На каком Debian работает стек?
- Debian 11/12 и Ubuntu 20.04+. Пакеты доступны в apt или через официальные репозитории.
- Сколько ресурсов нужно Prometheus-серверу?
- На 50-100 хостов — 2 vCPU, 4 ГБ RAM, 100 ГБ SSD. Рост хранилища ~1-2 ГБ/мес на 100 метрик.
- Prometheus подходит для долгосрочного хранения?
- Стандартно 15 дней. Для годов — Victoria Metrics, Thanos или Mimir через remote_write.
- Как передавать алерты в Telegram?
- Через Alertmanager webhook_configs и промежуточный бот-прокси (alertmanager-telegram-bot).
- Что лучше для Debian: Prometheus или Checkmk/Zabbix?
- Зависит от задач. Для простого инфраструктурного — Checkmk. Для приложений и кастомных метрик — Prometheus.