Aller au contenu principal

Synchronisation WebDAV

Aperçu

La synchronisation WebDAV est le mécanisme de synchronisation multi-appareils du Synthesis Workbench, remplaçant la synchronisation Git obsolète. Elle échange des instantanés de bundle d'état persistant déterministes via le protocole WebDAV.

Fonctionne avec tout serveur compatible WebDAV (Nextcloud, ownCloud, Synology, etc.). Aucun Git requis.

Prérequis

  • Un serveur WebDAV accessible
  • Des identifiants WebDAV (nom d'utilisateur + mot de passe ou jeton spécifique à l'application)

Configuration

Zotero → Paramètres → Zotero Agents → Synchronisation WebDAV

ParamètreTypeDéfautDescription
Activer la synchronisation WebDAVbooleanfalseInterrupteur principal
URL de basestring""URL du serveur WebDAV, ex. https://nextcloud.example.com/remote.php/dav/files/user/
Chemin distantstring"zotero-agents"Répertoire distant sous l'URL de base
Nom d'utilisateurstring""Nom d'utilisateur WebDAV (optionnel)
Mot de passe / Jeton applicatifencrypted""Mot de passe ou jeton (chiffré AES-256-GCM)
Synchronisation automatiquebooleanfalseDéclencher la synchronisation automatiquement après les modifications Synthesis
Réessai automatiquebooleanfalseRéessayer automatiquement les échecs temporaires

Boutons d'action :

  • Enregistrer les paramètres : Persister les paramètres hors identifiants
  • Enregistrer l'identifiant : Chiffrer et stocker le mot de passe/jeton
  • Tester la connexion : Envoyer une requête PROPFIND pour vérifier la connectivité

Structure des fichiers distants

<remotePath>/
├── HEAD.json # Pointeur d'instantané actuel
└── snapshots/
└── <snapshotId>/
├── manifest.json # Manifeste du bundle durable
└── bundles/ # Fichiers de bundle durable déterministes

HEAD.json contient snapshot_id, manifest_hash, updated_at, producer_version. Les instantanés sont entièrement téléchargés avant la mise à jour de HEAD — les synchronisations interrompues ne corrompent jamais le distant.

Ce qui est synchronisé

SynchroniséNon synchronisé
SujetsBases de données d'exécution SQLite
Concepts (concepts, sens, alias, relations)Journaux d'exécution
Graphe de sujets (nœuds, arêtes)Fichiers d'espace de travail
Références (liaisons, redirections)État des files d'attente et des verrous
Éléments de révisionProjections reconstructibles (disposition des citations, métriques, cache)
Balises (vocabulaire contrôlé)Identifiants
Notices associéesFichiers temporaires

Flux de synchronisation

idle → queued → syncing → idle
├── blocked_conflict (résolution manuelle requise)
└── failed_retryable / failed_permanent
ÉtapeDescription
1. HEADLire le HEAD.json distant
2. TéléchargementTélécharger le manifeste + les bundles si un instantané plus récent existe
3. AperçuValider l'instantané importé, comparer les hashs d'entités
4. Vérification des conflitsDétecter les modifications bilatérales
5. ApplicationImporter l'instantané distant dans le Canonical Store local
6. ExportExporter l'état local actuel sous forme de bundles
7. TéléversementTéléverser le manifeste + les bundles
8. Mise à jour HEADMettre à jour HEAD.json en dernier (ETag/If-Match pour la sécurité de concurrence)

Gestion des conflits

La détection des conflits est basée sur la comparaison de hashs au niveau des entités. Un conflit est levé lorsque la même entité a changé à la fois localement et à distance.

Types de conflits :

  • Modification bilatérale d'entité
  • Conflit mise à jour vs. tombstone
  • Divergence d'éléments de révision
  • Divergence de cible de liaison/redirection de référence

Actions de résolution :

ActionDescription
keep_localConserver l'état local, fermer la porte de conflit, mettre en file d'attente le prochain export
clear_after_manual_editAprès la fusion manuelle, re-valider ; effacer le marqueur de conflit lorsque résolu

Le panneau de synchronisation de la page Home du Workbench affiche les détails du conflit et les boutons d'action.

Sécurité

  • Chiffrement des identifiants : AES-256-GCM, clé dérivée du jeton maître Host Bridge (PBKDF2-SHA256, 100 000 itérations)
  • Le texte en clair n'est jamais retourné : l'identifiant n'est pas lisible après l'enregistrement
  • Assainissement de l'URL : les identifiants sont supprimés de la sortie du journal
  • Authentification basique HTTP : authentification basique standard sur HTTPS

Limitations

LimitationDétail
Manuelle par défautLa synchronisation automatique et le réessai automatique sont désactivés par défaut
Pas de compressionLes instantanés v1 sont des bundles JSON bruts
Pas de nettoyage des anciens instantanésLes instantanés distants s'accumulent ; un nettoyage manuel est nécessaire
Pas de fusion au niveau des champsLes conflits sont au niveau des entités
Hypothèse mono-appareilLes écritures simultanées depuis plusieurs appareils peuvent causer des conflits

Prochaines étapes