130 lines
6.2 KiB
Markdown
130 lines
6.2 KiB
Markdown
---
|
||
title: "🔄 Vault sync — как работает и как запустить"
|
||
tags: [vault-sync, infrastructure, obsidian, syncthing, taiga]
|
||
updated: 2026-09-15
|
||
---
|
||
|
||
# 🔄 Vault sync — как работает и как запустить
|
||
|
||
> **Операционный документ.** Как правка из vault доезжает до телефона и что делать, если не доехала.
|
||
> Инциденты — в этой же папке `family/documents/vault-sync/`.
|
||
|
||
---
|
||
|
||
## 1. Архитектура
|
||
|
||
```
|
||
Mac ~/obsidian ──git push──▶ bare: /mnt/RED_2TB/storage/git/obsidian-vault.git
|
||
(IS the remote, /vault.git внутри контейнера)
|
||
│
|
||
│ git merge
|
||
▼
|
||
┌──────────────────────────────────────────────────────────┐
|
||
│ контейнер hermes-taiga · /opt/data/sync-vault.sh │
|
||
│ ТРИ фазы: │
|
||
│ ① taiga → /vault = .../storage/obsidian │
|
||
│ ② syncthing → /obsidian-syncthing ← SyncThing → 📱 │
|
||
│ ③ syncthing-out → push обратно в bare │
|
||
└──────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Спайс:** `/vault` — sparse-checkout (`personal/`, `family/`, `.obsidian/`). Пуш из taiga-фазы — только эти пути.
|
||
|
||
| Путь | Что это |
|
||
|---|---|
|
||
| `~/obsidian` (Mac) | рабочий клон vault (править тут) |
|
||
| `/mnt/RED_2TB/storage/git/obsidian-vault.git` | **bare-репозиторий = remote** |
|
||
| `/mnt/RED_2TB/storage/obsidian` | `/vault` — taiga-воркtree (sparse) |
|
||
| `/mnt/RED_2TB/storage/obsidian-syncthing` | **раздаётся SyncThing'ом на телефон** |
|
||
| `/opt/data/sync-vault.sh` (в контейнере) | сам скрипт синка |
|
||
|
||
---
|
||
|
||
## 2. 🔴 ГЛАВНОЕ: `git push` НЕ доводит правку до телефона
|
||
|
||
**Факт, стоивший времени 2026-09-15.** Пуш на bare — это только полдела. До телефона доводит **cron-скрипт `sync-vault.sh` внутри контейнера `hermes-taiga`**.
|
||
|
||
Если после правки телефона не видно — **причина почти всегда в этом**: синк не прогонялся.
|
||
|
||
---
|
||
|
||
## 3. Запустить синк вручную
|
||
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org \
|
||
'docker exec hermes-taiga bash /opt/data/sync-vault.sh 2>&1 | tail -20'
|
||
```
|
||
|
||
**Признак успеха** — три строки:
|
||
```
|
||
[<TS>] [taiga] ... Pushed ✓
|
||
[<TS>] [syncthing] Syncthing: synced with bare repo ✓ / Pushed ✓
|
||
[<TS>] [syncthing-out] Pushed ✓
|
||
```
|
||
|
||
**Если не видишь — SyncThing раздаст в течение минуты.**
|
||
|
||
---
|
||
|
||
## 4. Cron-задача
|
||
|
||
| Параметр | Значение |
|
||
|---|---|
|
||
| Название | `sync-vault` |
|
||
| id | `29851c413903` |
|
||
| Расписание | `*/5 * * * *` |
|
||
| prompt | `bash /opt/data/sync-vault.sh >> /tmp/vault-sync.log 2>&1` |
|
||
| Живёт | в контейнере `hermes-taiga` (не на Mac!) |
|
||
| Лог | `/tmp/vault-sync.log` (в контейнере) |
|
||
|
||
> ⚠️ Задача оформлена как **prompt** (LLM-раунд), поэтому наследует риски провайдера: таймауты блокируют очередь, а ~6 % тиков завершаются `completed` **без запуска скрипта**. Данные не теряются (git идемпотентен), но каденция ниже номинала. Разбор — [[2026-09-14-cron-api-timeout-sync-outage]].
|
||
|
||
**Смотреть лог:**
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org 'docker exec hermes-taiga tail -12 /tmp/vault-sync.log'
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Проверить, что всё сошлось
|
||
|
||
Все три репозитория должны быть на **одном коммите**:
|
||
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org '
|
||
cd /mnt/RED_2TB/storage/obsidian-syncthing && echo -n "syncthing: " && git log --oneline -1
|
||
cd /mnt/RED_2TB/storage/obsidian && echo -n "vault: " && git log --oneline -1
|
||
cd /mnt/RED_2TB/storage/git/obsidian-vault.git && echo -n "bare: " && git log --oneline -1 main
|
||
'
|
||
```
|
||
|
||
На Mac: `cd ~/obsidian && git log --oneline -1`
|
||
|
||
**Рабочие деревья должны быть чистыми:** `git status --porcelain` → пусто.
|
||
|
||
---
|
||
|
||
## 6. Скрипт `sync-vault-taiga.sh` (локальная копия)
|
||
|
||
Локальная копия для чтения: `~/.hermes/hermes-whale/sync-vault-taiga.sh` (3342 б, 2026-05-29).
|
||
Описание из шапки скрипта:
|
||
- `taiga@hermes` — пушит Hermes-агент
|
||
- `syncthing@hermes` — пушит телефон через SyncThing
|
||
- `core.fileMode false` (иначе chmod-варнинги root vs UID 950 на ZFS)
|
||
|
||
**Что делает по шагам:**
|
||
1. **taiga:** коммит локальных изменений → `git merge main` (сюда пушит Eagle) → коммит → push в bare.
|
||
2. **syncthing:** коммит локальных (от телефона) → `git fetch origin main` → `merge origin/main` → `push origin main`.
|
||
3. **syncthing-out:** финальный push.
|
||
|
||
Конфликты скрипт **не разрешает** — оставляет маркеры и коммитит (осознанное решение).
|
||
|
||
---
|
||
|
||
## Связанные
|
||
|
||
- [[family/documents/vault-sync/2026-09-14-cron-api-timeout-sync-outage]] — разрыв синка из-за таймаутов LLM
|
||
- [[family/documents/vault-sync/2026-09-04-git-identity-loss-silent-commit-failure]] — потеря git-identity
|
||
- [[family/documents/vault-sync/2026-08-31-syncthing-truenas-incident]] — инцидент SyncThing
|
||
- [[family/how-to/truenas-infrastructure]] — инфраструктура TrueNAS
|