Полный гайд по настройке мониторинга сети и сервисов

Иван Корнев·03.05.2026·5 мин

Чтобы настроить сервер мониторинга интернета, используйте связку Prometheus (сбор метрик), Blackbox Exporter (проверка доступности сайтов и портов), Loki (хранение логов) и Grafana (визуализация). Для уведомлений подключите Alertmanager, который будет отправлять алерты в Telegram, Slack или на почту при падении сервисов или превышении времени отклика.

Эта статья поможет развернуть надежную систему контроля за 1–2 часа, избегая сложных корпоративных решений вроде Zabbix или Nagios, если вам нужен современный и легковесный стек.

Кому подойдет это решение:

  • Администраторам небольших и средних инфраструктур.
  • Разработчикам, желающим контролировать uptime своих проектов.
  • Компаниям, которым нужна прозрачная история доступности сервисов (SLA).

Выбор архитектуры и инструментов

Для эффективного контроля доступности, логирования и оповещений лучше всего подходит модульная архитектура. Монолитные системы часто избыточны и сложны в поддержке.

Рекомендуемый стек (Open Source):

  1. Сбор метрик доступности: Prometheus + Blackbox Exporter. Blackbox позволяет пинговать HTTP/HTTPS, TCP, DNS и ICMP извне, имитируя действия реального пользователя.
  2. Сбор системных метрик: Node Exporter. Устанавливается на каждый сервер для отслеживания CPU, RAM, диска и сети.
  3. Логирование: Promtail (сборщик) + Loki (хранилище). Легковесная альтернатива Elasticsearch, идеально интегрируется с Grafana.
  4. Визуализация и алертинг: Grafana + Alertmanager. Grafana строит дашборды, Alertmanager маршрутизирует уведомления.

Почему не Ping?

Обычный ping (ICMP) показывает только доступность хоста. Он не скажет вам, упал ли веб-сервер (ошибка 500), истек ли SSL-сертификат или зависла база данных. Blackbox Exporter решает эти проблемы, проверяя приложение на уровне протоколов.

Установка и базовая настройка стека

Самый быстрый способ развернуть систему — использовать Docker Compose. Создайте файл docker-compose.yml на вашем сервере мониторинга.

1. Конфигурация Docker Compose

version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    ports:
      - "9090:9090"

  blackbox-exporter:
    image: prom/blackbox-exporter:latest
    volumes:
      - ./blackbox.yml:/etc/blackbox/blackbox.yml
    ports:
      - "9115:9115"

  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin # Смените пароль!
    volumes:
      - grafana_data:/var/lib/grafana

volumes:
  prometheus_data:
  grafana_data:

2. Настройка Prometheus (prometheus.yml)

Здесь мы указываем, откуда брать данные. Важно добавить задачу для сканирования через Blackbox.

global:
  scrape_interval: 15s

scrape_configs:
  # Сбор метрик с самого Prometheus
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Проверка доступности сайтов (через Blackbox)
  - job_name: 'blackbox_http'
    metrics_path: /probe
    params:
      module: [http_2xx] # Ищем успешный ответ
    static_configs:
      - targets:
        - https://google.com
        - https://mysite.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115 # Адрес контейнера blackbox

Совет по безопасности: Не храните пароли в открытом виде в docker-compose.yml. Используйте .env файлы или secrets management инструменты для продакшена.

Контроль доступности (Uptime Monitoring)

Главная задача — понимать, работает ли сервис. Мы настроим проверки двух типов: внешние (из интернета) и внутренние (из локальной сети).

Типы проверок в Blackbox Exporter

  1. HTTP/HTTPS: Проверяет код ответа (ожидается 200), время отклика и наличие определенных слов на странице.
  2. TCP: Проверяет, открыт ли порт (например, 3306 для MySQL или 22 для SSH).
  3. DNS: Проверяет разрешение доменного имени и время ответа DNS-сервера.
  4. ICMP: Классический пинг хоста.

Настройка модулей (blackbox.yml)

Стандартный конфиг уже содержит модуль http_2xx. Для более строгого контроля можно создать кастомный модуль, который проверяет также скорость загрузки:

modules:
  http_2xx_fast:
    prober: http
    timeout: 5s
    http:
      valid_status_codes: [200]
      preferred_ip_protocol: "ip4"
      fail_if_body_not_matches_regexp:
        - "Welcome" # Пример: проверка наличия ключевого слова

Ключевые метрики для дашборда

В Grafana добавьте следующие графики:

  • probe_success: 1 — сайт доступен, 0 — упал.
  • probe_duration_seconds: время полной проверки.
  • probe_http_duration_seconds{phase="tls"}: время рукопожатия SSL (поможет выявить проблемы с сертификатами или шифрованием).

