Мониторинг VPS: htop, netdata и алерты в Telegram

Настройка сервера
Мониторинг VPS: htop, netdata и алерты в Telegram

Мониторинг сервера — это разница между «сайт лежал всю ночь, узнали от клиентов» и «пришёл алерт, починили за десять минут». Хорошая новость: для VPS не нужны платные системы наблюдения — связка из htop для ручной диагностики и Netdata с уведомлениями в Telegram закрывает 90% задач и настраивается за полчаса. В этой инструкции пошагово поднимем мониторинг VPS своими руками на Ubuntu 24.04 LTS: посмотрим на метрики в реальном времени, установим Netdata, спрячем панель от посторонних и заставим сервер сам писать вам в Telegram при проблемах.

Что вообще мониторить на VPS

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

  • CPU — постоянная загрузка выше 80–90% означает, что процессор стал узким местом; отдельно важен показатель steal (виртуализация отбирает такты — на KVM с выделенными ядрами он должен быть близок к нулю).
  • Load average — среднее число процессов в очереди. Ориентир: не выше количества ядер. Для 12 vCPU load 8 — норма, load 30 — беда.
  • RAM и swap — важна не цифра «занято» (Linux использует свободную память под кеш, это хорошо), а активный обмен со swap и появление OOM-killer в логах.
  • Диск — свободное место (заполненный диск роняет базы данных) и загруженность по вводу-выводу (iowait).
  • Сеть — трафик и число соединений: аномальный рост часто первым сигналит об атаке или взломе.
  • Службы — жив ли nginx, MySQL, ваше приложение; отвечает ли сайт по HTTP.

Уровень 1. htop: ручная диагностика за секунды

Htop — интерактивный монитор процессов, первый инструмент, который открывают при любых «сервер тормозит». Установка на Ubuntu 24.04:

sudo apt update
sudo apt install htop

Запускается командой htop. Сверху — шкалы загрузки каждого ядра, память и swap, load average и uptime; ниже — список процессов. Что нажимать:

  • F6 — сортировка (по CPU%, MEM% и другим колонкам);
  • F4 — фильтр по имени процесса, например nginx;
  • F5 — дерево процессов: видно, кто кого породил;
  • F9 — отправить сигнал (аккуратно: SIGKILL убивает процесс без сохранения данных);
  • q — выход.

Полезное дополнение к htop — пара утилит для дисков и сети:

sudo apt install iotop-c nethogs
sudo iotop-c        # кто грузит диск
sudo nethogs        # какой процесс ест трафик
df -h               # свободное место на дисках

Слабое место ручной диагностики очевидно: htop показывает «сейчас», но не хранит историю и не разбудит вас ночью. Для этого нужен уровень 2.

Уровень 2. Netdata: графики всего в реальном времени

Netdata — опенсорсный агент мониторинга, который после установки сам находит запущенные службы (nginx, MySQL, PostgreSQL, Redis, Docker и десятки других) и рисует сотни графиков с посекундной детализацией. Настройки для старта не требуются вообще.

Установка

Официальный установщик работает на Ubuntu, Debian, AlmaLinux и Rocky Linux:

wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh
sh /tmp/netdata-kickstart.sh

Скрипт подключит репозиторий Netdata и поставит пакет. Проверяем, что служба запустилась:

sudo systemctl status netdata

Панель поднимается на порту 19999. По ресурсам агент скромен — около 1–3% одного ядра и 150–300 МБ RAM, но на самых маленьких VPS это заметно. Комфортный минимум для «Netdata + ваши приложения» — что-то вроде тарифа Pro у Cheap-Host: 12 vCPU, 16 ГБ RAM и NVMe за 750 ₽/мес — мониторинг занимает пару процентов ресурсов и не мешает основной нагрузке.

Закрываем панель от посторонних

Важный момент: из коробки Netdata слушает все интерфейсы, а авторизации в панели нет — любой, кто знает IP, увидит метрики вашего сервера. Привязываем панель только к localhost. Открываем конфиг:

sudo /etc/netdata/edit-config netdata.conf

В секции [web] задаём:

[web]
    bind socket to IP = 127.0.0.1

Перезапускаем:

sudo systemctl restart netdata

Теперь панель доступна только с самого сервера. Чтобы открыть её со своего компьютера, пробрасываем порт через SSH-туннель:

ssh -L 19999:127.0.0.1:19999 user@IP_сервера

Пока сессия открыта, панель живёт в браузере по адресу http://localhost:19999. Альтернатива туннелю — правило файрвола, разрешающее порт 19999 только с вашего IP: как это сделать, разобрано в статье настройка файрвола UFW. Кстати, этот способ работает и на NAT VPS: панель на 127.0.0.1 не требует отдельного внешнего порта — хватает SSH-доступа.

Уровень 3. Уведомления в Telegram

Netdata умеет не только рисовать графики: в комплекте сотни готовых проверок здоровья (место на диске, RAM, iowait, упавшие службы), и каждая может отправить алерт. Настроим доставку в Telegram.

Шаг 1. Создаём бота

  1. Пишем в Telegram боту @BotFather команду /newbot, задаём имя и логин.
  2. Сохраняем выданный токен вида 1234567890:AAE4ik….
  3. Открываем чат со своим новым ботом и отправляем ему любое сообщение (без этого бот не сможет писать вам первым).

Шаг 2. Узнаём chat id

