Рой AI-агентов для оперативного контроля проектов: архитектура Hermes Stack
- AI agents
- Hermes Stack
- DevOps
- Telegram
- BrowserUse
Hermes Stack — это наш внутренний рой AI-агентов на сервере 185.179.188.145, который ежедневно делает то, что классически требует круглосуточного дежурства: снимает SEO-метрики, опрашивает CRM, рассылает уведомления, рендерит PDF, фиксирует регрессии. Девять docker-сервисов, координатор в Telegram, единая шина уведомлений — и три пары глаз, которые никогда не спят.
Контекст
Когда команда из одного-двух разработчиков ведёт девять параллельных проектов, ручной мониторинг превращается в бутылочное горлышко: «забыл проверить PSI», «не заметил, что cron упал», «новая регрессия два дня висит без реакции». Альтернатива в 2026 году — рой специализированных агентов, каждый из которых отвечает за один тонкий слой ответственности и сообщает о проблеме в общий чат.
Hermes Stack — наша реализация этой идеи. Не один большой «AI-сотрудник», а набор узких сервисов, которые легко перезапускать, обновлять и заменять.
Архитектура: 9 docker-сервисов
Stack описан в одном docker-compose.yml. Сервисы делятся на три уровня:
Координация (1 сервис)
hermes/— gateway, который агрегирует события от всех воркеров, фильтрует шум и шлёт сводки в Telegram-бот@hermesdm64bot. Здесь же живёт логика «не повторять алерт чаще раза в час».
Сборщики данных (2 сервиса)
browser-harness/— управляемые headless-браузеры через BrowserUse Cloud + REST-прокси на CDP. Главный кейс — ежедневный снимок Я.Метрики и Я.Вебмастера на ozsm.ru, prod cron09:10и09:22 MSK. Браузер логинится через сохранённый профиль, делает скриншоты, экспортирует CSV.seo-ozsm/— лёгкий runner, который агрегирует снимки и складывает в LightRAG для последующего анализа.
Рутина (4 сервиса)
crm-worker/— каждые 5 минут опрашивает CRM на новые задачи и нотифицирует ответственныхscheduled-tasks-worker/— каждые 30 минут запускает плановые задания (бэкапы, отчёты, ребилд индексов)notifications-worker/— единая шина email/telegram/sms с шаблонами, дедупом и retrypdf-tasks-worker/— Hatchet workflow runner, рендерит ваучеры/расписания на лету
Инфра (2 сервиса)
pf-frontend/— отдельный контейнер с задеплоенным ПФcaddy/— reverse-proxy с auto-TLS и аккуратными security-заголовками
Browser-harness: проблема и решение
Я.Метрика и Я.Вебмастер не дают полноценного API на «тонкие» метрики (поведенческие, источники переходов в реальном времени). Парсить через обычный HTTP-клиент бесполезно — там сильная защита от ботов.
Решение: BrowserUse Cloud + CDP (Chrome DevTools Protocol). BU Cloud держит подогретый профиль с залогиненными аккаунтами Яндекс. Наш сервис browser-harness/ ходит к нему через REST, открывает нужную страницу, дожидается рендера и снимает данные через CDP-выборки. CSV/JSON ложится в общую файловую шару, дальше его подбирает seo-ozsm/.
Cron-расписание выбрано не случайно: 09:10 MSK для Метрики, 09:22 MSK для Вебмастера. К этому моменту вчерашний день у Яндекса уже закрыт и стабилен, но рабочий день в РФ только начинается — успеваем разослать утреннюю сводку.
Telegram как пользовательский интерфейс
Бот @hermesdm64bot — единственный «UI» Hermes Stack. Никаких веб-дашбордов, никаких JIRA. Утром приходит сводка вида «PSI ozsm.ru: mobile 100/100 без изменений, новых алертов нет». При регрессии — отдельное сообщение с цифрами «было/стало» и ссылкой на отчёт.
Telegram выбран из-за нативной поддержки markdown, кодовых блоков и длинных сообщений. Для канала в гос-аудитории есть параллельная интеграция через MAX (российский мессенджер с серверами в РФ, для 152-ФЗ-чувствительных сценариев).
Что мы из этого вынесли
- Узкие агенты надёжнее одного большого. Когда
crm-workerпадает, рой работает дальше. Когда падает «универсальный AI-сотрудник» — встаёт всё. Отказ-локализация важнее теоретической универсальности. - Cron-расписание решает половину задачи. Снимок данных в 09:10 и сводка в 09:30 формируют ритм: к началу рабочего дня у нас на руках вчерашняя картина без необходимости куда-то заходить и нажимать «обновить».
- Telegram как UI экономит десятки часов. Не строить отдельный дашборд, не учить команду «зайти в Grafana» — все алерты идут в чат, который и так открыт постоянно.
Ссылки
- BrowserUse — managed browser agents — облачные headless-браузеры с подогретыми профилями
- Hatchet — workflow engine для TS/Python — основа
pdf-tasks-worker - Caddy 2 — reverse-proxy с auto-TLS — наш фронт