Le farming dans DokuWiki, intérêt et mise en œuvre
Etienne MELEARD
Comité Réseau des Universités
Université de Rennes 1, Campus Beaulieu 35042 Rennes Cedex
DokuWiki est une plateforme de Wiki souple et puissante, spécialisée dans la gestion des ressources documentaires avec un accès restreint ou non. Pour passer d'une logique d'utilisateur du produit à celle d'une prestation d'hébergement du produit, il est indispensable de ne pas multiplier le nombre d'instances de DokuWiki installées. Il est impératif de mutualiser le noyau applicatif, cette mutualisation se nomme « farming ». L'administration d'une ferme de DokuWiki ne doit pas demander beaucoup plus d'opérations que l'administration d'un simple DokuWiki et en tout cas, le coût d'administration ne doit pas être proportionnel au nombre d'utilisateurs du service.
Après un très rapide rappel des possibilités qu'offre DokuWiki en matière de gestion documentaire, cet article expliquera en quoi exactement consiste la mise en place d'une « ferme » de Wikis avec DokuWiki et quel est l'intérêt d'une telle pratique. Ce propos sera illustré par le cas de la mise en place de Wikis pour les listes de diffusion dans Sympa, ainsi que par la présentation d'une extension (plugin) pour DokuWiki facilitant la gestion d'une « ferme » de Wikis.
Mots clefs
DokuWiki, mutualisation, farming, ferme de wikis, service d'hébergement
DokuWiki est une plateforme de gestion documentaire sous forme d'un wiki1 offrant de nombreuses possibilités. Outre le fait d'offrir une syntaxe rédactionnelle simple et aisément convertible dans d'autres formats (XHTML, OpenDocument, PDF ...) et un système de limitation d'accès aux contenus, c'est aussi une application ne demandant que peu de prérequis (un serveur Web et PHP), très évolutive par le biais d'extensions (« plugins ») et de templates pour le rendu XHTML.
La gestion d'un service exploitant un bon nombre de Wikis impose un certain nombre de tâches aux administrateurs. En plus du suivi des mises à jour de l'application elle même (pour des raisons fonctionnelles ou de sécurité), il est nécessaire de gérer l'ensemble des plugins, de définir les accès aux documents et, selon le mode d'authentification choisi, de gérer les listes d'utilisateurs. À cela s'ajoute la gestion de la collection de templates (installation, paramétrage ...). L'unification de ces tâches prend ici toute son importance. Dans le cas de l'utilisation d'une ferme de Wikis, il ne serait nécessaire de réaliser ces tâches que pour un Wiki unique possédant l'application au complet et de ne gérer les autres Wikis que comme de simples sources de données.
Par la suite la « ferme » désignera le service dans sa globalité, le « fermier » sera la partie applicative (et donc unique), les « animaux » seront les multiples Wikis contenus dans la « ferme ».
Comme évoqué dans l'introduction, la mise en place d'une ferme de wikis est intéressante pour tout service incluant un grand nombre de wikis pour lequel les tâches de mise à jour, de gestion des plugins, sont prises en charge par une équipe restreinte d'administrateurs. Le farming est d'autant plus intéressant lorsque les tâches d'administration sus-citées ne peuvent pas (ou ne doivent pas) être prises en charge par les utilisateurs administrateurs de chaque wiki (public néophyte, restriction des actions pour des raisons de sécurité ...).
Dans le cas d'un tel service toute mise à jour d'un plugin nécessite soit une action dans chaque wiki (et si il y en a 500 ?) soit une action sur le système de fichiers du serveur (en téléchargeant le plugin, puis le décompactant et enfin en le copiant au bon endroit, souvent en ligne de commande).
Il devient alors utile (et même nécessaire) de mutualiser certaines fonctionnalités et ressources de l'application afin d'alléger le travail des administrateurs du service. Cette mutualisation se nomme farming. Une fois en place, le farming ne nécessite la mise à jour que d'une seule instance du moteur du wiki (le fermier) et non autant de mises à jour qu'il y a d'instances (dans la ferme).
La première chose à arrêter est le degré de liberté que l'on souhaite laisser aux utilisateurs administrateurs.
En effet le farming peut avoir plusieurs niveaux de mutualisation. Ainsi il sera possible de ne mutualiser que le noyau applicatif afin de faciliter les mises à jour (de sécurité entre autres) et de laisser aux utilisateurs administrateurs le choix et la gestion de leurs templates, plugins... De même on pourra mutualiser aussi les plugins mais laisser aux utilisateurs leur propre collection de templates. Il en va de même avec la configuration, elle aussi mutualisable. Ce « bridage » est très important dans la mesure où un plugin mal implémenté, ou une configuration erronée, peut casser un wiki et donc le rendre indisponible.
Au plus haut niveau on obtient un service de wikis ayant tous le même aspect et disposant des mêmes fonctionnalités, seuls le contenu et la gestion des droits d'accès sont laissés aux utilisateurs administrateurs.
Une des façons les plus simples de mettre une ferme de wikis en place est l'utilisation de liens symboliques. Prenons le cas d'une ferme où l'on mutualise le noyau applicatif, les plugins et les templates, ne laissant aux utilisateurs administrateurs que la configuration et les données. Dans ce genre de cas il suffit d'utiliser une arborescence comme celle-ci :
farmer/
+-- lib/
+-- tpl/
+-- plugins/
+-- inc/
+-- doku.php
animal_1/
+-- data/
+-- conf/
+-- lib -> lien vers ../farmer/lib
+-- inc -> lien vers ../farmer/inc
+-- doku.php
animal_2/
+-- data/
+-- conf/
+-- lib -> lien vers ../farmer/lib
+-- inc -> lien vers ../farmer/inc
+-- doku.php
Figure 1 – Arborescence d'une ferme utilisant des liens symboliques
Cette solution, qui d'ailleurs ne s'adresse pas qu'à DokuWiki mais aussi à un certain nombre d'autres applications, a le mérite d'être simple (moyennant la possibilité pour le serveur web de suivre ces liens symboliques). La création d'animaux se fait facilement à l'aide d'un script adapté. Le défaut de cette solution est qu'elle nécessite la création d'un certain nombre de liens ainsi que la copie de certains fichiers (doku.php), ce qui devrait être évité.
Une deuxième approche consiste à utiliser les fonctionnalités de DokuWiki directement. En effet, par l'ajout d'un fichier de pré-chargement au bon endroit, il est possible de modifier certaines des constantes de DokuWiki avant que celui-ci ne commence à faire quoi que ce soit.
On peut utiliser cette fonctionnalité, éventuellement en conjonction avec un peu de ré-écriture d'URL, pour obtenir le même fonctionnement que précédemment, mais avec les liens symboliques en moins, et obtenir une arborescence du type :
.htaccess (ré-écrit /* en /farmer/doku.php?animal=*)
farmer/
+-- lib/
+-- tpl/
+-- plugins/
+-- inc/
+-- preload.php (définit l'emplacement de la
configuration à charger en fonction du paramètre
« animal », redirige éventuellement selon le statut
de l'animal)
+-- doku.php (commence par inclure preload.php si présent)
animal_1/
+-- data/
+-- conf/
animal_2/
+-- data/
+-- conf/
Figure 2 – Arborescence d'une ferme utilisant le préchargement
La création d'animaux est elle aussi simplifiée car elle peut se faire par simple copie d'un animal de référence, sans avoir à re-créer une pléthore de liens à chaque fois. La contrepartie est de devoir faire attention à conserver le fichier « preload.php » à chaque mise à jour du noyau applicatif.
Une des conséquences de cette méthode est une plus grande facilité de sauvegarde des données essentielles du service, les répertoires correspondants aux animaux ne contenant que les données importantes, une simple copie de l'ensemble des répertoires des animaux suffit à sauvegarder la ferme en garantissant un minimum de travail lors d'une récupération.
Cette deuxième méthode est utilisée par le plugin présenté ci-après.
La pratique du farming n'a pas de cible précise, elle s'adresse à tous les administrateurs de service qui incluent des wikis en nombre.
Cette solution a été adoptée par l'équipe de développement de SYMPA afin de doter les listes de diffusion désireuses d'un wiki -sans pour autant que cette fonctionnalité ne devienne un casse tête au niveau de l'administration-. Un prototype de cette architecture (Sympa + une ferme de wiki) est d'ailleurs distribué sous forme d'une machine virtuelle sur le site www.sympa.org .
Le CRU l'utilise aussi pour ses différents sites web, afin d'alléger la charge de travail de ses administrateurs web.
Elle est aussi envisageable pour proposer des wikis sous forme de « site perso » à une communauté (enseignants, étudiants ...), ou encore pour le particulier qui possède plusieurs wikis et veut se simplifier la vie !
Lors de la conception de ce plugin, le choix a été fait de mutualiser les éléments suivants :
noyau applicatif, afin de faciliter les mises à jour de sécurité et autres ;
plugins, afin de ne pas laisser les utilisateurs du service installer n'importe quoi (plugins avec des failles …) ;
templates, comme pour les plugins, l'administrateur du service les installe et les utilisateurs en choisissent un ;
la configuration qui, elle, reste propre à chaque wiki, mais l'utilisation d'une configuration « protégée » (éléments de configuration non modifiables par l'utilisateur mais que l'administrateur du service peut retoucher) limite l'action des utilisateurs sur certains paramètres clefs.
Au niveau de la structure de fichiers de DokuWiki cela revient à ne stocker pour chaque animal que les fichiers de configuration (répertoire « conf ») et l'arborescence des données (répertoire « data »).
Il est apparu nécessaire d'avoir une interface web qui permette de modifier librement la configuration des animaux (y compris celle que leurs administrateurs ne peuvent pas modifier), mais aussi de créer, détruire, fermer temporairement et mettre en maintenance des animaux. Une possibilité d'avoir des statistiques (taille occupée sur le disque, date des derniers changements ...) a aussi été jugée utile.
Une autre facette d'une ferme de wikis est de permettre à des applications extérieures d'agir sur les animaux (tester l'existence, en créer, en détruire ...). Un serveur SOAP a donc été inclus dans le plugin afin d'autoriser ces actions à des service extérieurs reconnus.
Cette interface s'intègre dans l'espace d'administration du wiki « fermier » et permet de contrôler la ferme dans son ensemble.
Elle offre une vue statistique (taille disque, derniers changements, statistiques média ...) des animaux, elle permet aussi de désactiver temporairement un animal en précisant la raison (maintenance, indisponibilité temporaire, violation de règlement ...).
Elle donne aussi accès à la configuration des animaux avec un mode classique (champ – valeur) et un mode textuel avancé, que cela soit pour la configuration normale ou protégée.
Enfin elle permet d'ajouter ou de supprimer définitivement un animal.
À cela s'ajoute la possibilité de paramétrer la ferme (quota disque par animal, paramètres du serveur SOAP ...).
Ce serveur permet à des applications tierces d'obtenir des informations sur la ferme et d'agir sur les animaux de manière simplifiée (il faut moins de 10 lignes de PHP pour tester l'existence d'un animal par exemple).
Les applications s'authentifient sur un modèle de « trusted applications », dont la liste est incluse dans la configuration.
Ce principe permet à une application reconnue, c'est à dire dont le nom et un hash du mot de passe sont connus du serveur, d'appeler un service si celui-ci est dans la liste des service auxquels cette application a accès. Cela permet d'autoriser l'accès à plusieurs applications externes différentes avec des droits différents.
À travers ce serveur SOAP les applications externes peuvent tester l'existence d'un animal et connaître son état (verrouillé, quota dépassé) et aussi créer ou supprimer des animaux.
Cela permet d'intégrer la ferme dans un groupe d'applications, un portail, un ENT, l'interface web d'un serveur de listes ...
Le farming est un système pouvant se révéler avantageux à tous points de vue pour un administrateur de service devant gérer un grand nombre de wikis - simplifier les mises à jour entre autres - . Il est même possible d'ajouter à DokuWiki des fonctionnalités permettant de gérer les animaux dans son interface et aussi une interface spécifique, permettant à des applications extérieures d'interagir avec la ferme, afin d'intégrer celle-ci plus facilement dans un service.
Du point de vue d'un hébergeur de service, c'est donc un gain de temps, une plus grande souplesse d'administration et une meilleure organisation que d'avoir une forêt inextricable de wikis. C'est aussi un moyen simple d'interfacer son service avec le monde extérieur.
1Wiki : http://fr.wikipedia.org/wiki/Wiki