README.md

2mon

License: MIT GitFlic

Сервис для доставки уведомлений в мессенджер MAX.

Что делает

Принимает вебхуки от систем мониторинга (Zabbix, Prometheus, Grafana и других) и пересылает их в MAX — в личный чат с ботом. Пользователь регистрируется один раз, получает токен, подключает его в своей системе — и всё, уведомления пошли.

Для кого

Готовый сервис 2mon.ru

Бесплатная доставка уведомлений из систем мониторинга в MAX. Регистрируетесь через бота, получаете токен, настраиваете систему мониторинга и алерты приходят в личку или группу. Не нужно регистрировать бизнес аккаунт в MAX, поднимать сервер, настраивать Docker и следить за обновлениями.

Свой сервер из исходников

Если хотите контролировать данные, дорабатывать под себя или использовать внутри компании — поднимите сервис у себя. Весь код открыт (MIT), инструкции в этом репозитории.

Возможности

  • Приём вебхуков от Zabbix и других сервисов
  • Heartbeat — мониторинг доступности системы мониторинга
  • Единая очередь с соблюдением лимита MAX (30 сообщений/сек)
  • Индивидуальные дневные лимиты для каждого пользователя
  • Уведомление о превышении лимита
  • Регистрация через бота в MAX — /start
  • Повторная выдача токена — /token
  • Смена (ротация) токена — /newtoken
  • Проверка статистики — /status
  • Статус heartbeat — /heartbeat
  • Ежедневная рассылка статистики пользователям
  • Админка для управления пользователями и лимитами
  • Уведомления администратору о новых регистрациях
  • Ежедневная статистика администратору с топом пользователей
  • Автобан пользователей, заблокировавших бота (chat.denied)

Стек

Компонент Технология
Язык Go
База данных MongoDB
HTTP-роутер chi
Очередь chan + rate limiter
Cron robfig/cron
Админка HTML на серверном рендеринге

Требования

  • Docker и Docker Compose
  • Токен бота MAX (получить в панели MAX для партнёров)
  • Домен с настроенным HTTPS (для вебхуков MAX требуется SSL на 443 порту)

Быстрый старт

git clone https://gitflic.ru/project/piroman99/2mon.git
cd 2mon
cp .env.example .env
# заполнить .env своими данными
docker compose up -d

Деплой на сервер

Подробная инструкция по настройке HTTPS и Nginx: deploy/HTTPS.md

Кратко: 1. Установить Docker и Docker Compose 2. Склонировать репозиторий 3. Создать .env из .env.example 4. docker compose up -d 5. Настроить Nginx + Certbot (конфиг в deploy/nginx-2mon.conf) 6. Настроить вебхук в MAX на https://ваш-домен.ru/bot

Обновление версии, миграции схемы, бэкап и восстановление — в OPERATIONS.md.

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

Переменная Обязательно По умолчанию Описание
MONGO_URI Да — Строка подключения к MongoDB
MAX_BOT_TOKEN Да — Токен бота из панели MAX для партнёров
ADMIN_PASSWORD Да — Пароль для входа в админку
MAX_API_URL Нет https://platform-api.max.ru URL API MAX
RATE_LIMIT Нет 30 Лимит сообщений в секунду
QUEUE_SIZE Нет 1000 Размер очереди сообщений
LOG_RETENTION_DAYS Нет 180 Срок хранения журнала отправок, дней; 0 или меньше — хранить вечно
PORT Нет 8080 Порт сервера

MAX рекомендует домен platform-api2.max.ru вместо platform-api.max.ru. platform-api2 использует сертификат Минцифры — перед переключением добавьте корневой сертификат в доверенные (см. deploy/HTTPS.md). Дефолт в коде и документации сейчас — platform-api.max.ru.

Подключение систем мониторинга

Инструкции по настройке Zabbix и других систем: ZABBIX.md, MONITORING.md

Кратко: 1. Зарегистрируйтесь у бота в MAX — команда /start 2. Получите токен — команда /token 3. В Zabbix создайте Media type Webhook (скрипт в ZABBIX.md, MONITORING.md) 4. Добавьте Media пользователю с токеном 5. Создайте Action для отправки уведомлений 6. Для heartbeat настройте Web scenario (см. ZABBIX.md, MONITORING.md)

Админка

Доступна по адресу /admin. После ввода пароля можно:

  • Просматривать список пользователей
  • Блокировать/разблокировать
  • Изменять дневной лимит сообщений
  • Видеть статус heartbeat

Первого администратора нужно создать вручную в MongoDB — установить is_admin: true.

API вебхуков

Отправка уведомления

    POST /wh/{token}
    Content-Type: application/json

    {
      "subject": "High CPU Load",
      "message": "CPU usage is above 90%",
      "severity": "critical"
    }

Ответы

Код Значение
200 Сообщение поставлено в очередь ({"status":"queued"})
200 Принят heartbeat ({"status":"heartbeat_ok"})
400 Тело запроса — не JSON
403 Пользователь заблокирован
404 Неверный токен
429 Дневной лимит превышен
429 Очередь отправки переполнена
500 Внутренняя ошибка (БД, очередь)

Если subject равен heartbeat (без учёта регистра), сообщение не тратит дневной лимит — обновляется только время последнего сигнала.

Полное описание — API.md.

Команды бота в MAX

Команда Действие
/start Регистрация и получение токена
/token Повторно показать токен
/newtoken Сменить токен — только предупреждает
/newtoken confirm Подтвердить смену токена (старый перестаёт работать)
/status Статистика за сегодня
/heartbeat Статус heartbeat
/bind Привязать группу (/bind ID, отвязка — /bind off)
/groupid Показать ID группы (в группе)
/help Справка

Команды автоматически регистрируются в подсказках MAX при вводе «/» (PATCH /me/commands).

Работа в группах MAX

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

  1. Добавьте бота в группу
  2. Назначьте бота администратором группы (в настройках группы в MAX). Без этого бот не сможет читать сообщения.
  3. В группе напишите /start — бот зарегистрирует группу и скажет, какую команду выполнить в личке
  4. В личных сообщениях с ботом выполните /bind ID_группы (ID подскажет бот в группе)
  5. Бот подтвердит привязку и покажет токен для настройки Zabbix. Уведомления пойдут в группу.

Чтобы отвязать группу: /bind off

В группе бот отвечает на команды:

  • /status — статистика за сегодня
  • /heartbeat — статус heartbeat
  • /groupid — ID группы
  • /help — справка

Токен в группе не показывается. На обычные сообщения бот не реагирует.

Разработка и тестирование

make check                    # gofmt + go vet + go test — то же, что гоняет CI
make test                     # только тесты
go test -race -count=1 ./...  # с детектором гонок (нужен cgo)

Тесты лежат рядом с кодом:

Файл Что покрывает
internal/config/config_test.go дефолты, обязательные переменные, защита лимитов и ретенции
internal/sender/sender_test.go очередь, доставка, graceful shutdown
internal/handler/admin_test.go сессия админки: токен не равен паролю, checkAuth
cmd/server/main_test.go регистрация команд бота в MAX (PATCH /me/commands)

CI (gitflic-ci.yaml) запускается на каждый push и merge request: gofmt, go vet, go test -race, а на ветке main — ещё и сборка. Так сломанный код не попадает в main.

Документация

Лицензия

MIT

Описание
Бот уведомлений мониторинга в Макс
Конвейеры
0 успешных
0 с ошибкой
Разработчики