Files
obsidian-vault/family/how-to/vault-sync-pipeline.md
T

8.5 KiB
Raw Blame History

title, aliases, tags, created, updated
title aliases tags created updated
Vault sync — архитектура и ручной прогон
vault-sync
синк vault
sync-vault.sh
телефон не видит vault
family
how-to
vault
sync
syncthing
cron
2026-09-15 2026-09-15

Vault sync — архитектура и ручной прогон

Зачем документ: правки в vault (Obsidian) на Mac не появляются на телефоне сами по себе. Есть отдельная петля синхронизации с тремя фазами, которая гоняется cron-задачей. Без прогона этой петли телефон правку не увидит. Инциденты синка (таймауты LLM, «тик completed но скрипт не запущен») — family/documents/vault-sync/2026-09-14-cron-api-timeout-sync-outage.


1. Три звена (не путать!)

Звено Что это Кто驱动
1. Рабочий клон Mac /Users/admin/obsidian — где правит агент агент (git add/commit/push)
2. Bare-репозиторий /mnt/RED_2TB/storage/git/obsidian-vault.git на NAS (mallexxx.duckdns.org) приём push от Mac
3. SyncThing-папка /mnt/RED_2TB/storage/obsidian-syncthing на NAS раздаёт на телефон через SyncThing

⚠️ ГЛАВНАЯ ОШИБКА: думать, что git push с Mac = правка на телефоне. git push доезжает только до bare (звено 2). Телефон читает звено 3obsidian-syncthing. Между ними — петля sync-vault.sh, которая делает pull в звено 3.

Проверка расхождения (диагностика «телефон не видит»)

# Mac
cd /Users/admin/obsidian && git log --oneline -1

# NAS: все клоны должны быть на ТОМ ЖЕ коммите, что Mac
ssh truenas_admin@mallexxx.duckdns.org '
  cd /mnt/RED_2TB/storage/git/obsidian-vault.git   && echo -n "bare:      " && git log --oneline -1 main
  cd /mnt/RED_2TB/storage/obsidian-syncthing       && echo -n "syncthing: " && git log --oneline -1
  cd /mnt/RED_2TB/storage/obsidian                 && echo -n "obsidian:  " && git log --oneline -1'

Если syncthing: отстаёт — телефон правку не увидит, пока не прогонится sync-петля.


2. sync-vault.sh — три фазы

Скрипт: /opt/data/sync-vault.sh — живёт в окружении Hermes (контейнер), НЕ на NAS. На NAS его нет (ls /opt/data/sync-vault.sh → нет файла), поэтому пулль «руками оттуда» не выйдет. Лог: /tmp/vault-sync.log (тоже в контейнере).

Скрипт печатает по три timestamped строки Pushed ✓ — по одной на фазу:

Фаза Что делает
[syncthing] стягивает изменения с Eagle/Кракена, коммитит и пушит
[taiga-vault] пушит изменения из vault/
[syncthing-out] пушит в SyncThing-папку → то, что увидит телефон

Признак успеха: три строки Pushed ✓. Если в логе за тик ноль строк — скрипт вообще не запускался (см. инцидент 2026-09-14, «второй режим отказа»).


3. Как прогнать синк вручную

Cron-задача Hermes: sync-vault, id 29851c413903, расписание */5 * * * *, prompt = bash /opt/data/sync-vault.sh >> /tmp/vault-sync.log 2>&1.

# 1) Найти задачу
cronjob action='list'

# 2) Прогнать принудительно
cronjob action='run' job_id='29851c413903'

Прямой путь (проверен фактом 2026-09-15) — быстрее, чем cronjob run

Скрипт исполняется внутри контейнера hermes-taiga на NAS. Вызвать напрямую:

ssh truenas_admin@mallexxx.duckdns.org \
  'docker exec hermes-taiga bash /opt/data/sync-vault.sh 2>&1 | tail -20'

Признак успеха — три строки Pushed ✓:

[<TS>] [taiga-vault]   Pushed ✓
[<TS>] [syncthing]     Pushed ✓
[<TS>] [syncthing-out] Pushed ✓

Лог: docker exec hermes-taiga tail -12 /tmp/vault-sync.log

Скрипт sync-vault-taiga.sh

Локальная копия для чтения: ~/.hermes/hermes-whale/sync-vault-taiga.sh (3342 б). /vault = /mnt/RED_2TB/storage/obsidian (sparse: personal/, family/, .obsidian/) · /vault.git = bare · /obsidian-syncthing = SyncThing-папка. Авторы коммитов: taiga@hermes (пушит агент), syncthing@hermes (пушит телефон). core.fileMode false — обязателен (иначе chmod-варнинги root vs UID 950 на ZFS). Конфликты скрипт НЕ разрешает — оставляет маркеры и коммитит.

⚠️ Питфолл: задача оформлена как prompt, а не как --script, поэтому её исполняет LLM-раунд. Последствия:

  • провайдер не отвечает → тик висит до 600 с, очередь блокируется на 30–57 мин;
  • агент может ответить текстом без вызова инструмента → статус completed, но скрипт не запущен (~6,6 % тиков). Правильный фикс (не сделан, требует решения Alex): --no-agent --script <script>.

Проверка результата после прогона:

# в контейнере Hermes
tail -6 /tmp/vault-sync.log          # ожидаем три «Pushed ✓»
# на NAS — все три клона на одном коммите
ssh truenas_admin@mallexxx.duckdns.org '
  cd /mnt/RED_2TB/storage/obsidian-syncthing && git log --oneline -1'

4. Питфолл: git fetch origin на NAS не работает

В клонах на NAS remote настроен как origin → /vault.git — это путь внутри контейнера Hermes, а не на NAS.

$ cd /mnt/RED_2TB/storage/obsidian-syncthing && git remote -v
origin  /vault.git (fetch)
origin  /vault.git (push)
git fetch origin    # → Please make sure you have the correct access rights and the repository exists
git merge --ff-only origin/main   # → Already up to date   (ложь — реально отстаёт)

Вывод: «Always up to date» на NAS не значит, что приехало — remote ведёт в недоступный путь. Пулль в NAS-клоны из NAS невозможен. Обновление звена 3 делает только sync-vault.sh из контейнера Hermes. Не тратить время на git fetch по SSH на NAS — идти сразу в cronjob action='run'.


5. Контрольный список «правка должна дойти до телефона»

  1. cd /Users/admin/obsidian && git add -A && git commit -m "..." — коммит на Mac.
  2. git push nas HEADпроверить, что push прошёл (4f156ee..71efdd0 HEAD -> main). git status --short → пусто = рабочее дерево чисто.
  3. Прогнать sync-петлю: cronjob action='run' job_id='29851c413903'.
  4. Проверить: tail /tmp/vault-sync.log → три Pushed ✓; NAS-клон obsidian-syncthing на том же коммите.
  5. Только после шага 3–4 правка появится на телефоне.

⚠️ git push без шага 3 = правка есть на Mac и в bare, но телефон её не видит. Это и есть исходная жалоба «какого хуя я её на телефоне по syncthing не вижу».


Связанные заметки