Open source платформа для Telegram-ботов: конфиги вместо кода

Разработка и поддержка Telegram-ботов — затратная история. Каждый новый бот требует либо команды разработки, либо оплаты SaaS-сервисов с ограничениями, либо работы подрядчиков.

Coreness — платформа на Python для развёртывания AI-ботов через YAML-конфиги. Self-hosted решение без vendor lock-in, где один сервер может обслуживать десятки изолированных ботов. И теперь проект выходит в open source.

Репозиторий: github.com/Vensus137/Coreness

Зачем это нужно

Проблема

Типичный путь при создании Telegram-бота:

1. Заказная разработка через фрилансеров

  • Простой бот: 30-80 тыс. руб.
  • Бот с интеграциями: 100-250 тыс. руб.
  • Поддержка: от 10 тыс. руб./месяц
  • Проблема: каждое изменение логики = новая задача

2. SaaS (Chatfuel, ManyChat и др.)

  • От 3-15 тыс. руб./месяц за бота
  • Ограничения: нельзя подключить свои LLM, кастомная логика за доплату
  • Vendor lock-in: данные на чужих серверах

3. Собственная разработка

  • Нужна команда (junior/middle разработчик от 80-150 тыс. руб./месяц)
  • Время на первый бот: 2-4 недели
  • Каждый новый бот = копипаст кода + адаптация + тестирование

Проблема масштабирования: При 5-10 ботах затраты на разработку и поддержку становятся значительными, а время вывода каждого нового — недели вместо дней.

Решение

Coreness меняет подход: self-hosted платформа, где логика описывается в YAML-конфигах. Это даёт:

  • Время: Новый бот создается за несколько часов — редактирование конфига вместо написания кода с нуля
  • Затраты: Один VPS (от 500-1500 руб./месяц) обслуживает множество ботов. Вместо оплаты за каждого бота отдельно
  • Контроль: Свой сервер, свои данные, любые LLM-модели, никакого vendor lock-in
  • Масштабируемость: Добавить бот = создать папку с конфигом. Никакого копипаста кода

Подходит для: агентств (больше проектов при той же команде), стартапов (быстрая валидация идей), компаний с требованиями к размещению данных на своих серверах.

Возможности платформы

Архитектура платформы

Coreness построен на event-driven архитектуре с четким разделением слоёв.

Telegram отправляет обновления, платформа находит подходящий YAML-сценарий, выполняет действия через сервисы и сохраняет данные в PostgreSQL с автоматической изоляцией по тенантам.

Архитектура
Архитектура

Всё асинхронно, боты могут параллельно обрабатывать входящие события.

Multi-tenancy из коробки

Полная изоляция данных на уровне базы. Один экземпляр платформы — множество независимых ботов:

  • Свои настройки, базы знаний, промпты для каждого тенанта
  • Автоматическая фильтрация по tenant_id — не нужно добавлять условия в каждый запрос
  • GitHub-синхронизация конфигураций (Infrastructure as Code)
  • Master Bot — готовый бот для управления тенантами (аналог @BotFather)

Для добавления нового бота достаточно просто создать папку с конфигом, и платформа подхватывает его автоматически.

Open source платформа для Telegram-ботов: конфиги вместо кода

YAML-конфигурации вместо кода

Декларативное описание сценариев — вся логика в конфигах:

start: trigger: - event_type: "message" event_text: "/start" step: - action: "send_message" params: text: | 👋 Привет, {first_name|fallback:друг}! Добро пожаловать в бота! inline: - [{"📋 Меню": "menu"}, {"ℹ️ Помощь": "help"}]

Что здесь происходит:

  • trigger — условие запуска (команда /start)
  • step — последовательность действий
  • {first_name|fallback:друг} — плейсхолдер с модификатором (если first_name пустой, подставится "друг")
  • inline — кнопки под сообщением

Сценарии описываются декларативно — не нужно разбираться в коде платформы, достаточно знать структуру конфига. Логику может менять не только программист: PM настроит флоу, маркетолог обновит тексты, дизайнер поправит кнопки. Всё в одном читаемом файле.

