WebDAV-синхронизация
Обзор
WebDAV-синхронизация — это механизм кросс-платформенной синхронизации Synthesis Workbench, заменяющий устаревшую Git Sync. Она обменивается детерминированными снимками наборов устойчивого состояния через протокол WebDAV.
Работает с любым WebDAV-совместимым сервером (Nextcloud, ownCloud, Synology и т. д.). Git не требуется.
Предварительные требования
- Доступный WebDAV-сервер
- Учётные данные WebDAV (имя пользователя + пароль или токен приложения)
Настройка
Zotero → Settings → Zotero Agents → WebDAV Sync
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| Enable WebDAV Sync | boolean | false | Главный переключатель |
| Base URL | string | "" | URL WebDAV-сервера, например https://nextcloud.example.com/remote.php/dav/files/user/ |
| Remote Path | string | "zotero-agents" | Удалённый каталог внутри базового URL |
| Username | string | "" | Имя пользователя WebDAV (опционально) |
| Password / App Token | encrypted | "" | Пароль или токен (шифрование AES-256-GCM) |
| Auto Sync | boolean | false | Автоматически запускать синхронизацию после изменений в Synthesis |
| Auto Retry | boolean | false | Автоматически повторять временные сбои |
Кнопки действий:
- 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-наборы |
| Нет очистки старых снимков | Удалённые снимки накапливаются; требуется ручная очистка |
| Нет слияния на уровне полей | Конфликты на уровне сущностей |
| Предположение об одном устройстве | Одновременная запись с нескольких устройств может вызвать конфликты |
Следующие шаги
- Главная панель — Просмотр статуса синхронизации
- Настройки — Настройка WebDAV-синхронизации
- Git Sync (устарела) — Историческая справка