Тесты зелёные: связал бота и Strapi в одну систему

Тесты прошли — теперь деплой: как я связал Strapi и бота в одну систему
Работал над bot-social-publisher — ботом, который публикует заметки разработки на сайт borisovai.tech. И вот такая ситуация: все 70 тестов проходят, backend готов, но нужно собрать всё воедино. Потому что отдельные части уже были, а вот полноценная синхронизация потоков разработки между ботом и Strapi — вот это была задача.
Дело в том, что раньше заметки просто публиковались в Strapi как независимые статьи. А нам нужно было их организовать в потоки (threads) — так, чтобы все публикации по одному проекту жили в одном контейнере с общим описанием, категориями и тегами. Типа: “Поток разработки моего проекта: 5 заметок, последние обновления в API, фичи и баг-фиксы”.
Начал с backend на Node.js + Strapi. Добавил три ключевых компонента:
Первое — функция publishNote() теперь умеет привязывать заметку к потоку через параметр thread_external_id. Второе — новый маршрут PUT /api/v1/threads/:id позволяет обновлять описание и теги потока. И третье — поток может быть пустым контейнером, без заметок внутри. Это важно, потому что позволяет создать структуру заранее, прежде чем публиковать первую заметку.
Потом переключился на Python-сторону бота. Вот тут уже интереснее. Добавил таблицу thread_sync в SQLite — она маппит проекты на thread_external_id. Зачем? Потому что когда бот публикует вторую заметку по тому же проекту, ему нужно знать, какой поток уже создан. Без этого маппинга пришлось бы каждый раз ходить на API и искать нужный поток — это медленно и ненадёжно.
Создал отдельный модуль ThreadSync с методом ensure_thread() — он проверяет БД, и если потока нет, создаёт его через API, кеширует результат. После успешной публикации заметки запускается update_thread_digest() — это функция генерирует мини-дайджест: берёт данные из базы (“3 фичи, 2 баг-фикса”), форматирует на русском и английском, и пушит обновление потока обратно в Strapi через PUT-запрос.
Вся эта логика теперь живёт в WebsitePublisher — он инициализирует ThreadSync и вызывает его перед и после публикации. Всё асинхронно, с aiosqlite для неблокирующего доступа к базе.
Вот интересный момент: Strapi — это headless CMS, но обычно его используют как просто контейнер для контента. А здесь мы его заставляем выполнять структурирующую роль: потоки — это не просто папочки, это полноценные сущности API с собственной логикой обновления. Это требует хорошего понимания того, как работает Strapi: разницы между POST (создание) и PUT (обновление), роли external_id для связи внешних систем, обработки локализации (ru/en в одном API-вызове).
Потом коммитнул изменения. Git показал кучу файлов как modified — это из-за нормализации CRLF, Windows vs Unix. Закоммитил только три файла, которые я реально менял: database.py, thread_sync.py, website.py. Backend задеплоен на сервер.
Результат: когда бот публикует заметку с проектом “my-project”, происходит это: 1. Проверяется локальная БД → если потока нет, создаётся через API 2. Заметка летит в Strapi с привязкой к потоку 3. Тут же обновляется описание потока: “Поток разработки проекта X. 5 заметок: фичи (3), баги (2)” 4. Всё это видно на странице https://borisovai.tech/ru/threads
70 тестов проходят, 1 скипнут. Система работает. 😄
Что общего у Linux и кота? Оба делают только то, что хотят, и игнорируют инструкции.
Метаданные
- Session ID:
- grouped_C--projects-bot-social-publisher_20260210_1828
- Branch:
- main
- Dev Joke
- Что общего у Linux и кота? Оба делают только то, что хотят, и игнорируют инструкции
Часть потока:
Разработка: bot-social-publisher