Конфигурация
Конфигурация

Пример использования RAG:

Встроенная интеграция с LLM-моделями и векторным поиском:

  • Semantic search через pgvector (PostgreSQL)
  • Поддержка OpenAI, Anthropic, Google, DeepSeek через агрегаторы (OpenRouter, Azure OpenAI и другие)
  • RAG-контекст в сценариях — боты отвечают на основе базы знаний
  • Function calling и AI-агенты с инструментами

Пример использования RAG:

ai_answer: trigger: - event_type: "message" step: # Поиск релевантного контекста - action: "search_embedding" params: query_text: "{event_text}" document_type: "knowledge" limit_chunks: 5 # AI ответ с контекстом - action: "completion" params: prompt: "{event_text}" system_prompt: "Ты — помощник. Используй контекст для точных ответов." rag_chunks: "{_cache.chunks}" model: "gpt-4o-mini" # Отправка ответа - action: "send_message" params: text: "{_cache.response}"

Система автоматически формирует правильную структуру messages для AI, группирует чанки по типам (история диалога, база знаний, дополнительный контекст).

Scheduled сценарии

Автоматизация по расписанию через cron-выражения:

daily_report: schedule: "0 9 * * *" # Каждый день в 9:00 step: - action: "send_message" params: text: "Доброе утро! Вот отчёт за вчера..."

Полезно для ежедневных отчётов, рассылок, периодических проверок.

Плагинная система

Каждая фича — отдельный плагин в папке plugins/. Нужна интеграция с внешним API? Не проблема, достаточно написать новый плагин и добавить в папку.

Структура:

plugins/ ├── utilities/ # Вспомогательные утилиты │ ├── foundation/ # Базовые (logger, plugins_manager) │ ├── telegram/ # Telegram утилиты │ └── core/ # Инфраструктурные (event_processor, database) └── services/ # Бизнес-сервисы ├── bot_hub/ # Управление ботами ├── tenant_hub/ # Управление тенантами └── ai_service/ # AI и RAG

Плагины изолированы, общаются через события. Добавляется новый плагин — система подхватит и свяжет зависимости, сервис регистрирует свои действия через action_hub.

Как это работает

Event-Driven архитектура

Каждый сервис самодостаточен, общается через события. Не запутанная сеть зависимостей, а чистые вертикальные срезы функциональности.

Обработка действия
Обработка действия

Как обрабатывается событие на практике:

Разберём на примере сообщения с RAG-ответом (как на диаграмме):

  1. Telegram Bot API отправляет webhook с новым сообщением
  2. Event Processor парсит Update асинхронно и создаёт Task
  3. Scenario Engine ищет триггер в YAML-сценариях и находит подходящий
  4. Step Executor последовательно выполняет actions из сценария:
  5. Step 1: search_embedding → AI Service обращается к PostgreSQL pgvector, получает релевантные chunks
  6. Step 2: completion → AI Service отправляет prompt + RAG chunks в OpenRouter/LLM, получает ответ
  7. Step 3: send_message → Telegram Utility вызывает Bot API, отправляет ответ пользователю
  8. Task завершается, пользователь получает ответ

PostgreSQL для изоляции данных

Автоматическая фильтрация данных на уровне базы. Один SELECT-запрос — PostgreSQL сам ограничивает выборку по tenant_id.

Не нужно в каждом запросе добавлять WHERE tenant_id = ..., база сама фильтрует на уровне строк. Это критично для мультитенантности — невозможно случайно получить данные другого тенанта.

Дополнительно: система автоматически создаёт PostgreSQL view для контроля доступа на уровне БД. Можно настроить read-only пользователей с доступом к конкретным тенантам через таблицу view_access.

Альтернатива: для упрощённой настройки можно использовать SQLite вместо PostgreSQL. Не нужен отдельный контейнер, проще администрирование, меньше DevOps-проблем. Ограничение: в SQLite не работает RAG (нет поддержки pgvector), поэтому векторный поиск недоступен. Для production с RAG рекомендуется PostgreSQL.

