Flush context blocks faster to avoid delayed indexing and use sender_id-based labels when Telegram sender objects are unavailable in historical messages. Co-authored-by: Cursor <cursoragent@cursor.com>
8.3 KiB
DBBot: production-схема (отдельные n8n/Qdrant + tg-userbot)
Этот проект рассчитан на ситуацию, когда:
n8nуже запущен и доступен по URL;qdrantуже запущен отдельно;- бот в чужую группу добавить нельзя;
- сообщения читаются через
Telethon userbotиз отдельного Docker-контейнера.
Архитектура
Поток данных:
script.py(в контейнере) читает историю и новые сообщения из Telegram-группы.- Скрипт отправляет события в
n8nwebhookPOST /webhook/tg-inbox. - Единый workflow в
n8n:- нормализует метаданные,
- склеивает сообщения в контекстные блоки,
- пишет в
Qdrant.
- В этой же схеме работает RAG-ответ через
AI Agent+Qdrant Retrieve Tool.
Структура проекта
dbbot/
├── redme.md # этот файл
├── script.py # Telethon userbot sender -> n8n webhook
├── generate_session.py # генерация новой StringSession
├── requirements.txt # зависимости python
├── Dockerfile # контейнер для script.py
├── .gitignore # исключения (секреты, кеш, сессия)
├── .env.example # пример переменных для контейнера
├── session_data/
│ └── session.session # StringSession (создаешь сам)
└── DBBot Unified n8n Qdrant.json # единый workflow (ingest + rag)
Что подготовить перед первым запуском
1) n8n
Импортируй DBBot Unified n8n Qdrant.json и привяжи credentials:
Qdrant APIOllama APITelegram API(для reply-ветки через Telegram Trigger)
Проверь:
- путь webhook:
tg-inbox - workflow переведен в
Active
2) Файл сессии Telethon
Создай файл:
session_data/session.session
Внутри должна быть одна строка StringSession без переносов и пробелов по краям.
Если нужно сгенерировать новую сессию (например, для IPv6), используй:
export TG_API_ID=<your_api_id>
export TG_API_HASH=<your_api_hash>
export SESSION_FILE_PATH=./session_data/session.session
python3 generate_session.py
Скрипт первым шагом спросит режим подключения:
1) IPv42) IPv6
Если запуск неинтерактивный, используется значение TG_USE_IPV6 из окружения.
3) Переменные окружения для контейнера
Сделай локальный .env:
cp .env.example .env
Заполни значения:
TG_API_IDTG_API_HASHTG_GROUP_ID(например-100...)SESSION_FILE_PATH=/app/session/session.sessionHISTORY_CHECK_FILE=/app/session/history_done.flagN8N_WEBHOOK_URL=https://<твой-n8n-домен>/webhook/tg-inboxTG_USE_IPV6=false(обычно для серверов так стабильнее)TG_CONNECT_TIMEOUT=20TG_REQUEST_RETRIES=10TG_CONNECTION_RETRIES=20TG_RETRY_DELAY=5TG_RECONNECT_WAIT=15
Если n8n локально, можно http://localhost:5678/webhook/tg-inbox.
Подробный цикл запуска проекта
docker-compose.yaml в этом проекте содержит только один сервис: tg-userbot.
Шаг 1. Поднять контейнер tg-userbot
Из корня проекта:
docker compose up -d --build
Шаг 2. Проверить, что webhook получает данные
- Открой
Executionsвn8n. - Убедись, что появились вызовы
Webhook TG Inbox. - Проверь, что далее проходят
Build Context BlockиQdrant Insert.
Шаг 3. Проверить RAG-ответ
- Напиши вопрос Telegram-боту, подключенному к
Telegram Triggerв workflow. - Проверь выполнение ветки
AI Agent. - Убедись, что узел
Qdrant Retrieve Toolвызван и ответ ушел черезSend Telegram Reply.
Эксплуатационный цикл (после запуска)
- Скрипт работает в контейнере постоянно:
- при первом запуске делает исторический прогон;
- затем обрабатывает новые сообщения.
- Если нужно повторить историческую загрузку:
- останови контейнер;
- удали
session_data/history_done.flag; - запусти контейнер снова.
Команды:
docker compose stop
rm -f session_data/history_done.flag
docker compose up -d
Управление и диагностика
Логи контейнера:
docker compose logs -f tg-userbot
Проверить, что контейнер жив:
docker ps --filter name=dbbot-userbot
Перезапустить после изменения .env:
docker compose up -d --build --force-recreate
Если в логах Connection to Telegram failed ... TimeoutError:
- Проверь доступность Telegram с хоста (фаервол/провайдер/блокировки).
- Оставь
TG_USE_IPV6=falseв.env. - Подними таймаут/ретраи, например:
TG_CONNECT_TIMEOUT=30TG_CONNECTION_RETRIES=30TG_RECONNECT_WAIT=20
- Перезапусти контейнер:
docker compose up -d --build --force-recreate
docker compose logs -f tg-userbot
Если в n8n при активации workflow ошибка:
The connection timed out, consider setting the 'Retry on Fail' option
- Открой в workflow узлы:
Telegram TriggerQdrant InsertQdrant Retrieve ToolEmbeddings For InsertEmbeddings For RetrieveOllama Chat ModelSend Telegram Reply
- Для каждого включи
Retry on Failи выставь:Max Tries = 5Wait Between Tries = 5000 ms
- Убедись, что из среды
n8nдоступны:- Telegram API (для
Telegram Trigger) - URL Ollama
- URL Qdrant
- Telegram API (для
- Если снова падает на активации, временно отключи ветку
Telegram Triggerи активируй ingest-ветку (Webhook TG Inbox) отдельно.
Формат payload, который скрипт шлет в n8n
{
"text": "текст сообщения",
"metadata": {
"date": "2026-06-23T00:00:00Z",
"message_id": 123,
"chat_id": "-100...",
"sender_id": "456",
"sender_name": "@username",
"author_label": "@username",
"author": {
"id": "456",
"username": "username",
"display_name": "Ivan Ivanov",
"label": "@username"
},
"reply_to_message_id": 122,
"replied_to_author_label": "@other_user",
"replied_to_author": {
"id": "777",
"username": "other_user",
"display_name": "Petr Petrov",
"label": "@other_user"
},
"thread_id": "122",
"edit_date": "",
"entities": [
{ "type": "MessageEntityUrl", "offset": 10, "length": 20 }
],
"attachment": {
"has_media": false
},
"group_id": "-100...",
"source": "telegram_group"
}
}
Параметры склейки сообщений в n8n
В узле Build Context Block:
WINDOW_MS = 5 минутMAX_MESSAGES = 3MIN_MESSAGES_TO_FLUSH = 1
Рекомендации:
- если всё ещё есть задержка индексации:
MAX_MESSAGES = 1-2; - если нужен более широкий контекст:
WINDOW_MS = 10-20 минут,MAX_MESSAGES = 5-8.