Files
knowledge-base/decisions/2026-04-17-nextcloud-sync-schema.md
dttb 2ba8c52cbe decision + credentials: Nextcloud sync через rclone bisync
- Добавлен decision 2026-04-17-nextcloud-sync-schema с полной архитектурой
  (Gitea история + Nextcloud зеркало + rclone + Stop-hook)
- В credentials.md добавлен Nextcloud AIO (dttb.ru, admin, app password)
- Удалена ссылка на несуществующий LXC 129 Clawdbot
2026-04-17 22:43:11 +03:00

102 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-04-17
type: decision
tags: [nextcloud, sync, gitea, rclone, infrastructure]
---
# Синхронизация knowledge-base: Gitea + Nextcloud через rclone bisync
## Контекст
Vault `~/knowledge-base` хранился только в Gitea (`git.dttb.ru/oleg/knowledge-base.git`). Требования к надёжности и удобству:
- доступ с мобильного (iPhone Obsidian)
- мгновенная копия между устройствами без ручного `git pull/push`
- резервирование на случай проблем с git-историей
На dttb.ru развёрнут **Nextcloud AIO 32.0.6** (VM 250, 10.0.0.230:11001, NPM на `dttb.ru`). Ещё в феврале 2026 была создана папка `/Knowledge Base/` и односторонний скрипт `sync-kb-to-nextcloud.sh` на LXC 129 (Clawdbot) — но LXC 129 с тех пор удалён, скрипт не работает.
## Варианты
1. **Оставить только Gitea** — надёжно, но мобильный доступ через obsidian-git тормозной
2. **Перенести основу в Nextcloud** — хорошо для sync, но потеря git-истории
3. **Gitea основа + Nextcloud зеркало через GUI Nextcloud.app** — классика, real-time, но GUI wizard сложно автоматизировать
4. **Gitea основа + Nextcloud зеркало через rclone bisync + hook** — CLI-only, триггерится после Claude-сессий
5. **nextcloudcmd + launchd каждые 60 сек** — пробовал, **не работает**: Qt из launchd-контекста macOS получает `Host unreachable` хотя curl/ping в том же процессе работают. Специфика macOS 26 для background-агентов, обходить не смог.
## Решение
**Вариант 4 (CLI rclone bisync + Claude Code Stop-hook)** с опциональным добавлением GUI Nextcloud.app позже.
### Архитектура
```
~/knowledge-base/ ← один источник истины
├── .git/ → push в Gitea (git.dttb.ru) [история, review]
└── файлы → rclone bisync на Nextcloud [мгновенный sync]
через sync.sh, триггер Stop-hook
```
### Компоненты
- **`/Users/ai/.config/nextcloud-kb/rclone.conf`** — WebDAV ремоут `kbsync:` на `https://dttb.ru/remote.php/dav/files/admin`, app password в obscured виде
- **`/Users/ai/.config/nextcloud-kb/rclone-filter.lst`** — исключения: `.git/**`, `.claude/worktrees/**`, `.obsidian/workspace*.json`, `.obsidian/cache/**`, `.DS_Store`, sync-метаданные
- **`/Users/ai/.config/nextcloud-kb/sync.sh`** — обёртка с atomic lock (mkdir), вызывает `rclone bisync` с retry
- **`/Users/ai/.config/nextcloud-kb/app-password`** — app password (chmod 600), получен через `POST /ocs/v2.php/core/getapppassword`
- **Hook в `~/.claude/settings.json`** — Stop-event триггер, `async: true`, запускает sync.sh если cwd в ~/knowledge-base
### Почему rclone а не nextcloudcmd
- nextcloudcmd (Qt) падает с `Host unreachable` при запуске из launchd-агента
- rclone (Go) работает в CLI, двусторонний `bisync` с state-файлами
- Проще retry-логика, log-файл, exit-коды
### Почему не nextcloudcmd + launchd-агент
Внутри launchd-процесса macOS 26:
- curl/nc/ping успешно коннектятся к 10.0.0.195:443
- Go и Qt runtime получают `EHOSTUNREACH` на тот же IP
- Не DNS, не firewall, не IPv6 — глубокая специфика network-context для background-агентов
- Решение: не запускать из launchd, а триггерить из user-session (Stop-hook = user-session)
### Для real-time sync (будущее, опционально)
GUI Nextcloud.app запускается в Aqua-session (не launchd), работает без этих проблем. Настройка через wizard, 6 кликов. На данный момент отложено.
## Последствия
### Что обновить
- [x] `credentials.md` — добавить Nextcloud creds, убрать ссылки на LXC 129/10.0.0.206
- [x] `projects/dttb/proxmox-inventory.md` — актуализировать список LXC (129, 133 больше нет)
- [x] `CLAUDE.md` (vault) — убрать упоминание LXC 129 Clawdbot если есть
- [x] `claude-memory/MEMORY.md` — обновить reference_infra, убрать LXC 133
### Что надо помнить
- Изменения локально → Nextcloud автоматом **только** после завершения Claude-сессии в `~/knowledge-base`, или ручным запуском `~/.config/nextcloud-kb/sync.sh`
- Изменения с другого устройства → подтянутся следующим запуском sync.sh (не автоматом)
- Для real-time надо доделать GUI Nextcloud.app wizard
- `.git/` **не** в Nextcloud — git и nextcloud параллельные каналы, не вложенные
### Файлы экосистемы
```
~/.config/nextcloud-kb/
├── app-password chmod 600
├── rclone.conf chmod 600
├── rclone-filter.lst
├── sync.sh chmod 700
├── sync.log логи sync-обёртки
├── rclone.log подробные логи rclone
└── sync.lock.d/ mkdir-lock (временный)
```
### Credentials Nextcloud (dttb.ru)
- URL: `https://dttb.ru`
- User: `admin` / пароль `1qaz!QAZ`
- App password (для sync): хранится в `~/.config/nextcloud-kb/app-password`
- WebDAV: `https://dttb.ru/remote.php/dav/files/admin/Knowledge Base/`
- Сервер: Nextcloud AIO 32.0.6 на VM 250 (10.0.0.230:11001)
### Откат
- Остановить sync: удалить hook из `~/.claude/settings.json` + `rm -rf ~/.config/nextcloud-kb/`
- Удалить app password на сервере: User settings → Security → Devices/sessions
- Локальный vault не страдает — git remote и работает независимо