Запускаем бота за 5 минут

Окей, теория понятна. Как это работает на практике?

Шаг 1. Разворачиваем через deployment manager

Платформа включает утилиту для автоматизированного развёртывания. Она настраивает всё "под ключ": поднимает контейнеры, накатывает миграции, настраивает окружение.

# Клонируем репозиторий git clone https://github.com/Vensus137/Coreness.git cd Coreness # Запускаем deployment manager python tools/deployment/deployment_manager.py

Что происходит:

  • Утилита определяет окружение (test/prod)
  • Настраивает переменные окружения
  • Поднимает PostgreSQL 16 с pgvector (или SQLite для упрощённой версии)
  • Накатывает миграции базы
  • Собирает Docker-образ и запускает контейнеры
  • Устанавливает команду dc для управления

Важно: Для первого запуска нужно настроить config/settings.yaml и переменные окружения (токены ботов, ключи API). Deployment manager упрощает процесс установки и обновлений. Подробнее в документации по деплою.

Деплой Менеджер
Деплой Менеджер

Шаг 2. Создаём тенант

Создаём папку config/tenant/tenant_101/ с файлом tg_bot.yaml:

bot_name: "Мой бот" bot_token: "1234567890:ABCdefGHIjklMNOpqrsTUVwxyz" is_active: true

Шаг 3. Настраиваем сценарий

Создаём файл config/tenant/tenant_101/scenarios/start.yaml:

start: trigger: - event_type: "message" event_text: "/start" step: - action: "send_message" params: text: | 👋 Привет, {first_name}! Это бот на платформе Coreness. inline: - [{"📋 Меню": "menu"}, {"ℹ️ Помощь": "help"}] menu: trigger: - event_type: "callback" callback_data: "menu" step: - action: "send_message" params: text: "Выберите действие:" inline: - [{"🤖 О боте": "about"}] - [{"🔙 Назад": "start"}]

Шаг 4. Загружаем базу знаний (опционально)

Добавим сценарий с RAG для ответов на вопросы. Создаём config/tenant/tenant_101/scenarios/ai.yaml:

save_knowledge: trigger: - event_type: "message" event_text: "/save_docs" step: - action: "save_embedding" params: text: | Coreness — это платформа для создания Telegram ботов. Основные возможности: - Сценарии на YAML - Хранилище данных (storage) - Работа с оплатами - RAG для контекстных ответов document_type: "knowledge" role: "user" ask_question: trigger: - event_type: "message" step: # Поиск релевантного контекста - action: "search_embedding" params: query_text: "{event_text}" document_type: "knowledge" limit_chunks: 3 min_similarity: 0.7 # AI ответ с контекстом - action: "completion" params: prompt: "{event_text}" system_prompt: "Ты — помощник. Отвечай на основе предоставленного контекста." rag_chunks: "{_cache.chunks}" model: "gpt-4o-mini" # Отправка ответа - action: "send_message" params: text: "{_cache.response}"

Что здесь происходит:

  • save_knowledge — сохраняет текст в векторное хранилище
  • ask_question — ищет релевантные фрагменты и отправляет их в AI
  • Система автоматически формирует контекст для модели

Шаг 5. Синхронизируем

Если используется GitHub-синхронизация:

# Push в репозиторий git add config/tenant/tenant_101/ git commit -m "Add tenant 101" git push # Webhook автоматически синхронизирует изменения

Или принудительно через Master Bot:

  1. Открываем master_bot
  2. Отправляем /tenant
  3. Вводим ID тенанта (101)
  4. Нажимаем "Синхронизация"
Меню Мастер бота
Меню Мастер бота

Результат

Готово. Бот отвечает на команды, обрабатывает кнопки, всё работает.

Важно: Это минимальный пример. В реальности можно добавить:

  • AI-ответы с RAG
  • Оплаты через Telegram Stars
  • Scheduled сценарии
  • Валидацию и переходы
  • Storage для хранения данных пользователей

