Сводка. Дальше — почему пять сервисов вместо одного, как работает AI-модератор и где спрятана сложность.
Зачем пять сервисов. Один монолит проще, но плох на отказе. Worker умирает — Collector продолжает собирать историю, Admin Bot живой, можно посмотреть состояние через Telegram. Moderator умер — автоответчик работает. Core API падает — все остальные не страдают. Каждый сервис — свой systemd-unit, свой лог, свой restart-policy.
Worker — мозг автоответа. Telethon-сессия от лица пользователя (не бот) слушает все входящие DM. На каждое сообщение запускается каскад проверок: автоответ глобально включён? контакт в папке Personal или у него есть правило? режим ответа не off? дневной лимит не исчерпан? с прошлого ответа прошёл интервал? Если все галочки — генерируется ответ через AI (Claude → Grok → Local fallback), отправляется через ту же Telethon-сессию. Если AI упал — отправляется template как fallback.
Admin Bot — пульт. Aiogram-бот, через который владелец рулит всем: включает/выключает автоответ, добавляет/удаляет правила для контактов, смотрит историю переписок, меняет промпт, лимиты, режим. Из админ-бота можно рестартануть worker (systemctl restart worker) — без SSH.
Moderator — самообучающийся модератор канала. Это самая интересная часть. Команда /scan — бот через Telethon читает 500 последних постов канала. AI (Claude) анализирует и генерирует саммари: о чём канал, какой тон, что уместно, что нет. Саммари сохраняется в базу. Когда в discussion-группе появляется новое сообщение, AI смотрит на саммари + сообщение → выдаёт класс: OK / SPAM / HATE / OFFTOPIC. SPAM / HATE / OFFTOPIC автоматически удаляются. OK остаётся.
Без /scan модератор работает на дефолтном «общая модерация», но после /scan он адаптируется к конкретному каналу: на канале про fishing разговор о tax-стратегиях — это OFFTOPIC, а на канале про инвестиции — OK.
Антифлуд. Трекинг в памяти, не в БД (быстрее). Каждый user_id → список timestamp последних сообщений. Если в окне N секунд больше M сообщений — мут на K минут. Лимиты настраиваются через Admin Bot.
База. PostgreSQL 14, database ai_tg_core, user aiuser. Семь таблиц: peers (контакты с флагом in_personal), messages (история), auto_reply_rules (правила по контактам), auto_reply_state (состояние ответа), settings, reply_counts, chat_triggers (триггеры для модератора по чатам).
Открытый исходник. Репозиторий https://github.com/georgegoldman48-svg/tg-auto-reply — публичный, можно посмотреть полную архитектуру в README.md.