--- title: "Vault sync — архитектура и ручной прогон" aliases: [vault-sync, синк vault, sync-vault.sh, телефон не видит vault] tags: [family, how-to, vault, sync, syncthing, cron] created: 2026-09-15 updated: 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).** Телефон читает **звено 3** — `obsidian-syncthing`. Между ними — петля `sync-vault.sh`, которая делает pull в звено 3. ### Проверка расхождения (диагностика «телефон не видит») ```bash # 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`. ```bash # 1) Найти задачу cronjob action='list' # 2) Прогнать принудительно cronjob action='run' job_id='29851c413903' ``` ### ✅ Прямой путь (проверен фактом 2026-09-15) — быстрее, чем `cronjob run` Скрипт исполняется **внутри контейнера `hermes-taiga`** на NAS. Вызвать напрямую: ```bash ssh truenas_admin@mallexxx.duckdns.org \ 'docker exec hermes-taiga bash /opt/data/sync-vault.sh 2>&1 | tail -20' ``` **Признак успеха** — три строки `Pushed ✓`: ``` [] [taiga-vault] Pushed ✓ [] [syncthing] Pushed ✓ [] [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