Всё это настраивается через YAML, без единой строки кода.

Пример AI-бота

Бонус: Добавляем оплаты

Как добавить монетизацию? Собственно, через платежный модуль телеграмм. Разберем на примере Telegram Stars:

buy_premium: trigger: - event_type: "message" event_text: "/buy" step: - action: "create_invoice" params: title: "Премиум подписка" description: "Доступ к премиум функциям на 1 месяц" amount: 100 # 100 звезд currency: "XTR" handle_pre_checkout: trigger: - event_type: "pre_checkout_query" step: # Подтверждаем платеж (критично - таймаут ~10 сек) - action: "confirm_payment" params: pre_checkout_query_id: "{pre_checkout_query_id}" invoice_payload: "{invoice_payload}" handle_payment_successful: trigger: - event_type: "payment_successful" step: # Отмечаем инвойс как оплаченный - action: "mark_invoice_as_paid" params: invoice_payload: "{invoice_payload}" telegram_payment_charge_id: "{telegram_payment_charge_id}" # Активируем подписку - action: "set_user_storage" params: key: "premium_active" value: true # Отправляем подтверждение - action: "send_message" params: text: "✅ Платеж успешно обработан! Премиум активирован."

Что здесь происходит:

  1. Пользователь отправляет /buy → создаётся инвойс
  2. Пользователь нажимает "Оплатить" → Telegram отправляет pre_checkout_query
  3. Бот подтверждает платеж через confirm_payment (в течение 10 секунд)
  4. Telegram обрабатывает платеж → отправляет payment_successful
  5. Бот отмечает инвойс как оплаченный и активирует подписку

Вся логика оплат в конфиге. Не нужно писать код обработки платежей вручную.

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

Применение в бизнесе

Кому это подходит

Агентства и разработчики

Кому актуально:

  • Digital-агентства, которые делают ботов для клиентов
  • Фрилансеры, работающие с несколькими проектами
  • Разработчики, которые хотят быстро прототипировать идеи

Что дает платформа:

  • Сокращение времени на типовые задачи (отправка сообщений, обработка кнопок, базовая логика)
  • Возможность фокусироваться на уникальной логике конкретного проекта
  • Единая кодовая база вместо копипаста между проектами

Реалистичный сценарий: Агентство делает 3-4 бота в квартал. С платформой — может делать 5-7 при той же команде за счет переиспользования конфигов.

Стартапы и продуктовые команды

Кому актуально:

  • Команды, валидирующие гипотезы через MVP
  • Проекты с требованиями к размещению данных на своих серверах
  • Бизнесы, которые не хотят зависеть от SaaS-провайдеров

Что дает платформа:

  • Быстрое создание MVP (дни вместо недель)
  • Полный контроль над данными и инфраструктурой
  • Возможность менять логику без разработчиков (через конфиги)

Реалистичный сценарий: Вместо найма разработчика на 2-3 недели за 150-200 тыс. руб. — технический фаундер разворачивает MVP за выходные.

Компании с требованиями к безопасности

Кому актуально:

  • Финтех, медицина, страхование — где данные нельзя на чужих серверах
  • Корпорации с требованиями compliance-отделов
  • Проекты с интеграцией во внутренние системы

Что дает платформа:

  • Self-hosted — развертывание в своем контуре
  • Open source — возможность аудита кода
  • Плагинная архитектура — интеграция с внутренними API

Реалистичный сценарий: Банк или страховая компания может развернуть платформу в своем периметре безопасности и интегрировать с CRM.

Почему open source — преимущество

  • Прозрачность: Полный доступ к коду, можно проверить безопасность
  • Гибкость: Модификация под свои нужды, добавление интеграций
  • Отсутствие зависимости: Не платите за каждую фичу отдельно
  • Долгосрочность: Проект не исчезнет, если вендор закроется

Технологии

