diff --git a/decisions/2026-04-17-nextcloud-sync-schema.md b/decisions/2026-04-17-nextcloud-sync-schema.md new file mode 100644 index 0000000..35eda20 --- /dev/null +++ b/decisions/2026-04-17-nextcloud-sync-schema.md @@ -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 и работает независимо diff --git a/projects/dttb/credentials.md b/projects/dttb/credentials.md index 8eb8f76..72f861c 100644 --- a/projects/dttb/credentials.md +++ b/projects/dttb/credentials.md @@ -42,6 +42,19 @@ | Email | `it5870@yandex.ru` | | Пароль | `1qaz!QAZ` | +## Nextcloud AIO (VM 250 — 10.0.0.230:11001) + +| Параметр | Значение | +|----------|----------| +| URL | https://dttb.ru | +| Версия | Nextcloud 32.0.6 (AIO) | +| Логин | `admin` | +| Пароль | `1qaz!QAZ` | +| WebDAV | `https://dttb.ru/remote.php/dav/files/admin/` | +| App password Mac sync | `~/.config/nextcloud-kb/app-password` (chmod 600) | + +Подробности sync-схемы: [[../../decisions/2026-04-17-nextcloud-sync-schema|decision 2026-04-17]]. + ## Spaceweb (DNS-хостинг: niikn.com, dttb.ru, itilegent.ru) | Параметр | Значение | @@ -74,13 +87,12 @@ | Хост | Порт | Метод | |------|------|-------| -| 10.0.0.250 (Proxmox) | 22 | SSH-ключ clawdbot → root | -| 10.0.0.206 (Clawdbot) | 22 | Локальный (LXC 129) | +| 10.0.0.250 (Proxmox) | 22 | root / `1qaz!QAZ` | --- ## Заметки -- Пароль `1qaz!QAZ` используется на Proxmox и NPM +- Пароль `1qaz!QAZ` используется на Proxmox, NPM, Nextcloud - Пароль `OL260380eg` используется на MikroTik и Gitea -- SSH-ключ clawdbot автоматически добавлен в authorized_keys Proxmox +- LXC 129 (Clawdbot) удалён ~апрель 2026. Актуальные LXC по `pct list` на Proxmox: 132 code-server, 136 gitea, 137 openclaw, 138 vpn-proxy, 139 yaroslav-assistant, 103 NPM, 113 VaultWarden, 114 LinkWarden, 115 watchyourlan, 116 rustdeskserver, 134 ZnamSecurityBot