Статус:✅ работает на всех 3 узлах (протестировано 2026-05-13, двусторонний sync с конфликтами)
Архитектура
Eagle (Mac, ~/obsidian — полный vault)
│ push/pull via SSH
▼
TrueNAS bare repo
mallexxx.duckdns.org:/mnt/RED_2TB/storage/git/obsidian-vault.git
│
├── Taiga (sparse: personal/ family/)
│ vault: /mnt/RED_2TB/docker/hermes/vault
│ скрипт на хосте TrueNAS: ~/sync-vault.sh
│
└── Kraken (sparse: personal/ family/)
vault: ~/obsidian
скрипт: ~/scripts/sync-vault.sh
Узлы
Узел
Vault путь
Scope
Скрипт
Крон
Eagle
~/obsidian
full vault
~/scripts/sync-vault.sh
launchd com.sync-vault (5 мин; ⚠️ НЕ Hermes cron — см. vault-git-sync.md §Scripts)
Kraken
~/obsidian
sparse: personal/ family/
~/scripts/sync-vault.sh
0 * * * * (crontab)
Taiga
/mnt/RED_2TB/docker/hermes/vault
sparse: personal/ family/
~/sync-vault.sh (на хосте!)
0 * * * * (Hermes cron job)
⚠️Taiga: скрипт запускается на хосте TrueNAS (не внутри контейнера hermes-taiga).
Причина: ZFS ACL дают доступ к bare repo только пользователю truenas_admin.
Vault примонтирован в контейнер как /vault:rw из /mnt/RED_2TB/docker/hermes/vault.
Логика sync (одинакова на всех 3)
1. git stash (если есть локальные изменения)
2. git fetch origin main
3. git merge origin/main --no-edit
└─ при конфликте: git add -A, PULL_OK=conflict
4. git stash pop (если был stash)
└─ при конфликте pop: git add -A
5. git add -A && git commit (если есть изменения — staged ИЛИ unstaged ИЛИ untracked)
6. git push origin main
Конфликты: не теряются — остаются в файлах как conflict markers, коммитятся с пометкой "conflict markers present". Ручного разрешения не требуется для текстовых заметок.
Скрипты — детали
Eagle: ~/scripts/sync-vault.sh
Дополнительно: генерирует commit message через claude -p (если claude доступен)