Стек

  • Python 3.11+ с прямой работой через Telegram Bot API (без aiogram — меньше зависимостей, выше производительность)
  • PostgreSQL 16+ с расширением pgvector для RAG (или SQLite для упрощённой версии)
  • Docker + docker-compose для развёртывания
  • Агрегаторы LLM для доступа к моделям (OpenAI, Anthropic, Google, DeepSeek через OpenRouter, Azure OpenAI и другие)

Производительность

  • Асинхронная обработка событий через asyncio — все операции неблокирующие
  • Кэширование данных и настроек — снижает нагрузку на БД
  • Оптимизация векторного поиска через HNSW-индексы pgvector — быстрый поиск даже на больших объемах
  • Параллельная обработка — боты могут параллельно обрабатывать входящие события
  • Прямая работа с Telegram Bot API — без промежуточных библиотек, меньше overhead

Почему без aiogram? Прямая работа с Telegram Bot API через aiohttp экономит ресурсы, быстрее, меньше зависимых библиотек. Всё что нужно — обработка JSON и HTTP-запросы.

Масштабирование

При росте нагрузки можно масштабировать платформу несколькими способами:

Вертикальное масштабирование:

  • Увеличение ресурсов сервера (CPU, RAM) — самый простой путь
  • Настройка PostgreSQL под нагрузку
  • Оптимизация пула соединений к БД

Горизонтальное масштабирование:

  • Несколько инстансов приложения — запуск нескольких экземпляров за load balancer
  • PostgreSQL read-replicas — для чтения (поиск по RAG, получение конфигов), запись в master
  • Redis для кэширования — опционально, снижает нагрузку на БД при частых запросах

Для большинства случаев достаточно вертикального масштабирования. Горизонтальное имеет смысл при высокой нагрузке (сотни ботов, тысячи сообщений в секунду).

Безопасность

  • Изоляция данных на уровне БД — невозможно случайно получить данные другого тенанта
  • Валидация через Pydantic — все входные параметры проверяются по схемам
  • Secrets вынесены в переменные окружения — токены и ключи не хранятся в коде
  • Автоматические бэкапы БД с настраиваемым интервалом — защита от потери данных
  • Гибкая настройка доступов — можно сконфигурировать read-only пользователей с доступом к конкретным тенантам, полезно для аналитики и аудита

Система деплоя

Автоматизированная система управления деплоем:

  • Обновление сервера из GitHub с миграциями БД
  • Версионирование через git tags
  • Graceful shutdown при обновлении (корректное завершение работы)
  • Откат на предыдущую версию Docker-образа
  • Бэкапы файлов и БД перед обновлением
# Запуск системы деплоя python tools/deployment/deployment_manager.py # Меню: # 1. Деплой в репозитории # 2. Обновление сервера # 3. Работа с БД # 4. Откат Docker образа # 5. Очистка старых образов

Планируемые фичи и улучшения

Проект выходит в open source, чтобы развивать его вместе с сообществом.

Ближайшие направления

  • Доработка деплой утилиты — улучшение процесса установки и обновлений, упрощение флоу работы с базами данных и миграциями
  • Расширение возможностей RAG — поддержка файлов (PDF, DOCX), улучшенная обработка документов
  • Больше готовых плагинов — интеграции с популярными API и сервисами, новые функции и возможности
  • Упрощение Master Bot — улучшенное управление тенантами через интерфейс
  • Выход в мини-апп Telegram — дополнительные возможности управления тенантами и новые функции через Telegram Mini App

Если вы разрабатываете ботов для клиентов, планируете автоматизацию в бизнесе или устали платить за SaaS с ограничениями — попробуйте платформу.

Это может сэкономить месяцы разработки и десятки тысяч рублей. И да, это бесплатно — open source, MIT лицензия.

Что дальше:

  • Попробуйте развернуть MVP за выходные
  • Если зайдет — ставьте звезду на GitHub
  • Есть вопросы или хотите обсудить кейс — пишите напрямую

Ссылки

Coreness — Create. Automate. Scale.

Начать дискуссию