ea4a6fbe38f18839ad636046892c79a9bb11c748
GlitchUp Bot
Telegram-бот для GlitchTip, который:
- принимает webhook-алерты и отправляет их в Telegram;
- фильтрует окружения, делает dedup, mute по regex и мягкий rate limit;
- синхронизирует unresolved issues из GlitchTip API в локальный cache;
- строит digest, release summary и проектные сводки;
- поддерживает runtime-настройку ownership без рестарта через Telegram-команды;
- запускается локально через
uvи в Docker черезdocker compose.
Что сделано
В проекте уже реализовано:
POST /webhooks/glitchtipдля Slack-compatible payload из GlitchTip;- Telegram polling с командами для просмотра сводок, релизов, sync-статуса и runtime-настроек;
- регулярный API sync в
issues_cache; - обновление
sync_stateдляapi_syncиwebhook; - release tracking через digest и команды
/releases,/release; - mute rules по regex с хранением в БД;
- rate limit для
P2-алертов, при этомP1не режется; - ownership overrides для project/topic/subscribers без рестарта;
- PostgreSQL + Alembic миграции;
- Docker-first запуск с авто-
alembic upgrade head.
Быстрый старт
1. Подготовить .env
Скопировать шаблон:
cp .env.example .env
Заполнить минимум:
TELEGRAM_BOT_TOKEN=your-bot-token
TELEGRAM_GROUP_CHAT_ID=-1001234567890
GLITCHTIP_URL=https://glitchtip.example.com
GLITCHTIP_API_TOKEN=your-token
GLITCHTIP_ORG_SLUG=your-org
DATABASE_URL=postgresql+asyncpg://glitchup:glitchup@db:5432/glitchup
Если хочешь ограничить админ-команды, укажи:
TELEGRAM_ADMIN_IDS=123456789,987654321
Если список пустой, команды изменения конфигурации будут доступны всем.
2. Локальный запуск через uv
uv sync --dev
uv run alembic upgrade head
uv run glitchup-bot
Полезные команды разработки:
uv run pytest
uv run ruff check
uv run ruff format --check
uv run python -m glitchup_bot
3. Запуск через Docker
docker compose up --build
Что произойдёт:
- поднимется PostgreSQL;
- контейнер приложения выполнит
alembic upgrade head; - затем стартуют FastAPI, Telegram polling и scheduler.
Webhook endpoint:
http://<host>:8080/webhooks/glitchtip
Healthcheck:
http://<host>:8080/health
Как пользоваться ботом
Главное изменение интерфейса
Теперь ботом можно пользоваться не только командами, но и через inline-кнопки в Telegram:
/helpоткрывает экран поддержки и быстрых действий;/adminоткрывает админ-панель с основными управляющими действиями;- для частых сценариев больше не нужно помнить все команды вручную.
Обычный сценарий
- Добавить бота в Telegram-группу.
- Включить forum/topics режим в группе.
- Создать топики: backend alerts, frontend alerts, digest.
- Узнать их
topic_idи записать в.env. - Добавить webhook в GlitchTip на
POST /webhooks/glitchtip. - При необходимости задать
WEBHOOK_SECRETи тот же заголовок в GlitchTip. - После запуска бот начнёт:
- слать
P1/P2алерты в Telegram; - синхронизировать issues из API;
- строить digest и отвечать на команды.
- слать
- Открой
/help, чтобы пользоваться ботом через кнопки.
Что делает бот в работе
P1: критичный production alert, отправляется сразу.P2: production alert без критического цвета, отправляется сразу, но может быть ограничен rate limit.P3: не шлётся realtime, остаётся в sync/digest-данных.- Uptime alert:
идёт как
P1.
Основные команды
/help— экран помощи, поддержки и быстрых кнопок./week— digest за неделю./today— новые issues за сегодня./project <slug>— сводка по одному проекту./top— самые шумные unresolved issues./stale— самые старые unresolved issues./releases— список релизов с незакрытыми issues./release <version>— детали по конкретному релизу./sync_status— время последней синхронизации./subscribe <backend|frontend>— добавить себе runtime DM-подписку./unsubscribe <backend|frontend>— убрать свою runtime DM-подписку.
Админ-команды
/admin— кнопочная админ-панель./sync— принудительный sync cache./ownership— показать текущие overrides./owner <slug> <backend|frontend>— привязать проект к группе./owner_reset <slug>— удалить runtime override проекта./topic <backend|frontend|digest> <topic_id>— переопределить topic./topic_reset <backend|frontend|digest>— снять topic override./mute_add <regex>— добавить regex mute rule./mute_list— показать mute rules./mute_del <id>— удалить mute rule.
Конфигурация
Основные переменные окружения:
TELEGRAM_BOT_TOKEN=your-bot-token-here
TELEGRAM_GROUP_CHAT_ID=-1001234567890
TELEGRAM_ADMIN_IDS=123456789
TELEGRAM_BACKEND_TOPIC_ID=1
TELEGRAM_FRONTEND_TOPIC_ID=2
TELEGRAM_DIGEST_TOPIC_ID=3
BACKEND_PROJECTS=backend-production,backend-staging
FRONTEND_PROJECTS=frontend-production,frontend-staging
BACKEND_SUBSCRIBERS=123456789,987654321
FRONTEND_SUBSCRIBERS=
GLITCHTIP_URL=https://glitchtip.example.com
GLITCHTIP_API_TOKEN=your-token
GLITCHTIP_ORG_SLUG=your-org
DATABASE_URL=postgresql+asyncpg://glitchup:glitchup@db:5432/glitchup
API_PORT=8080
WEBHOOK_SECRET=
DIGEST_CRON_DAY=mon
DIGEST_CRON_HOUR=10
DIGEST_CRON_MINUTE=0
DIGEST_TIMEZONE=Asia/Krasnoyarsk
SYNC_INTERVAL_MINUTES=30
ALERT_ENVIRONMENTS=production
DEDUP_WINDOW_HOURS=6
ALERT_RATE_LIMIT_COUNT=10
ALERT_RATE_LIMIT_WINDOW_MINUTES=15
Как это работает
Webhook-контур
Для обычных issue-alert:
- проверяется
X-Webhook-Secret, если заданWEBHOOK_SECRET; - из attachment извлекается
Project; - алерт фильтруется по
ALERT_ENVIRONMENTS; - применяется dedup по fingerprint
project:title; production + #e52b50считаетсяP1, остальное в production идёт какP2;- перед отправкой применяются mute rules;
- для
P2применяется rate limit по группе; - результат записывается в
notifications_sent.
Для uptime-alert:
- сразу отправляется как
P1; - идёт в Telegram без обычного issue dedup.
API sync
Sync:
- ходит в GlitchTip по всем проектам из конфигурации;
- upsert-ит unresolved issues в
issues_cache; - помечает пропавшие из unresolved issues как
resolved; - сохраняет release, regressions, event count, culprit и ссылки;
- обновляет
sync_stateдляapi_sync.
Release tracking
- digest показывает блок "После релизов";
/releasesагрегирует issues по release;/release <version>показывает детали по одному релизу.
Таблицы
Основные:
issues_cache— кэш unresolved/resolved issues из API;notifications_sent— история alert/digest/uptime и статусы отправки;sync_state— состояниеapi_syncиwebhook.
Runtime-настройки:
project_ownership_overrides— project → group overrides;group_topic_overrides— topic overrides;group_subscriber_overrides— runtime subscriber overrides;mute_rules— regex mute rules.
Тесты
uv run pytest
Покрыты базовые сценарии для:
- настроек;
- webhook endpoint;
- alert processor;
- digest builder;
- Telegram sender.
Идеи и недоделки
Сейчас бот уже рабочий, но в этот блок вынесены идеи для следующих итераций:
- полноценный wizard-интерфейс в Telegram для изменения параметров без ручного ввода команд;
- отдельные команды для управления env-based подписчиками, а не только runtime overrides;
- более умный rate limit с burst/recovery-политикой и отдельной статистикой suppress-событий;
- mute rules с scope по проекту или группе, а не только глобальные regex;
- richer release analytics: сравнение "до/после релиза", отдельные regression-отчёты;
- отдельная admin-аутентификация вместо режима "если
TELEGRAM_ADMIN_IDSпустой, можно всем"; - export/backup runtime-настроек ownership и mute rules;
- e2e-тесты с реальной БД и контейнерным прогоном;
- дополнительные команды для ручной диагностики sync и очередей уведомлений.
Description
Languages
Python
98.8%
Dockerfile
0.8%
Mako
0.3%