90 lines
4.5 KiB
Markdown
90 lines
4.5 KiB
Markdown
# healthbot
|
||
|
||
[](https://sladge.net)
|
||
|
||
Телеграм-бот, который следит за твоими сервисами и пишет в личку, когда
|
||
что-то легло. Опционально умеет управлять флотом [Komodo](https://komo.do)
|
||
и принимать его алерты.
|
||
|
||
## Что умеет
|
||
|
||
**Следит.** Присылаешь ссылку — бот запрашивает её и предлагает выбрать, за
|
||
чем следить: HTTP-статус, тело целиком или конкретное поле JSON (по дереву
|
||
ответа кликаешь мышкой, путь соберётся сам).
|
||
|
||
**Объясняет.** Когда правило нарушено, в сообщении видно не только «json
|
||
изменился», но и что ожидали, что пришло сейчас и сам ответ. Для режима
|
||
«тело целиком» показывается diff — только изменившиеся строки, а не
|
||
простыня на сотню.
|
||
|
||
**Не будит зря.** Падение объявляется после `MONITOR__FAILURE_THRESHOLD`
|
||
неудач подряд (по умолчанию 2). Одиночный провал — это почти всегда
|
||
моргнувшая сеть, а не упавший сервис.
|
||
|
||
**Считает** аптайм, инциденты, суммарный даунтайм и время отклика.
|
||
|
||
**Кнопки в карточке:** проверить сейчас (покажет текущий ответ), поставить
|
||
на паузу на время работ, переименовать, принять текущий ответ за новый
|
||
эталон — если сервис изменился намеренно, не надо пересоздавать его и
|
||
терять статистику.
|
||
|
||
Админов может быть несколько: `ADMIN_IDS=[111,222]`.
|
||
|
||
## Komodo
|
||
|
||
Обе интеграции необязательные: без них бот работает как обычная звонилка.
|
||
|
||
### Управление флотом
|
||
|
||
```env
|
||
KOMODO__URL=https://komodo.example.com
|
||
KOMODO__KEY=...
|
||
KOMODO__SECRET=...
|
||
```
|
||
|
||
Появляется `/fleet`: сервера с числом живых стеков, список стеков,
|
||
карточка стека с кнопками **Deploy / Restart / Stop** и хвостом логов.
|
||
Каждое действие спрашивает подтверждение — деплой прода с телефона
|
||
слишком легко нажать случайно.
|
||
|
||
Ключ создаётся в Komodo: *Settings → API Keys*. Права наследуются от
|
||
пользователя, которым ключ создан, поэтому под бота стоит завести
|
||
отдельного пользователя и выдать ему ровно то, чем он должен управлять.
|
||
|
||
### Приём алертов
|
||
|
||
```env
|
||
WEB__ENABLED=true
|
||
WEB__PORT=8080
|
||
WEB__TOKEN=<любая длинная строка>
|
||
```
|
||
|
||
Бот поднимает HTTP-приёмник. В Komodo заводится Alerter с endpoint type
|
||
**Custom** и URL:
|
||
|
||
```
|
||
http://healthbot:8080/komodo/alert?token=<WEB__TOKEN>
|
||
```
|
||
|
||
Токен принимается и заголовком `X-Alert-Token`, и query-параметром —
|
||
второе потому, что Komodo произвольные заголовки к вебхуку не добавляет.
|
||
|
||
**Порт лучше не публиковать.** Если Komodo и бот стоят в одной docker-сети,
|
||
адрес выше резолвится внутри неё и наружу не выходит совсем. Для этого в
|
||
`docker-compose.override.yml` пропиши сеть и алиас — пример лежит в
|
||
`docker-compose.override.yml.example`.
|
||
|
||
Алерты форматируются по-человечески: недоступный сервер, CPU/память/диск,
|
||
смена состояния стека, расхождение git и Komodo, упавшие процедуры и
|
||
сборки. Незнакомый тип не проглатывается, а показывается как есть.
|
||
|
||
## Запуск
|
||
|
||
```sh
|
||
cp .env.example .env # заполнить ADMIN_ID и BOT__TOKEN
|
||
make up
|
||
make logs
|
||
```
|
||
|
||
`make rebuild` — пересобрать образ, `make down` — остановить.
|