Идея: near-realtime синк с Obsidian на мобильных через LiveSync (CouchDB), поверх git-sync #153
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Идея: near-realtime синхронизация с Obsidian на мобильных через LiveSync (CouchDB), поверх git-sync
Контекст
В PR #119 (
feat/git-sync, pulls/119) уже построен двусторонний синк страниц Docmost ↔ Markdown-vault поверх git. Идея — добавить near-realtime синк с Obsidian на телефонах (iOS/Android), не используя git как мобильный транспорт.Почему не git на телефоне:
obsidian-gitна мобильных использует isomorphic-git, мейнтейнер сам не рекомендует его на телефоне (OutOfMemoryError на крупных хранилищах, нет фоновой синхронизации). Решение — Obsidian LiveSync (CouchDB/PouchDB): непрерывная репликация (правки за 1–2 сек), chunk-level авто-merge, E2EE, iOS/Android.Ключевое наблюдение
Дорогую половину уже сделали в #119. Точка сопряжения движка с «внешним миром Markdown» — это папка vault (
<GIT_SYNC_DATA_DIR>/<spaceId>, рабочее дерево веткиmain). Движок уже принимает внешние правки файлов (ручные + внешнийgit pushчерез HTTP-backend) на шаге pushcommit('local: working-tree changes'). Значит любой агент, пишущий в эту папку, автоматически участвует в синке — конвертер иGitSyncClientтрогать не нужно. Производимая движком vault-папка уже является валидным Obsidian-vault (Markdown + папки + frontmatter-id).Предлагаемая топология (минимум кода)
Git остаётся производным зеркалом/версионированием на сервере, телефон в git не ходит. Для движка
livesync-bridge— это просто «ещё один редактор файлов в vault», неотличимый от человека, правящегоmain.Что надо дописать в gitmost (немного, по образцу
settings.gitSync)docmost↔main; если мост читает дерево в этот момент — гонка. Решение по образцу того, как HTTP-backend трактует внешнийgit push: дать мосту отдельны��, привязанный кmainкаталог (export-dir или git-worktree), который оркестратор синхронизирует с рабочим деревом под тем же per-space Redis-локом.settings.couchSync.enabled— копия паттернаsettings.gitSync(DTO/Service/Repo/CASL + Switch в форме спейса).COUCH_SYNC_*(URL CouchDB, креды, passphrase E2EE) вEnvironmentService— по образцуGIT_SYNC_*.livesync-bridge: при включении синка на спейсе эмитить/обновлять JSON-пиры (couchdb= БД спейса,storage= export-dir спейса).docker-compose.ymlдобавитьcouchdb+livesync-bridge+ HTTPS-прокси (Caddy/Nginx/Tailscale) с CORS под мобильные origins; single-node CouchDB с поднятымmax_document_size.Сквозные вопросы (большинство уже закрыто в #119)
baseMarkdown= last-pushed).Альтернатива (тяжёлая, на потом)
Нативный CouchDB-транспорт внутри git-sync-модуля (
CouchVault/CouchDataSourceвместоVaultGit): gitmost сам пишет в CouchDB в формате LiveSync (file-entry +h:-чанки, content-defined chunking, E2EE), телефоны реплицируют напрямую — без файлов и sidecar. Плюс: единый домен конфликтов. Минус: большой объём работы и сопровождение эволюционирующего wire-формата LiveSync; хрупко. Рекомендуется только если sidecar окажется операционно болезненным.Фазы
livesync-bridgesidecar на уже производимую vault-папку одного спейса, Obsidian LiveSync на десктоп + 2 телефона. Проверить near-realtime и round-trip.couchSync+ ENV + генератор bridge-конфига + координация писателей + docker-compose.CouchVault.Ссылки
couchdb/storage, E2EE)