Перейти к основному содержимому

WebDAV-синхронизация

Обзор​

WebDAV-синхронизация — это механизм кросс-платформенной синхронизации Synthesis Workbench, заменяющий устаревшую Git Sync. Она обменивается детерминированными снимками наборов устойчивого состояния через протокол WebDAV.

Работает с любым WebDAV-совместимым сервером (Nextcloud, ownCloud, Synology и т. д.). Git не требуется.

Предварительные требования​

  • Доступный WebDAV-сервер
  • Учётные данные WebDAV (имя пользователя + пароль или токен приложения)

Настройка​

Zotero → Settings → Zotero Agents → WebDAV Sync

ПараметрТипПо умолчаниюОписание
Enable WebDAV SyncbooleanfalseГлавный переключатель
Base URLstring""URL WebDAV-сервера, например https://nextcloud.example.com/remote.php/dav/files/user/
Remote Pathstring"zotero-agents"Удалённый каталог внутри базового URL
Usernamestring""Имя пользователя WebDAV (опционально)
Password / App Tokenencrypted""Пароль или токен (шифрование AES-256-GCM)
Auto SyncbooleanfalseАвтоматически запускать синхронизацию после изменений в Synthesis
Auto RetrybooleanfalseАвтоматически повторять временные сбои

Кнопки действий:

  • Save Settings: Сохранить настройки, не относящиеся к учётным данным
  • Save Credential: Зашифровать и сохранить пароль/токен
  • Test Connection: Отправить запрос PROPFIND для проверки подключения

Структура удалённых файлов​

<remotePath>/
├── HEAD.json # Указатель текущего снимка
└── snapshots/
└── <snapshotId>/
├── manifest.json # Манифест устойчивого набора
└── bundles/ # Детерминированные файлы устойчивого набора

HEAD.json содержит snapshot_id, manifest_hash, updated_at, producer_version. Снимки полностью загружаются до обновления HEAD — прерванные синхронизации никогда не повреждают удалённые данные.

Что синхронизируется​

СинхронизируетсяНе синхронизируется
ТемыБазы данных среды выполнения SQLite
Концепции (концепции, смыслы, псевдонимы, отношения)Журналы среды выполнения
Граф тем (узлы, рёбра)Файлы рабочего пространства
Ссылки (привязки, перенаправления)Состояние очереди и блокировок
Элементы рецензированияВосстанавливаемые проекции (раскладка цитирований, метрики, кэш)
Теги (контролируемый словарь)Учётные данные
Связанные элементыВременные файлы

Поток синхронизации​

idle → queued → syncing → idle
├── blocked_conflict (требуется ручное разрешение)
└── failed_retryable / failed_permanent
ШагОписание
1. HEADЧтение удалённого HEAD.json
2. ЗагрузкаЗагрузка манифеста + наборов, если существует более новый снимок
3. ПросмотрПроверка импортированного снимка, сравнение хешей сущностей
4. Проверка конфликтовОбнаружение двусторонних изменений
5. ПрименениеИмпорт удалённого снимка в локальный Canonical Store
6. ЭкспортЭкспорт текущего локального состояния в виде наборов
7. ЗагрузкаЗагрузка манифеста + наборов
8. Обновление HEADОбновление HEAD.json в последнюю очередь (ETag/If-Match для безопасности параллелизма)

Обработка конфликтов​

Обнаружение конфликтов основано на сравнении хешей на уровне сущностей. Конфликт фиксируется, когда одна и та же сущность изменена и локально, и удалённо.

Типы конфликтов:

  • Двустороннее изменение сущности
  • Конфликт обновления и удаления (tombstone)
  • Расхождение элементов рецензирования
  • Расхождение привязки ссылок или целей перенаправления

Действия разрешения:

ДействиеОписание
keep_localСохранить локальное состояние, закрыть шлюз конфликта, поставить в очередь следующий экспорт
clear_after_manual_editПосле ручного слияния повторная проверка; снятие маркера конфликта при разрешении

Панель синхронизации на главной странице Workbench отображает детали конфликта и кнопки действий.

Безопасность​

  • Шифрование учётных данных: AES-256-GCM, привязанный к мастер-токену Host Bridge (PBKDF2-SHA256, 100 000 итераций)
  • Открытый текст не возвращается: учётные данные недоступны для чтения после сохранения
  • Очистка URL: учётные данные удаляются из вывода журнала
  • HTTP Basic Auth: стандартная базовая аутентификация через HTTPS

Ограничения​

ОграничениеДетали
По умолчанию ручнаяАвтосинхронизация и автоповтор отключены по умолчанию
Нет сжатияСнимки v1 — это необработанные JSON-наборы
Нет очистки старых снимковУдалённые снимки накапливаются; требуется ручная очистка
Нет слияния на уровне полейКонфликты на уровне сущностей
Предположение об одном устройствеОдновременная запись с нескольких устройств может вызвать конфликты

Следующие шаги​