[2026-06-20] kraken: family/how-to/vault-git-sync.md
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Vault Git Sync — Architecture & Scripts
|
||||
updated: '2026-06-02'
|
||||
updated: '2026-06-20'
|
||||
type: tech
|
||||
tags:
|
||||
- vault
|
||||
@@ -124,6 +124,29 @@ cd ~/Developer/vault-sync-test && bash test-sync.sh
|
||||
|
||||
## History
|
||||
|
||||
- **2026-06-20**: Kraken ACL fix. mcpvault (Hermes контейнер, uid 10000) не мог писать в существующие файлы vault из-за прав (EACCES). Подробно:
|
||||
|
||||
**Проблема 1 — права доступа:** файлы в vault создаются от uid 1000 (kraken через git на хосте), а mcpvault в контейнере работает от uid 10000. `patch_note` падал: `EACCES: permission denied`. `delete_note` + `write_note` срабатывали, но mcpvault при write перезаписывает файл целиком, переформатируя YAML фронтматер (убирает кавычки, меняет стиль) — шум в git-diff.
|
||||
|
||||
**Проблема 2 — экранирование backtick в patch_note:** mcpvault `patch_note` не может найти строку, содержащую тройные обратные кавычки (`` ``` ``). Пришлось якориться на соседнюю строку без backtick — например, на `\n\n## Заголовок` вместо `\`\`\`\n\n## Заголовок`.
|
||||
|
||||
**Решение — ACL ext4 (setfacl):**
|
||||
```bash
|
||||
sudo setfacl -R -m u:10000:rwx /srv/.../obsidian # mcpvault — write
|
||||
sudo setfacl -R -d -m u:10000:rwx /srv/.../obsidian # default для новых файлов
|
||||
sudo setfacl -R -m g:kraken:rwx /srv/.../obsidian # kraken (uid 1000) — write
|
||||
sudo setfacl -R -d -m g:kraken:rwx /srv/.../obsidian # default для новых файлов
|
||||
```
|
||||
|
||||
**Итоговая совместимость:** uid 10000 (mcpvault) и uid 1000 (kraken/git) могут читать и писать одни и те же файлы. `patch_note` работает без EACCES.
|
||||
|
||||
**Ограничение (mcpvault patch_note + backtick):** `patch_note` не может найти строку, содержащую тройные обратные кавычки (`` ``` ``). Пример: нужно было вставить новый раздел между closing code fence `\`\`\`` и заголовком `## Исправления (v0.0.92...`. Варианты `oldString`, которые **НЕ сработали**:
|
||||
- `"}\n\n\`\`\`\n\n## Исправления (v0.0.92..."` — не найдено
|
||||
- `"\`\`\`\n\n\n## Исправления (v0.0.92..."` — не найдено
|
||||
- Любая комбинация пустых строк между `\`\`\`` и заголовком — не найдено
|
||||
|
||||
**Что сработало:** якориться на соседнюю строку **без** обратных кавычек. Вместо `\`\`\`\n\n## Исправления...` использовать `\n\n## Исправления (v0.0.92...` — замена пустой строки + заголовка, куда перед заголовком вставляется новый контент, а сам заголовок остаётся. `patch_note(oldString="\n\n## Исправления (v0.0.92...")` — найдено и отработало.
|
||||
|
||||
- **2026-05-23**: Taiga deleted 32+ wiki files. Root cause: `git add -A` before merge staged deletions of files outside sparse cone. Fixed with scoped `git add`.
|
||||
- **2026-06-01**: "Керамика" lost from gift-ideas. Root cause: `git add $SPARSE_PATHS` failed silently when `.obsidian/` absent — patch+move not committed.
|
||||
- **2026-06-02**: Full architecture migration. Taiga `/vault` converted from `GIT_DIR=bare GIT_WORK_TREE` workaround to proper sparse clone. All clients unified on same `commit→fetch→merge→push` algorithm. Sync interval: every 5 min.
|
||||
|
||||
Reference in New Issue
Block a user