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
This commit is contained in:
dttb
2026-04-17 22:10:44 +03:00
parent 59186d9a0b
commit 2ba8c52cbe
2 changed files with 117 additions and 4 deletions

View File

@@ -0,0 +1,101 @@
---
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 и работает независимо