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

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-наборы
Нет очистки старых снимковУдалённые снимки накапливаются; требуется ручная очистка
Нет слияния на уровне полейКонфликты на уровне сущностей
Предположение об одном устройствеОдновременная запись с нескольких устройств может вызвать конфликты

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