СВОЙ ЛИЧНЫЙ WATCHDOG: КАК Я НАПИСАЛ АСИНХРОННЫЙ ТЕЛЕГРАМ-БОТ ДЛЯ МОНИТОРИНГА СЕРВЕРОВ И ПОЧЕМУ ОН ВАМ НУЖЕН

Знаете это паршивое чувство, когда вы спокойно пьете утренний кофе, заходите проверить логи или открыть свой сайт, а там вас встречает ледяная пустота и ошибка таймаута? А потом вы открываете личные сообщения и видите, что проект лежит уже три часа, и пользователи любезно или не очень вам об этом сообщают. Ситуация — классика. Особенно если вы арендуете железо у провайдеров, у которых магистрали штормит по расписанию, или балуетесь агрессивным тюнингом системы.

Админ должен узнавать о падении своего сервера первым. Не от пользователей, не от техподдержки хостинга, а от автоматики. Но что делать, если разворачивать корпоративного монстра вроде Zabbix или Prometheus + Grafana ради пары выделенных серверов и десятка сайтов — это откровенный оверкилл? Зачем тратить гигабайты оперативки на метрики, если вам нужно ответить на один простой вопрос: Оно вообще работает?

Именно поэтому я написал и запустил новый сервис — легковесный, быстрый и абсолютно безжалостный к даун-таймам Telegram-бот: @phoenix901mbot. В этой статье я вскрою его подкапотное пространство и расскажу, как пара сотен строк грамотного асинхронного Python-кода заменяют тяжеловесные системы мониторинга.

ФИЛОСОФИЯ ПРОЕКТА: НИКАКОГО БУЛЛШИТА, ТОЛЬКО СТАТУС

Когда я проектировал этого бота, у меня было три жестких требования:

  • Минимум телодвижений для пользователя. Никаких сложных конфигурационных файлов. Скормил боту IP или домен — он сам понял, что с ним делать.
  • Нулевая терпимость к ложным срабатываниям. Бот должен отличать реальное падение от секундного тупняка сети.
  • Асинхронность до мозга костей. Мониторинг не должен тормозить, даже если в базе будут тысячи узлов. Никаких блокирующих вызовов.

Давайте разберем архитектуру, благодаря которой этот механизм работает как швейцарские часы.

АНАТОМИЯ ДВИЖКА: ASYNCIO И БЕЗОСТАНОВОЧНЫЙ ПОЛЛИНГ

Сердце бота — это фоновая задача polling_task, которая крутится в бесконечном цикле Event Loop параллельно с интерфейсом самого Telegram-бота. Большинство новичков пишут ботов линейно: бот принял команду, выполнил код, уснул. Здесь же работает полноценный демон.

Каждые несколько секунд скрипт забирает из базы весь список серверов и прогоняет их через проверки. Причем делает это не по очереди, дожидаясь ответа от каждого что убило бы производительность на мертвых хостах, а асинхронно.

1. Проверка на уровне железа ICMP Ping

Как проверить, жив ли сервер физически, если веб-сервер упал? Только старым добрым пингом. Но стандартные библиотеки Python для пинга блокируют поток. Поэтому я пошел путем хардкора и вызываю системный бинарник Linux напрямую через asyncio.create_subprocess_exec.

Бот отправляет ровно один пакет -c 1 и ждет ответа максимум 2 секунды -W 2. Если код возврата процесса равен нулю — железо дышит. Если нет — сервер либо обесточен, либо лежит сеть.

2. Проверка веб-сервисов HTTP/HTTPS

Сайт может пинговаться, но при этом отдавать 502 Bad Gateway из-за упавшего PHP-FPM или базы данных. Поэтому вторая линия проверок — это библиотека aiohttp.

Здесь есть один важный инженерный нюанс. Многие современные сайты закрыты Cloudflare или агрессивными анти-DDoS фильтрами, которые моментально банят запросы от дефолтных питоновских скриптов. Чтобы мониторинг не улетал в бан, бот маскируется под обычный браузер, подделывая заголовки:

User-Agent: Mozilla/5.0 Windows NT 10.0; Win64; x64 AppleWebKit/537.36 KHTML, like Gecko Chrome/120.0.0.0 Safari/537.36

Бот понимает любые адекватные коды ответов: 200 ОК, 201, 301 и 302 редиректы, и даже 304 не изменено. Любая другая ошибка 403, 500, 502 или таймаут по соединению триггерят тревогу.

БАЗА ДАННЫХ: БЫСТРЫЙ ЛОКАЛХОСТ

Для хранения стейтов состояний я осознанно отказался от тяжелых реляционных баз данных вроде PostgreSQL или MySQL. Зачем гонять данные по TCP/IP внутри сервера, если нам нужно хранить лишь несколько столбцов? Привет, RAM-First подход.

Бот использует SQLite через асинхронную обертку aiosqlite и ORM SQLAlchemy. База живет прямо в файле рядом со скриптом. Это обеспечивает мгновенный доступ к данным с минимальным I/O оверхедом. В базе хранятся:

  • telegram_id пользователя.
  • target домен или IP.
  • monitor_type ping или http.
  • status_up последнее известное состояние.
  • alerts_enabled хочет ли юзер получать пуши об этом сервере.

КАК ЭТО РАБОТАЕТ ДЛЯ ПОЛЬЗОВАТЕЛЯ

Я терпеть не могу ботов, которые заставляют изучать свои команды. В @phoenix901mbot интерфейс сведен к инлайн-кнопкам.

Магия добавления хоста

Вы просто нажимаете «Добавить узел» и кидаете боту сырой текст, например: phoenix901.ru. Вам не нужно указывать протоколы. Бот сам распарсит строку, очистит ее от лишнего мусора снимет слеши и префиксы и создаст сразу три независимых сенсора под капотом:

  1. Сенсор ПИНГА проверка физической доступности IP/Домена.
  2. Сенсор HTTP проверка доступности по 80 порту.
  3. Сенсор HTTPS проверка защищенного соединения.

Таким образом, если у вас отвалится SSL-сертификат, пинг пройдет, но HTTPS-сенсор упадет, и вы сразу об этом узнаете.

Умные алерты

Бот не будет спамить вас каждую секунду, если сервер лежит. Он обладает «памятью» состояния. Логика проста: в базе записан текущий статус. Если при очередном цикле опроса статус изменился с True на False — бот отправляет сообщение: «🔴 Внимание! Узел перестал отвечать…». И замолкает.

Он напишет вам во второй раз только тогда, когда сервер «оживет», заботливо сообщив: «✅ Отличные новости! Снова работает».

Гибкая настройка тишины

Бывают ситуации, когда вы сами перезагружаете сервер, накатываете обновления или настраиваете RAID-массив. Вы знаете, что сайт будет лежать полчаса, и вам не нужны истеричные пуши в Телегу. В меню «Настройка алертов» вы можете в один клик перевести любой сенсор в режим 🔕 без звука. Бот продолжит мониторить статус в сводке, но перестанет присылать уведомления в личку.

ИТОГ

Мониторинг инфраструктуры не должен быть сложнее самой инфраструктуры. Если вы держите сервера, поднимаете VPN, хостите сайты или телеграм-ботов — вы обязаны знать об их состоянии.

Этот бот — мой личный инструмент, написанный админом для админов и сочувствующих. Он быстрый, не жрет ресурсы и выполняет ровно одну задачу: бережет ваши нервы, сообщая о проблемах до того, как они станут катастрофой.

Заходите, добавляйте свои IP-адреса и домены, и пусть ваши сервера всегда отдают 200 OK: Перейти к боту @phoenix901mbot.

Работаем дальше. Верим только логам и пушам от бота.

👁️ 21

СВОЙ ЛИЧНЫЙ WATCHDOG: КАК Я НАПИСАЛ АСИНХРОННЫЙ ТЕЛЕГРАМ-БОТ ДЛЯ МОНИТОРИНГА СЕРВЕРОВ И ПОЧЕМУ ОН ВАМ НУЖЕН: 1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

root@phoenix901:~# connect
[×]

Получай дайджест раз в неделю.
Без спама.