2mon
Сервис для доставки уведомлений в мессенджер 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 приходили всем участникам.
- Добавьте бота в группу
- Назначьте бота администратором группы (в настройках группы в MAX). Без этого бот не сможет читать сообщения.
- В группе напишите
/start— бот зарегистрирует группу и скажет, какую команду выполнить в личке - В личных сообщениях с ботом выполните
/bind ID_группы(ID подскажет бот в группе) - Бот подтвердит привязку и покажет токен для настройки 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.
Документация
- ARCHITECTURE.md — устройство сервиса
- API.md — эндпоинты и форматы
- DEVELOPMENT.md — разработка и добавление новых сервисов
- OPERATIONS.md — обновление, миграции, бэкап и восстановление, диагностика
- CONTRIBUTING.md — как предложить изменения
- CHANGELOG.md — история изменений
- ZABBIX.md — настройка Zabbix
- MONITORING.md — подключение других систем мониторинга
- SECURITY.md — результаты пентеста
- deploy/HTTPS.md — настройка HTTPS
- deploy/nginx-2mon.conf — пример конфига Nginx
- deploy/zabbix-media-type-2mon.yaml — готовый Media type для Zabbix
- scripts/ —
backup.sh,restore.sh,test-alert.sh