Задача: боты должны оставлять markdown-файлы в Obsidian
- копировать файлы вручную (быстро надоест);
- хранить vault в стороннем облаке (не подходит для личных данных и ботов на VPS);
- синхронизировать через Git (дает историю изменений и хорошо встраивается в файловую схему).
Архитектура
- Телефон: голос, текст, ссылки
↓
Telegram-бот на VPS
↓ пишет markdown-файл
/opt/obsidian-vault/ ← Git-репозиторий на VPS
↓ cron каждые 2 минуты
Gitea на VPS
↓ git pull каждые 5 минут
Obsidian на Mac через плагин Obsidian Git
↕ обратные симлинки
iCloud-папки для общих заметок
| Компонент | Роль | Почему выбран | Заголовок 4 | Заголовок 5 | Заголовок 6 | Заголовок 7 | Заголовок 8 | Заголовок 9 |
|---|---|---|---|---|---|---|---|---|
| Telegram-бот | Создает markdown-файлы | Удобный вход с телефона | Нужен блок | Нужен блок с табличкой для статей на вихре | Нужен блок | Нужен блок | Нужен блок с табличкой для статей на вихре | Нужен блок |
| VPS | Запускает ботов и cron | Всегда онлайн | ||||||
| Gitea | Центральный Git-репозиторий | Self-hosted, история изменений | ||||||
| Caddy | HTTPS и reverse proxy | Автоматически выпускает сертификат в типовом сценарии | ||||||
| Obsidian Git | Pull, commit и push на Mac | Работает внутри Obsidian | ||||||
| iCloud | Общие папки | Нужен для семейных и общих заметок | ||||||
| AGENTS.md | Правила для файлов | Не дает ботам засорить vault |
Почему не Obsidian Sync, Syncthing или WebDAV
| Подход | Плюсы | Минусы | Заголовок 4 | Заголовок 5 | Заголовок 6 | Заголовок 7 | Заголовок 8 | Заголовок 9 |
|---|---|---|---|---|---|---|---|---|
| Obsidian Sync | Официальный sync, минимум администрирования | Подписка, сложнее встроить ботов на VPS | Нужен блок | Нужен блок с табличкой для статей на вихре | Нужен блок | Нужен блок | Нужен блок с табличкой для статей на вихре | Нужен блок |
| Syncthing | Хорош для файловой синхронизации | Меньше контроля через историю Git | ||||||
| Git + Gitea | История изменений, self-hosted, удобно для ботов | Конфликты, нужен сервер и дисциплина | ||||||
| WebDAV/S3 | Удобно для backend-сценариев | Нужен отдельный слой для Obsidian |
Шаг 1. Переносим iCloud-папки внутрь Obsidian vault
- bash
# 1. Делаем резервную копию cp -a "iCloud/Main/AI Mindset" "iCloud/Main/AI Mindset.backup"
# 2. Копируем папку в vault cp -a "iCloud/Main/AI Mindset" "Vault/AI Mindset"
# 3. Проверяем, что файлы на месте ls "Vault/AI Mindset"
# 4. Только после проверки заменяем папку в iCloud на симлинк mv"iCloud/Main/AI Mindset" "iCloud/Main/AI Mindset.old" ln -s "$HOME/Vault/AI Mindset""$HOME/iCloud/Main/AI Mindset"
Шаг 2. Поднимаем Gitea на VPS и закрываем порт
- bash
docker run -d \ --name gitea \ -p 127.0.0.1:3000:3000 \ gitea/gitea:latest
- caddyfile
git.example.com { reverse_proxy 127.0.0.1:3000 }
- bash
cd ~/obsidian-vault git init cat > .gitignore <<'EOF' .obsidian/workspace.json obsidian/workspace.DS_Store .env .env*.local EOF git add -A git commit -m "init" git remote add origin https://git.example.com/user/vault.git git push -u origin master
Шаг 3. Настраиваем Git-синхронизацию между VPS и Mac
— Auto pull: каждые 5 минут;
— Auto commit: каждые 5 минут;
— Auto push: после commit.
- bash
docker run \ -v /opt/obsidian-vault:/home/node/vault \ your-bot-image
- yaml
services: bot: image: your-bot-image volumes: — /opt/obsidian-vault:/home/node/vault env_file: -.env
- bash
#!/bin/bash # /opt/vault-sync.sh set -e cd /opt/obsidian-vault || exit 1 git pull --rebase if [ -n "$(git status --porcelain)" ]; then git add -A git commit -m "auto-sync $(date '+%Y-%m-%d %H:%M')"git push fi # Права для контейнеров: uid 1000 = node user chown -R 1000:1000 /opt/obsidian-vault
- cron
*/2 * * * * /opt/vault-sync.sh >> /var/log/vault-sync.log 2>&1
Шаг 4. Описываем правила для ботов в AGENTS.md
Добавить в чат: # AGENTS.md ## Naming — Формат: `{project} {type} описание — YYYY-MM-DD.md` - Максимум 80 символов ## Frontmatter --- tags: [тег1, тег2] date: YYYY-MM-DD source: telegram --- ## Куда класть — Если не уверены в папке — `_inbox/` - Не класть файлы в корень vault — Боты создают новые файлы и не редактируют существующие заметки
Пример структуры vault:
Добавить в чат: obsidian-vault/ _inbox/ articles/ shopping/ tasks/ AGENTS.md .gitignore
Пример файла, который создает бот:
Добавить в чат: --- tags: [inbox, voice] date: 2026-03-27 source: telegram --- # Идея для статьи про Obsidian Короткая мысль, надиктованная голосом.
Главное правило: боты создают новые заметки, обычно в _inbox/, и не редактируют файлы, которые человек правит руками. Так меньше Git-конфликтов.
Шаг 5. Закрываем основные риски безопасности
— Gitea слушает только 127.0.0.1, а не все интерфейсы.
— Caddy отдает Gitea через HTTPS.
— Docker-порты публикуются как 127.0.0.1:X:X, если сервис не должен быть доступен напрямую.
— SSH-доступ на VPS только по ключу, парольный вход выключен.
— В Gitea включена 2FA.
— Пароль Gitea сгенерированный, не password123.
— Токены Telegram-ботов лежат в .env, а в репозиторий попадает только .env.example.
— .env, .env*.local и временные файлы добавлены в .gitignore.
— Cron пишет лог, а ошибки не остаются незамеченными.
— Vault регулярно бэкапится отдельно от Git.
Где схема ломается
— Бот и человек одновременно изменили один файл. Git получит конфликт, синхронизация остановится до ручного разбора.
— iCloud не подхватил обратный симлинк. Поэтому сначала нужна тестовая папка.
— Cron упал после git pull --rebase. Нужны лог и уведомление об ошибке.
— Контейнер пишет файлы от другого пользователя. Тогда появляются проблемы с правами.
— Бот положил заметку в корень vault. Это лечится правилами в AGENTS.md.
— Gitea недоступна во время push. Нужно повторить синхронизацию или разбирать состояние вручную.
Грабли, на которые я наступил
- bash
git config --global --add safe.directory /opt/obsidian-vault
- bash
chown -R 1000:1000 /opt/obsidian-vault
Чек-лист перед боевым запуском
— Vault пушится и пуллится вручную без конфликтов.
— Бот создает новый файл в _inbox/.
— Obsidian Git подтягивает файл на Mac.
— iCloud-папка проверена на тестовой директории.
— Есть backup до переноса боевых заметок.
— Ошибки cron попадают в лог или уведомление.
— Токены ботов не лежат в vault.
Кому подходит такая схема
— вы хотите хранить заметки в markdown и Git;
— у вас уже есть VPS или вы готовы его поддерживать;
— вам важна история изменений и self-hosted-контур;
— вы готовы иногда разбирать Git-конфликты.
— нужен официальный sync без администрирования;
— вы не хотите поддерживать VPS;
— заметки содержат данные, для которых нужен полноценный security/compliance-процесс.