2 min read
deltachat_publish

Раньше для каждого нового поста в блог приходилось открывать ноутбук или просить агента сделать коммит. Чтобы публиковать короткие заметки и фотографии прямо с телефона на ходу, я написал бота для децентрализованного мессенджера Delta Chat.

Это практическое воплощение принципов IndieWeb / POSSE (Publish on Own Site, Syndicate Elsewhere): мой репозиторий на git.gluek.info остаётся единственным источником правды (Single Source of Truth), а отправка сообщения в чат превращается в публикацию на сайте буквально за минуту.

Стек

  • Язык: Python 3.11 (asyncio)
  • Мессенджер SDK: deltachat2 RPC + deltabot_cli
  • Интеграция с Git: REST API Forgejo / Gitea (ChangeFilesOptions)
  • База данных: SQLite (авторизация владельца, лог постов и статистика)
  • Деплой: Docker + Docker Compose + Caddy
  • Уведомления: ntfy (ntfy.gluek.info)

Как это устроено

1. Атомарный single-commit постинг

Главная проблема обычной загрузки файлов через API — если грузить текст статьи и каждую фотографию по отдельности, на каждый файл создаётся отдельный коммит и каждый раз запускается тяжёлый CI/CD пайплайн сборки.

Здесь используется эндпоинт ChangeFilesOptions в REST API Forgejo. Текст .md и все прикреплённые картинки упаковываются в один JSON-запрос. В итоге в Git создаётся ровно один коммит, а сборка сайта в Forgejo Actions запускается один раз.

2. Автоматическая обработка на лету

Я просто пишу боту сообщение:

  1. Первая строка становится заголовком (автоматом транслитерируется в аккуратный URL-slug, например: Про сервис One-Facepro-servis-one-face).
  2. Первые 150 символов уходят в description для превью и RSS.
  3. Прикреплённые фотографии бот сам прописывает в Markdown как ![filename](path).

Поддерживаются оба формата структуры Astro: как single_file (пост в src/content/blog/<slug>.md, картинки в public/images/<slug>/), так и folder (пост в src/content/blog/<slug>/index.md с медиафайлами рядом).

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

  • E2EE из коробки: всё общение с ботом идёт через децентрализованный почтовый транспорт с автоматическим сквозным шифрованием Autocrypt / OpenPGP.
  • Строгая авторизация: бот принимает сообщения только от владельца. При инициализации проверяется не только email, но и PGP fingerprint отправителя — любые чужие сообщения отсекаются с ⛔ Access Denied.
  • Токены: FORGEJO_TOKEN живёт только в .env на сервере и клиентам не светится.

Исходный код

Репозиторий открыт на GitHub: mrgluek/deltachat_publish, а также зеркалируется на моём сервере: git.gluek.info/gluek/deltachat_publish.

Подробнее о запуске я также рассказывал в отдельной заметке в блоге.