Раньше для каждого нового поста в блог приходилось открывать ноутбук или просить агента сделать коммит. Чтобы публиковать короткие заметки и фотографии прямо с телефона на ходу, я написал бота для децентрализованного мессенджера Delta Chat.
Это практическое воплощение принципов IndieWeb / POSSE (Publish on Own Site, Syndicate Elsewhere): мой репозиторий на git.gluek.info остаётся единственным источником правды (Single Source of Truth), а отправка сообщения в чат превращается в публикацию на сайте буквально за минуту.
Стек
- Язык: Python 3.11 (asyncio)
- Мессенджер SDK:
deltachat2RPC +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. Автоматическая обработка на лету
Я просто пишу боту сообщение:
- Первая строка становится заголовком (автоматом транслитерируется в аккуратный URL-slug, например:
Про сервис One-Face→pro-servis-one-face). - Первые 150 символов уходят в
descriptionдля превью и RSS. - Прикреплённые фотографии бот сам прописывает в Markdown как
.
Поддерживаются оба формата структуры 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.
Подробнее о запуске я также рассказывал в отдельной заметке в блоге.