2 min read
deltachat_publish

Бот для децентрализованного мессенджера Delta Chat, предназначенный для удобной мобильной публикации постов и изображений в статический блог на Astro (gluek.info и другие шаблоны на Astro).

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

🛠️ Стек и Технологии

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

✨ Ключевые Особенности

  1. Атомарный single-commit постинг: В отличие от поэтапной загрузки файлов, бот использует эндпоинт ChangeFilesOptions REST API. Текст статьи .md и все прикрепленные фотографии передаются в одном JSON-пейлоаде. В результате в Git создается ровно один коммит, а пайплайн сборки сайта вызывается только один раз.

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

    • Заголовок из первой строки автоматически очищается и транслитерируется из кириллицы в латинский URL-slug (например, Про сервис One-Facepro-servis-one-face).
    • Автоматически генерируется описание (description) из первых 150 символов поста.
    • Изображения автоматически разворачиваются в теги ![filename](path).
  3. Поддержка гибких структур Astro:

    • single_file (как в gluek.info): посты сохраняются в src/content/blog/<slug>.md, а медиа — в public/images/<slug>/.
    • folder (как в Astro Nano): пост сохраняется в src/content/blog/<slug>/index.md, а медиафайлы — рядом в ту же папку с относительными ссылками ./image.jpg.
  4. Безопасность и сквозное шифрование:

    • Сквозное шифрование (E2EE): Передача сообщений между мессенджером и ботом защищена E2EE (OpenPGP/Autocrypt).
    • Строгая авторизация: Бот принимает посты только от авторизованного администратора, проверяя совпадение адреса почты и криптографического OpenPGP fingerprint (/initadmin или CLI-скрипт set_admin.py). Все попытки сторонней публикации отвергаются (⛔ Access Denied).
    • Защита токенов: Токен доступа к Git API (FORGEJO_TOKEN) хранится исключительно в переменном окружении .env на сервере и не раскрывается клиентам.