129 lines
7.3 KiB
Markdown
129 lines
7.3 KiB
Markdown
---
|
||
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'
|
||
```
|
||
|
||
**⚠️ Питфолл:** задача оформлена как **prompt**, а не как `--script`, поэтому её исполняет LLM-раунд. Последствия:
|
||
- провайдер не отвечает → тик висит до 600 с, очередь блокируется на 30–57 мин;
|
||
- агент может ответить текстом **без вызова инструмента** → статус `completed`, но скрипт **не запущен** (~6,6 % тиков).
|
||
**Правильный фикс (не сделан, требует решения Alex):** `--no-agent --script <script>`.
|
||
|
||
**Проверка результата после прогона:**
|
||
```bash
|
||
# в контейнере 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)
|
||
```
|
||
|
||
```bash
|
||
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 не вижу».
|
||
|
||
---
|
||
|
||
## Связанные заметки
|
||
|
||
- [[family/documents/vault-sync/2026-09-14-cron-api-timeout-sync-outage]] — инциденты синка, аудит executions.db
|
||
- [[personal/tasks/vault-sync-cron]] — журнал прогонов
|
||
- [[family/how-to/vault-sync-summary]] — ранняя сводка
|