Add unified n8n workflow, userbot ingestion script, and detailed README for running n8n with a separate Dockerized Telethon collector. Co-authored-by: Cursor <cursoragent@cursor.com>
6.3 KiB
6.3 KiB
DBBot: production-схема (n8n + отдельный userbot-контейнер)
Этот проект рассчитан на ситуацию, когда:
n8nуже запущен и доступен по URL;- бот в чужую группу добавить нельзя;
- сообщения читаются через
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
├── requirements.txt # зависимости python
├── Dockerfile # контейнер для script.py
├── .env.example # пример переменных для контейнера
├── session_data/
│ └── session.session # StringSession (создаешь сам)
├── DBBot Unified n8n Qdrant.json # единый workflow (ingest + rag)
└── Работа с базой (3).json # старый/альтернативный workflow
Что подготовить перед первым запуском
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 без переносов и пробелов по краям.
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-inbox
Если n8n локально, можно http://localhost:5678/webhook/tg-inbox.
Подробный цикл запуска проекта
Шаг 1. Собрать контейнер userbot
Из корня проекта:
docker build -t dbbot-userbot:latest .
Шаг 2. Запустить контейнер
docker run -d \
--name dbbot-userbot \
--env-file .env \
-v "$(pwd)/session_data:/app/session" \
--restart unless-stopped \
dbbot-userbot:latest
Шаг 3. Проверить, что webhook получает данные
- Открой
Executionsвn8n. - Убедись, что появились вызовы
Webhook TG Inbox. - Проверь, что далее проходят
Build Context BlockиQdrant Insert.
Шаг 4. Проверить RAG-ответ
- Напиши вопрос Telegram-боту, подключенному к
Telegram Triggerв workflow. - Проверь выполнение ветки
AI Agent. - Убедись, что узел
Qdrant Retrieve Toolвызван и ответ ушел черезSend Telegram Reply.
Эксплуатационный цикл (после запуска)
- Скрипт работает в контейнере постоянно:
- при первом запуске делает исторический прогон;
- затем обрабатывает новые сообщения.
- Если нужно повторить историческую загрузку:
- останови контейнер;
- удали
session_data/history_done.flag; - запусти контейнер снова.
Команды:
docker stop dbbot-userbot
rm -f session_data/history_done.flag
docker start dbbot-userbot
Управление и диагностика
Логи контейнера:
docker logs -f dbbot-userbot
Проверить, что контейнер жив:
docker ps --filter name=dbbot-userbot
Перезапустить после изменения .env:
docker rm -f dbbot-userbot
docker run -d \
--name dbbot-userbot \
--env-file .env \
-v "$(pwd)/session_data:/app/session" \
--restart unless-stopped \
dbbot-userbot:latest
Формат 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 = 20 минутMAX_MESSAGES = 12MIN_MESSAGES_TO_FLUSH = 3
Рекомендации:
- меньше блоки:
MAX_MESSAGES = 8-10; - шире контекст:
WINDOW_MS = 30-40 минут.