1
0
Fork 0
mirror of https://github.com/EDeev/alertbot.git synced 2026-10-07 20:49:56 +03:00
Telegram-бот мониторинга парка серверов: алерты Alertmanager и сводки Prometheus по запросу. aiogram 3
Find a file
Egor Deev 56638f5878 Docker: образ на python:3.12-slim, compose с томом для базы
Лог в файл стал необязательным (ALERTBOT_LOG_FILE): в контейнере пишем только в stdout.
2026-10-02 19:25:42 +00:00
tests Тесты: дедупликация алертов, возврат в норму, сторож, сводки (13 тестов без сети) 2026-10-02 13:54:49 +00:00
.dockerignore Docker: образ на python:3.12-slim, compose с томом для базы 2026-10-02 19:25:42 +00:00
.env.example Токены в заголовке, сторож недоступности мониторинга, путь к базе из окружения 2026-10-02 13:54:49 +00:00
.gitattributes Токены в заголовке, сторож недоступности мониторинга, путь к базе из окружения 2026-10-02 13:54:49 +00:00
.gitignore AlertBot: мониторинг парка серверов через Prometheus/Alertmanager 2026-09-29 15:04:35 +03:00
bot.py Docker: образ на python:3.12-slim, compose с томом для базы 2026-10-02 19:25:42 +00:00
compose.yaml Docker: образ на python:3.12-slim, compose с томом для базы 2026-10-02 19:25:42 +00:00
Dockerfile Docker: образ на python:3.12-slim, compose с томом для базы 2026-10-02 19:25:42 +00:00
handlers.py Токены в заголовке, сторож недоступности мониторинга, путь к базе из окружения 2026-10-02 13:54:49 +00:00
init.py Токены в заголовке, сторож недоступности мониторинга, путь к базе из окружения 2026-10-02 13:54:49 +00:00
LICENSE AlertBot: мониторинг парка серверов через Prometheus/Alertmanager 2026-09-29 15:04:35 +03:00
pyproject.toml Зависимости закреплены по рабочему окружению, настройки ruff/pytest 2026-10-02 13:54:49 +00:00
README.md AlertBot: мониторинг парка серверов через Prometheus/Alertmanager 2026-09-29 15:04:35 +03:00
requirements-dev.txt Зависимости закреплены по рабочему окружению, настройки ruff/pytest 2026-10-02 13:54:49 +00:00
requirements.txt Зависимости закреплены по рабочему окружению, настройки ruff/pytest 2026-10-02 13:54:49 +00:00
sql.py Токены в заголовке, сторож недоступности мониторинга, путь к базе из окружения 2026-10-02 13:54:49 +00:00

AlertBot

Telegram-бот для мониторинга парка серверов поверх Prometheus + Alertmanager. Работает как push-уведомитель («что-то сломалось / починилось») и как справочная панель по команде (/servers, /services, /certs).

Возможности

  • Алерты в реальном времени — фоновая задача раз в N секунд опрашивает Alertmanager, дедуплицирует по fingerprint и сразу шлёт «Проблема · …» / «В норме · …» подписанным пользователям. Никаких собственных правил — подхватывает всё, что уже настроено в Alertmanager, по лейблам, а не по именам целей.
  • /servers — CPU, RAM, диск, swap, load, аптайм и (если есть hwmon-датчики) температура по каждому узлу, с ⚠ при превышении порогов.
  • /services — какие цели Prometheus сейчас up, какие нет.
  • /certs — сколько дней осталось у каждого TLS-сертификата, с предупреждением при <14 дней.
  • /alerts — список активных алертов сейчас; /alerts on|off — подписка/отписка.
  • Доступ — по вайтлисту Telegram user id, все остальные тихо игнорируются.

Требования

  • Python 3.10+
  • Свой Prometheus + Alertmanager с уже настроенными правилами алертов.
  • Alertmanager и Prometheus должны быть доступны боту по HTTP — либо напрямую (если бот крутится на той же машине), либо через reverse-proxy с токен-параметром в URL (так это сделано в этом проекте — см. AM_ALERTS_URL/PROM_QUERY_URL/AM_TOKEN/PROM_TOKEN в .env.example), чтобы не открывать сами Prometheus/Alertmanager в интернет без авторизации.

Установка

pip install -r requirements.txt
cp .env.example .env
# заполнить .env своими значениями
python bot.py

Переменные окружения

Все — в .env.example:

  • BOT_TOKEN — токен бота от @BotFather.
  • ALLOWED_IDS — Telegram user id через запятую, кому разрешено пользоваться ботом.
  • AM_ALERTS_URL / PROM_QUERY_URL / AM_TOKEN / PROM_TOKEN — адреса и токены до Alertmanager API (/api/v2/alerts) и Prometheus API (/api/v1/query).
  • SERVERS_ORDER — имена узлов через запятую, ровно как они указаны в лейбле server у твоих метрик (node_exporter и т.п.) — определяет порядок и состав вывода /servers.
  • ALERT_POLL_SECONDS / ALERT_HTTP_TIMEOUT — период опроса и таймаут запросов.

Структура

init.py       # конфиг из переменных окружения, инициализация Bot/Dispatcher
sql.py        # SQLite: подписчики на алерты, дедуп по fingerprint
handlers.py   # команды бота + фоновый опрос Alertmanager
bot.py        # точка входа

Хранилище — один файл SQLite (notifications.db, путь по умолчанию задаётся при инициализации DatabaseManager), без внешних зависимостей вроде Redis/Postgres.

Продакшен

Юнит systemd — самый простой способ держать бота в фоне постоянно:

[Unit]
Description=AlertBot
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/alertbot
ExecStart=/opt/alertbot/venv/bin/python3 bot.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Лицензия

MIT