KaufmanBot

Исследовательский и архитектурный проект для изучения мульти-провайдинга в NestJS и построения плагинной архитектуры для Telegram-бота.

Общая идея

KaufmanBot — исследовательский и архитектурный проект, цель которого была:

  • изучить и продемонстрировать мультипровайдинг в NestJS
  • построить плагинную архитектуру для Telegram-бота
  • проверить различные инженерные и DevOps-подходы на живом проекте

Проект задумывался не как продукт, а как демонстрационная и обучающая платформа.

Ключевая архитектурная идея — мультипровайдинг

Я привык к мультипровайдингу в Angular и хотел получить аналогичное поведение в NestJS.
Так как NestJS не поддерживает это из коробки, я написал отдельную библиотеку:

nestjs-custom-injector

Что она даёт:

  • несколько провайдеров под одним DI-токеном
  • плагинную модель без ручной регистрации
  • поведение, близкое к Angular multi providers

Бот выступает как практический пример использования этой библиотеки.

Плагинная архитектура

Каждая функциональность бота реализована как отдельный плагин (lib):

  • изолированная логика
  • собственные зависимости
  • независимое подключение
  • единый контракт через мультипровайдинг

Примеры плагинов (сжато)

Системные плагины

Отладка — управление debug-режимом
Команды: debug on/off/state/help, отладка включить/выключить
Поддержка RU / EN и синонимов

Короткие команды — сокращённые алиасы для длинных команд
Команды: scmd state/help, кмд состояние/помощь

Работа в группах — поддержка сценариев в групповых чатах
Команды: groups help/meet, группы помощь/знакомство

Переключение языка — управление локалью пользователя
Команды: my locale, change locale to ru, мой язык

Пользовательские и групповые плагины

Конвертер валют — конвертация валют с контекстом
Команды: convert 1 usd to eur, ещё / дальше

Генератор фактов — случайные факты с продолжением
Команды: get fact(s), дай факт(ы), ещё / дальше

Генератор цитат — случайные цитаты
Команды: get quote(s), дай цитату, ещё / дальше

Генератор шуток — случайные шутки
Команды: get joke(s), пошути, рассмеши, ещё / дальше

Первое знакомство — многошаговый сценарий с сохранением состояния
Команды: meet start/reset/help, знакомство начать

Демо-заказ такси — пошаговый сценарий с несколькими экранами
Команды: get taxi, дай такси

Telegram-стек

Эволюция библиотек

Изначально использовалась:

  • telegraf

Проблемы:

  • слабая типизация
  • ухудшение DX при усложнении логики

В результате бот был переведён на:

  • grammy

Причины:

  • строгая типизация
  • более прозрачный middleware
  • лучше подходит для сложных сценариев

Автоматические ответы и Dialogflow

На момент разработки нейросетей ещё не было, но хотелось «умных» ответов.

Для этого был внедрён:

  • Google Dialogflow

Использовался для:

  • стандартного сценария приветствия
  • ответов на типовые вопросы
  • fallback, если команда не распознана

Работа с БД и ORM

Prisma

Проект использовался для изучения Prisma в сложной архитектуре:

  • каждая библиотека имеет свою БД
  • свои миграции
  • деплой как отдельный npm-пакет

Принципиальное решение

В отличие от проекта Rucken:

  • нет общих entity
  • нет наследования между либами
  • каждая либа автономна

Миграции

Использовался:

  • Flyway

Причины:

  • Prisma был новым инструментом
  • хотелось полного контроля
  • миграции писались вручную и идемпотентно

Локализация

Для работы с переводами использована консольная утилита из проекта Rucken:

https://www.npmjs.com/package/rucken

Что сделано в новой версии утилиты:

  • полностью переписана на современные библиотеки
  • адаптирована под Nx
  • интегрирована в плагинную модель бота

Schematics и автоматизация

Реализованы Nx schematics:

  • генерация нового бота
  • генерация новых плагинов
  • единый шаблон архитектуры

Это значительно ускоряло разработку и эксперименты.

DevOps и деплой

Локально:

  • Docker Compose

Продакшн:

  • Dokku

Один и тот же подход использовался и для KaufmanBot, и для Rucken.

Публикации

По проекту написан цикл статей:

https://dev.to/endykaufman/series/16805

Темы:

  • архитектура
  • NestJS
  • Nx
  • деплой и окружение
  • DevOps-практики

Практический опыт и выводы

  • Архитектура с мультипровайдингом была внедрена в 4 коммерческих проекта
  • Подход рабочий, но:
    • плохо понимается Node.js-разработчиками
    • неочевиден для команд
    • усложняет поддержку

В итоге:

  • от мультипровайдинга я отказался
  • проект остановился в развитии
  • остался как reference и учебный материал

Дополнительный контекст и будущее

  • Бот жив и работает, обрабатывает команды и сценарии
  • Возможны направления развития:
    • подключение нейросетей
    • переписывание под другой стек
    • новая архитектура без мультипровайдинга
  • Проект остаётся примером инженерного подхода и DevOps-практик

Итог

KaufmanBot — это:

  • архитектурный эксперимент
  • демонстрация расширения DI NestJS
  • плагинный Telegram-бот
  • реальный DevOps-кейс
  • пример эволюции инженерных решений

Проект ценен не только реализацией, но и сделанными выводами.