Боты и уведомления

Приём заявок: bug_hunter

Для разработчиков. Состояние на 24.09.2026. Как пользоваться ботом сотрудникам — статья «Как сообщить об ошибке». Подробности и запуск — README Buharestskie/bug_hunter_bot.

Коротко

bug_hunter — приём заявок в разработку: сотрудник заводит ошибку или задачу в мини-приложении Telegram, заявка уходит ответственному за сервис, встаёт в общую очередь и связывается с задачей в YouGile. Разработчик работает в админке, в мини-приложении, в YouGile или через MCP-сервер из Claude Code — статус и переписка синхронизируются.

Где живёт

Серверulrica (Алматы — оттуда доступен Telegram); каталог и контейнеры — в README
Адресhttps://bug-hunter.donula26.ru (nginx на сервере)
Бот@donula_bug_hunter_bot, вебхук Telegram
Админка/admin — вход через Telegram, только ответственные; запасной вход — /start login в боте
Мини-приложение/app — всем, кроме забаненных

Один процесс FastAPI: вебхук Telegram, API, /mcp, /yougile/webhook и статика. Данные — Postgres, черновики ввода в чате — Redis, вложения — диск /data/media. Фронт собирается на машине разработчика и заливается готовым: Node на сервере нет. Миграции накатываются на старте контейнера.

Заявка: путь и статусы

СтатусСмысл
Новаяждёт разбора ответственным
На согласованиизадача ждёт согласующего; в очереди не стоит
В очередипринята, ждёт исполнителя
В работекто-то взял
Нужны детализадан вопрос автору; ответ автора возвращает прежний статус
Готовосделано; автор задачи может вернуть в работу один раз за 14 дней
Отклонена / Не баг / Дубль / Отклонена при согласовании / Отозваназакрыта без выполнения

Куда встаёт новая задача: автор с правом согласования — сразу в очередь; «незнакомый» автор (ни одной разобранной заявки) — в «Новая», решает ответственный; остальные — на согласование, если есть согласующий уровнем выше, иначе в «Новая».

Очередь: срочность (Вне очереди → Срочно → В ближайшее время → Не срочно), затем уровень автора (только у задач), затем дата. У ошибки срочности нет, пока её не назначит ответственный. Объединённые заявки занимают одно место.

Кому уходит новая заявка: ответственным за сервис; если их нет — всем ответственным с пометкой «Ответственный за сервис не назначен». Задачи на согласовании не уведомляют никого — у согласующих только счётчик в приложении.

Переписка двигает статус: не внутреннее сообщение разработчика переводит заявку в «Нужны детали» (даже из «В работе»), ответ автора возвращает её обратно. Внутренние заметки статус не трогают и автору не видны.

Объединение: присоединённые заявки получают статус и задачу YouGile главной, смена статуса и срочности идёт на всю группу, автору — одно уведомление на все его заявки группы.

Каталог сервисов

Каталог — репозитории GitHub организации Buharestskie (сверка раз в час) плюс сервисы, заведённые руками. Новый репозиторий появляется скрытым: админам приходит «В GitHub появились новые репозитории… Задайте им названия, иначе они не будут видны в боте». Пока в админке «Сервисы» ему не дали человеческое имя и не включили видимость, сотрудники его не выберут. Архивные репозитории из бота пропадают сами. Там же назначаются ответственные за сервис — от этого зависит, кому уходят заявки.

YouGile

MCP-сервер

POST https://bug-hunter.donula26.ru/mcp, JSON-RPC, заголовок Authorization: Bearer <MCP_TOKEN>. Действует от имени первичного админа с наименьшим Telegram ID из ADMIN_TELEGRAM_IDS.

ИнструментЧто делает
list_bugs, get_bug, get_queueсписок, заявка целиком с перепиской и историей, очередь с местами
set_statusстатус группы: уведомления автору, перенос в YouGile
set_urgencyсрочность группы, стикер в YouGile
route_taskзадача «незнакомца»: принять или отправить на согласование
merge_bugs, unmerge_bugобъединить дубли / отсоединить
add_noteсообщение в заявку, по умолчанию внутреннее
create_yougile_taskзавести задачу в YouGile
list_servicesкаталог сервисов

MCP ведёт себя не во всём как API: add_note с internal=false не ставит «Нужны детали» и не уходит в YouGile; set_status «В работе» для уже взятой заявки молча ничего не делает (API ответил бы 409).

На что наступают

Релей GlitchTip в Telegram

Для разработчиков. Состояние на 24.09.2026. Подробности — README Buharestskie/gitchtip_tg_bot. Отчёт по оплатам для группы ОС описан отдельно — статья «Отчёт по оплатам группы ОС».

Коротко

gitchtip_tg_bot — релей в Telegram. Принимает HTTP-вебхуки и пересылает их в чаты: алерты GlitchTip, обращения «Сообщить о проблеме» из дашбордов и виджетов, отчёт смены менеджера МОС. Сам следит, жив ли GlitchTip, и раз в день собирает отчёт по оплатам группы ОС.

Алерт GlitchTip, обращение пользователя и монитор
Алерт GlitchTip, обращение пользователя и монитор

Где живёт

Серверulrica — с российских площадок api.telegram.org недоступен; каталог, контейнер и адрес — в README
АдресHTTP без TLS и без reverse proxy, на отдельном порту ulrica
Коддоставляется git-бандлом: у ulrica нет доступа к GitHub

Что куда уходит

Все пути защищены одним токеном в адресе: /hook/<WEBHOOK_TOKEN>. Чужой токен — 401.

Кто шлётПутьКак бот понимает, что этоЧат
GlitchTip (все проекты)/hook/…всё, что не подошло нижеTELEGRAM_CHAT_ID
«Сообщить о проблеме»: МОС, МПП1, МПП2, виджет Яндекс.Диска, return_amo_hook_service/hook/… (у отправителя — FEEDBACK_WEBHOOK_URL)в теле есть непустой aliasTELEGRAM_CHAT_ID
Отчёт смены из виджета МОС/mos-workday-report/… (у отправителя — WORKDAY_REPORT_WEBHOOK_URL)в теле есть объект reportWORKDAY_REPORT_CHAT_ID
Ручной запуск отчёта по оплатамPOST /payments-report/…—PAYMENTS_REPORT_CHAT_ID

Тип определяет тело, а не путь: отчёт смены, присланный на /hook/, всё равно уйдёт в чат отчётов.

Из пейлоада GlitchTip читаются только text и attachments[].title / title_link / text. Уровень события не читается — у любого алерта шапка «🔴 GlitchTip».

Подключить новый проект GlitchTip

  1. В GlitchTip, в настройках проекта, — правило алерта с интеграцией generic webhook.
  2. Адрес — …/hook/<WEBHOOK_TOKEN> релея: проще всего скопировать из правила любого уже подключённого проекта; адрес — в README, токен — в .env релея на сервере.
  3. Как часто алертить, решает правило в GlitchTip: сам релей ничего не фильтрует и не склеивает — один POST, одно сообщение.

Монитор GlitchTip

Раз в 5 минут релей запрашивает GLITCHTIP_HEALTH_URL (таймаут 10 секунд). Пишет только при смене состояния: «🔴 GlitchTip недоступен» с причиной и «🟢 GlitchTip снова доступен». Одного неудачного опроса хватает для алерта; падение и подъём между двумя опросами не заметит.

На что наступают