Выполняем на сервере или в любом терминале (подставьте свой токен):

curl -s "https://api.telegram.org/bot<ТОКЕН>/getUpdates"

В JSON-ответе ищем "chat":{"id":123456789… — это и есть ваш chat id.

Шаг 3. Включаем Telegram в Netdata

sudo /etc/netdata/edit-config health_alarm_notify.conf

Находим и правим три строки:

SEND_TELEGRAM="YES"
TELEGRAM_BOT_TOKEN="1234567890:AAE4ik..."
DEFAULT_RECIPIENT_TELEGRAM="123456789"

Перезапускаем службу и проверяем доставку встроенным тестом (запускается от пользователя netdata):

sudo systemctl restart netdata
sudo su -s /bin/bash netdata -c '/usr/libexec/netdata/plugins.d/alarm-notify.sh test'

В Telegram должны прийти тестовые сообщения о WARNING, CRITICAL и восстановлении. Всё — теперь заполненный диск или упавший MySQL сервер сообщит вам сам.

Подстройка порогов

Если какой-то алерт шумит, его порог можно поменять. Правила лежат в health.d, редактируются так же:

sudo /etc/netdata/edit-config health.d/disks.conf
sudo netdatacli reload-health

В файлах меняются значения warn: и crit: — например, предупреждать о диске не при 80%, а при 90% заполнения.

Бонус: пинг сайта с алертом без Netdata

Иногда нужен максимально простой внешний контроль: отвечает ли сайт. Скрипт из десяти строк плюс cron решают задачу:

#!/bin/bash
# /usr/local/bin/site-check.sh
URL="https://example.com"
TOKEN="1234567890:AAE4ik..."
CHAT_ID="123456789"

CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL")
if [ "$CODE" != "200" ]; then
  curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
    -d chat_id="${CHAT_ID}" \
    -d text="Сайт ${URL} вернул код ${CODE}"
fi

Делаем исполняемым и вешаем в cron каждые 5 минут:

sudo chmod +x /usr/local/bin/site-check.sh
( crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/site-check.sh" ) | crontab -

Важный нюанс: такой скрипт должен работать с другого сервера, иначе при падении VPS он упадёт вместе с сайтом и промолчит. Идеальный кандидат — копеечный NAT VPS: у Cheap-Host тариф NAT Start стоит 59 ₽/мес, и его 1 ГБ RAM для «сторожа» более чем достаточно.

Что выбрать: сводная таблица

ИнструментЧто даётИсторияАлертыКогда использовать
htopПроцессы и ресурсы в моментеНетНетРучная диагностика «здесь и сейчас»
NetdataСотни графиков, автообнаружение службЕстьTelegram, email и др.Основной мониторинг 1–5 серверов
Скрипт + cronПроверка доступности извнеНетTelegramВнешний «сторож» на втором сервере
Grafana + PrometheusГибкие дашборды и правилаЕстьЛюбыеПарк серверов, продакшн-инфраструктура

Про последний вариант у нас есть отдельный разбор — Grafana + Prometheus: профессиональный мониторинг VPS: он оправдан, когда серверов становится много или нужны кастомные метрики приложения.

FAQ

Сколько ресурсов потребляет Netdata?

Порядка 1–3% одного ядра CPU и 150–300 МБ RAM в зависимости от числа собираемых метрик. На VPS с 1 ГБ памяти это ощутимо — там разумнее сократить историю метрик в настройках или ограничиться htop и скриптом с алертами. На тарифах от 8 ГБ RAM накладные расходы незаметны.

Безопасно ли открывать панель Netdata наружу?

Нет: по умолчанию порт 19999 доступен без авторизации. Привяжите панель к 127.0.0.1 и смотрите через SSH-туннель, закройте порт файрволом или поставьте перед Netdata обратный прокси с паролем.

Чем Netdata отличается от Grafana + Prometheus?

Netdata — решение «поставил и работает»: само находит службы, рисует графики, присылает алерты. Grafana + Prometheus гибче и лучше масштабируются на парк серверов, но требуют настройки экспортеров, правил и дашбордов. Для 1–5 серверов Netdata обычно достаточно.

Что делать, если алерты приходят слишком часто?

Поднимите пороги под свою нагрузку: sudo /etc/netdata/edit-config health.d/<файл>.conf, поменяйте warn и crit, шумные проверки переведите на to: silent. Примените изменения командой sudo netdatacli reload-health.

Можно ли мониторить несколько VPS в одной панели?

Да. У Netdata есть режим стриминга: агенты на «детях» отправляют метрики на «родительский» узел, где хранится история и работают алерты. Альтернатива — бесплатный тариф Netdata Cloud, объединяющий панели нескольких агентов.

Вывод

Мониторинг VPS своими руками — это три уровня: htop для быстрой диагностики, Netdata для графиков и истории, Telegram-алерты, чтобы о проблеме узнавать раньше пользователей. Всё бесплатно, опенсорсно и ставится за полчаса. Дополните картину резервным копированием — мониторинг предупреждает о проблемах, а бэкап спасает, когда предупреждение опоздало. Если под проект с мониторингом нужен сервер с запасом — у Cheap-Host тариф Pro за 750 ₽/мес: 12 vCPU, 16 ГБ RAM, NVMe, безлимитный трафик и uptime 99,9%, а сервер выдаётся за 45–60 секунд.

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