--- tags: - obsidian - sync - git - how-to created: '2026-05-13' updated: '2026-05-13' status: active --- # Obsidian Sync — Eagle ↔ Taiga ↔ Kraken **Статус:** ✅ работает на всех 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 доступен) - Remote name: `nas` (не `origin`) - git user: глобальный (`admin@eagle`) ### Kraken: `~/scripts/sync-vault.sh` - git user задан в скрипте: `kraken@hermes` / `Kraken` - Переменные: `VAULT_DIR` (default: `~/obsidian`), `REMOTE_URL` (default: `origin`) - Sparse checkout: `personal/ family/` (задан при инициализации vault) ### Taiga: `~/sync-vault.sh` - git user задан в скрипте: `taiga@hermes` / `Taiga` - `git config core.fileMode false` — ZFS не сохраняет exec bits - Hardcoded paths: vault=`/mnt/RED_2TB/docker/hermes/vault`, remote=`file:///mnt/RED_2TB/storage/git/obsidian-vault.git` ## SSH ключи | Узел | Ключ | Добавлен в authorized_keys | |------|------|--------------------------| | Eagle | `~/.ssh/id_rsa` | ✅ TrueNAS (`truenas_admin`) | | Kraken | `~/.ssh/id_rsa` | ✅ TrueNAS (`truenas_admin`) | | Taiga | file:// (локальный) | — (не нужен) | ## Obsidian MCP | Узел | Команда | Vault | |------|---------|-------| | Eagle | `/opt/homebrew/bin/obsidian-mcp ~/obsidian` | full | | Kraken | `npx obsidian-mcp /home/kraken/obsidian` | sparse | | Taiga | `npx obsidian-mcp /vault` | sparse (контейнерный путь) | ## Диагностика ```bash # Проверить последний sync ssh kraken@192.168.1.15 "tail -5 /tmp/vault-sync.log" ssh truenas_admin@mallexxx.duckdns.org "tail -5 /tmp/vault-sync.log" # Запустить sync вручную ssh kraken@192.168.1.15 "bash ~/scripts/sync-vault.sh" ssh truenas_admin@mallexxx.duckdns.org "bash ~/sync-vault.sh" # Посмотреть историю коммитов в bare repo ssh truenas_admin@mallexxx.duckdns.org "git -C /mnt/RED_2TB/storage/git/obsidian-vault.git log --oneline -10" ``` ## Связанные заметки - [[openmediavault-rpi5]] — Kraken NAS setup (шаги 11–12) - [[truenas-infrastructure]] — TrueNAS инфраструктура, bare repo, ACL