· 15 мин чтения

Мониторинг Debian-сервера: Prometheus, node_exporter, Grafana за одно утро

Семёнов Евгений Сергеевич, директор АйТи Фреш. Любой новый сервер без мониторинга — это тикающая бомба. Упадёт ли там диск, разберётся ли OOM-киллер с процессом, съест ли кто-то весь swap — узнаете, только когда пользователи начнут звонить. У нас на практике на любой Debian-сервер за первый же день ставится стек Prometheus + node_exporter + Grafana + Alertmanager — с Telegram-уведомлениями и парой готовых дашбордов. Расскажу, как это делается.

Архитектура стека

КомпонентРольПорт
node_exporterАгент на каждом сервере — отдаёт метрики9100
PrometheusСервер — собирает, хранит, умеет PromQL9090
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

После входа:

  1. Configuration → Data sources → Add → Prometheus → http://localhost:9090 → Save&Test.
  2. Dashboards → Import → ID 1860 (Node Exporter Full) — готовый дашборд с десятками панелей.
  3. Dashboards → Import → ID 7587 (Blackbox) — для внешних probe.
  4. 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 превращается в ад. Варианты:

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 руб.

Лучшие практики из многолетнего опыта

Поставим мониторинг 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.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.