Логирование: сбор и анализ

Метрики говорят что случилось, логи объясняют почему.

Настройка Promtail

Promtail читает логи с серверов и отправляет их в Loki. В файле promtail-config.yml укажите пути к логам ваших приложений (nginx, apache, app logs).

server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*.log

Корреляция событий

В Grafana вы можете настроить переключение между вкладками "Metrics" и "Logs". Если график probe_success падает до 0, кликните на этот момент времени — справа откроются логи Nginx за эту же секунду. Это сокращает время диагностики с часов до минут.

Ротация логов: Loki хранит данные эффективно, но не бесконечно. Настройте политику хранения (retention) в конфиге Loki, например, 7 дней для детальных логов и 30 дней для агрегированных метрик, чтобы не забить диск.

Настройка уведомлений (Alerting)

Бессмысленно мониторить систему, если вы узнаете о падении только от пользователей.

1. Правила алертов в Prometheus

Создайте файл rules.yml и подключите его в prometheus.yml.

groups:
  - name: uptime_alerts
    rules:
      - alert: SiteDown
        expr: probe_success == 0
        for: 1m # Ждем 1 минуту, чтобы исключить ложные срабатывания
        labels:
          severity: critical
        annotations:
          summary: "Сайт {{ $labels.instance }} недоступен"
          description: "Сервис не отвечает уже более 1 минуты."

      - alert: HighLatency
        expr: probe_duration_seconds > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Высокая задержка на {{ $labels.instance }}"

2. Интеграция с Telegram через Alertmanager

В alertmanager.yml настройте получателей. Для Telegram потребуется создать бота через @BotFather и узнать свой Chat ID.

route:
  receiver: 'telegram-notifications'

receivers:
  - name: 'telegram-notifications'
    telegram_configs:
      - bot_token: 'ВАШ_ТОКЕН_БОТА'
        chat_id: ВАШ_CHAT_ID
        send_resolved: true # Присылать уведомление, когда все починилось

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

Уведомление должно содержать:

  1. Статус: CRITICAL или WARNING.
  2. Объект: Какой именно сервис упал (домен или IP).
  3. Длительность: Как долго длится проблема.
  4. Ссылка: Прямая ссылка на дашборд Grafana с фильтром по этому хосту.

Частые ошибки при настройке

  1. Отсутствие гистерезиса (дребезг): Если порог срабатывания равен порогу восстановления, алерты будут сыпаться постоянно при колебаниях нагрузки.
    • Решение: Используйте параметр for в правилах Prometheus (как в примере выше: for: 1m).
  2. Мониторинг "сам себя": Если сервер мониторинга упадет, вы ничего не узнаете.
    • Решение: Используйте внешний независимый сервис (например, бесплатный UptimeRobot) для мониторинга самого сервера с Prometheus/Grafana.
  3. Игнорирование SSL-сертификатов: Сайт может работать, но сертификат истек.
    • Решение: Добавьте проверку probe_ssl_earliest_cert_expiry и алерт, если до истечения осталось менее 14 дней.
  4. Слишком частый опрос: Интервал scrape_interval в 5 секунд для внешних сайтов создаст лишнюю нагрузку и может быть расценен как DDoS.
    • Решение: Для внешних проверок достаточно 60–120 секунд. Для внутренних метрик — 15 секунд.

FAQ

Вопрос: Хватит ли одного сервера для мониторинга 50+ сайтов? Да, Prometheus и Blackbox Exporter очень легковесны. Один небольшой VPS (1 vCPU, 1GB RAM) справится с тысячами проверок в минуту, если не хранить историю метрик годами.

Вопрос: Как мониторить сайты, закрытые фаерволом от внешнего мира? Установите blackbox-exporter внутри периметра сети (в той же подсети, что и сервисы) и настройте Prometheus на опрос этого внутреннего экспортера. Так вы будете знать о доступности сервиса для внутренних пользователей или бэкендов.

Вопрос: Можно ли получать звонки при падении критических сервисов? Да, Alertmanager поддерживает интеграцию с PagerDuty, OpsGenie и телефонией через вебхуки. Для критической инфраструктуры (финансы, медицина) это обязательная практика.

Вопрос: Чем Loki лучше ELK (Elasticsearch)? Loki не индексирует содержимое логов, а только метаданные (лейблы). Это делает его в разы дешевле по ресурсам диска и RAM. Для задач мониторинга и дебага этого достаточно. Полнотекстовый поиск в Loki тоже возможен, но работает медленнее, чем в ES.