Créer une ferme de wikis avec Dokuwiki

Ce titre n'est peut-être pas très explicite, qu'est-ce que "dokuwiki", qu'est-ce qu'une "ferme", qu'est-ce que "créer" ?

Cet article va vous présenter ce qu'est dokuwiki, pourquoi je pense que c'est le meilleur moteur de wiki libre, ce qu'est une ferme de wikis et comment faire une ferme de dokuwikis.

I. Pourquoi Dokuwiki ?

DokuWiki est un moteur de wiki libre distribué sous licence GNU GPL créé par Andreas Gohr en juin 2004. Contrairement à la plupart des autres moteurs de wiki, Dokuwiki stocke ses données dans des fichiers textes sur la machine, aucune base de données n'est donc nécessaire (ce qui est, pour moi, un atout non négligeable et très appréciable) !

La dernière version de dokuwiki est disponible sur le site officiel.

Un autre gros avantage de Dokuwiki est sa grande communauté de contributeurs. En effet, dokuwiki est tellement souple que beaucoup de monde à décidé de développer dessus. Par exemple, si vous allez voir sur la page officielle des plugins, vous pourrez vous rendre compte qu'il y en a énormément (570 à l'heure où j'écris ces lignes), pour tous les goûts, du plus utile au plus futile :)
L'installation d'un plugin est également très pratique : tout est contenu dans un répertoire, donc pour supprimer un plugin, il vous suffit de supprimer ce répertoire. Rien ne reste, pas de configuration orpheline, pas de fichiers temporaires, pas d'inclusion dans d'autres fichiers, etc. De plus, tout est faisable via l'interface web d'administration de Dokuwiki.

Un autre avantage qui à été décisif pour l'adoption de Dokuwiki dans mon travail : ses très nombreux modes d'authentification. En effet, comme je vous l'ai dit, ce logiciel est tellement souple que la communauté à créé un grand nombre de modules d'authentification. Au programme, en plus des comptes locaux, vous pouvez vous identifier sur Dokuwiki via MySQL, LDAP, pgSQL, punbb, CAS, drupal, htaccess, radius, pam, shibboleth, imap, xmpp, etc. Vous pouvez coupler toutes ces authentifications, les utiliser séparément, et tout un tas d'autres méthodes.

Pour la petite histoire, dans mon travail (DSI de l'Université Nancy 2), j'ai mis en place une authentification qui peut-être différente en fonction des fermes parmi CAS, comptes locaux, shibboleth, le tout couplés ou séparément.

Bref, je pourrais m'étendre encore longtemps sur les vertus de ce moteur de wiki mais pour résumer, je peux dire qu'il s'agit d'une vraie mine d'or :)

II. Qu'est-ce qu'une ferme de wikis ?

Voici en l'arborescence simplifiée d'un répertoire Dokuwiki :

|_conf (répertoire de configuration du wiki)
|_data (contient les données du wiki comme les pages, les images, les documents joints, etc.)
|_lib (contient les plugins, les templates du wiki)
|_inc (contient les fichiers de langue, les modules d'authentification, etc.)

Admettons que vous souhaitez héberger plusieurs wikis sur une machine (par exemple 24 wikis). Avec un système de wiki "classique", il faudrait 24 répertoires avec 24 répertoires conf, data, lib, inc, etc., il faudrait installer 24 fois les mêmes plugins, 24 fois les mêmes modules d'authentification et faire 24 mises à jour si besoin est.
Bref, un vrai calvaire (surtout quand on dépasse les 50 wikis) !

Le principe des fermes est le suivant :

Il y a un répertoire maître qui contient tous les modules, tous les plugins, tous les templates et après, pour chaque nouveau wiki, il y a un répertoire contenant un sous-répertoire conf (qui contiendra la configuration de chaque wiki) et un sous répertoire data (qui contiendra les données de chaque wiki). C'est tout. Chaque wiki (appelé aussi animal) ira chercher des modules, ses templates, ses librairies dans le répertoire maître.

Au final, nous obtiendrons donc une arborescence de ce type :

|_master
  |_lib
  |_inc
|_wiki1
  |_conf
  |_data
|_wiki2
  |_conf
  |_data
|_wiki3
  |_conf
  |_data

Plusieurs gros avantages à cela :

  • Limitation de la place occupée sur le disque dur : nous n'avons plus 50 fois le même répertoire lib/ ou inc/
  • Facilité de maintenance : il suffit d'installer une seule fois un plugin sur le wiki master pour que tout le monde y ai accès, de même, il suffit de mettre à jour un plugin ou même l'intégralité de Dokuwiki uniquement sur le master pour que les changements soient appliqués à tous les animaux.
  • Une création rapide : pour créer un nouveau wiki, on utilise un script (fourni ci-dessous) auquel on passe en paramètre le nom du wiki. En clair, dans un terminal on tape ./addanimal.sh wiki4 et tout est créé automatiquement !

III. Comment mettre en place une ferme de wikis avec DokuWiki ?

1. Introduction

Avant tout, il faut savoir qu'il existe deux "types"de fermes de wiki :

  1. Une version avec des wikis accessibles via ce genre d'URL : monsite.fr/wiki1, monsite.fr/wiki2, etc. (c'est cette version que je présenterai ici)
  2. Une version avec des URL du type cname (wiki1.monsite.fr, wiki2.monsite.fr, etc.)
Dans cet article, je vais parler de la première solution. Pourquoi ? Tout simplement parce que c'est cette solution que j'ai du mettre en place à mon travail et que je maîtrise donc le mieux.

De plus, sachez que je ne parlerai que d'une authentification via les comptes locaux de dokuwiki (afin de ne pas tout embrouiller). Pour info, dokuwiki est extrêmement complet au niveau des modules d'authentification. Par exemple, à mon travail, j'ai mis en place une authentification plain (compte locaux) ainsi que LDAP, CAS et Shibboleth.

2. Préparation

Rendez-vous sur la page de téléchargement officielle de dokuwiki et téléchargez la dernière version. Ensuite il faut extraire cette archive en tant que dossier master sur votre serveur.

Note : Ici, j'appelle mon répertoire principal "master" mais vous pouvez l'appeler autrement, il faut juste le renseigner dans les différents fichiers de configuration. De plus, je pars du principe que vous utilisez une arborescence comme celle-ci (avec, pour document root : /var/www/wiki/php):

|_var
  |_www
    |_wiki
      |_addanimal.sh
      |_php
        |_master
          |_lib
          |_inc
        |_wiki1
          |_conf
          |_data
        |_wiki2
          |_conf
          |_data

  • Nous avons donc notre répertoire master, créez un fichier ./master/inc/preload.php et copiez-y ces lignes :
<?php
// the home directory for all animals and the farmer located in subdirectories
$farmdir = '/var/www/wiki/php/';
 
// don't do anything if the animal doesn't exist
if(isset($_REQUEST['animal'])) {
    if(!is_dir($farmdir . $_REQUEST['animal'])) {
        nice_die("Ce wiki n'existe pas !");
    }
    if($_REQUEST['animal']=="master") {//si on appelle le master
    nice_die("Interdit d'appeler le master");
    }
    if(!defined('DOKU_CONF')) {
        define('DOKU_CONF', $farmdir . $_REQUEST['animal'] . '/conf/');
    }
    //  correct paths according to animal and make nice looking in HTML source
    if(!defined('DOKU_URL')) define('DOKU_URL',preg_replace('/(.+)\/([^\/]+)\//','$1/'.$_REQUEST['animal'].'/',getBaseURL(true)));
    if(!defined('DOKU_REL')) define('DOKU_REL',preg_replace('/([^\/]+)\/\/([^\/]+)\/(.+)\//','/$3/',DOKU_URL));
 } else {
    // don't do anything on the farmer instance
    return;
}
  • Ensuite, il faut créer un fichier .htaccess dans le répertoire wiki contenant ceci :
#Définition des règles de redirection
RewriteEngine On
RewriteRule index - [L]
RewriteRule ^([^/]+)/(.*) /home/www/wiki/php/master/$2?animal=$1 [QSA,L]
RewriteRule ^([^/]+)$ http://wiki.votre-site.fr/$1/ [QSA,L]
  • Enfin, il vous faut créer un fichier addanimal.sh (ou n'importe quel autre nom) que vous placerez dans /var/www/wiki/ (pas dans le répertoire php, de manière à ce que le serveur apache n'ai pas accès à ce fichier). Voici le fichier addanimal.sh pour des comptes locaux :
#!/bin/bash
#
# Création d'animal pour une ferme dokuwiki
# benjamin@generation-linux.fr - 10/12/09
#
 
MASTER_DIR=/var/www/wiki/php/master
FARM_DIR=/var/www/wiki/php
 
if [ $# -ne 1 ]; then
    echo "Usage: $(basename $0) [animal_name]"
   exit 1
fi
 
if [ ! -d $MASTER_DIR ]; then
    echo "ERREUR : $DOKUWIKI n'existe pas !"
    exit 1
fi
 
if [ ! -d $FARM_DIR ]; then
    echo "ERREUR : $FARM_DIR n'existe pas !"
    exit 1
fi
 
 echo ">> Ajout de la ferme $1"
  FARM=${FARM_DIR}/$1
  FARM_TITLE=$1
 
if [ -d $FARM ]; then
    echo "ERREUR : $FARM existe deja !"
    exit 1
fi
 
 echo ">> Creation des repertoires"
mkdir -p ${FARM}/{data,conf}
chmod 755 ${FARM}/{data,conf}
cp -a ${MASTER_DIR}/data/* ${FARM}/data
cp -a ${MASTER_DIR}/conf/* ${FARM}/conf
find ${FARM}/data -type d -exec chmod 755 {} \;
touch ${FARM}/conf/{local.php,local.protected.php,acl.auth.php,users.auth.php}
chmod 666 ${FARM}/conf/{local.php,acl.auth.php,users.auth.php}
 
 echo ">> Creation des fichiers de configuration"
  echo "<?php
  \$conf['title'] = '${FARM_TITLE}';
  \$conf['lang'] = 'fr';
  \$conf['savedir']     = '${FARM}/data';
  \$conf['useacl'] = 1;
  \$conf['template']    = 'nancy2';
  \$conf['plugin']['sidebar']['enable'] = 1;
  \$conf['authtype'] = 'plain';
  \$conf['superuser'] = '@admin';" > ${FARM}/conf/local.php
 
 echo ">> Creation des comptes admin"
  echo "# <?php exit()?>
  admin:d51ba34ef116c2cffacfa2125b87e6b5:Administrateur:votre@mail.fr:admin,user" > ${FARM}/conf/users.auth.php

 
echo ">> Mise en place des permissions"
echo "# <?php exit()?>
* @admin 255
* @ALL 1" > ${FARM}/conf/acl.auth.php
 
 
chown -R apache2:apache2 ${FARM}
echo ">> Ferme $1 installee !"
 
exit 0

Note : Attention à l'antépénultième ligne, j'ai mis apache:apache car je suis sous RedHat, sous Ubuntu et Debian cela doit être www-data:www-data et peut-être d'autres noms sous d'autres systèmes.

Il ne vous reste plus qu'à rendre ce fichier exécutable grâce à cette commande : chmod +x /var/www/wiki/addanimal.sh

Pour créer un nouvel animal, il suffit de taper : ./addanimal.sh nom_animal

Simple non ? :)

3. Personnalisation

Afin de supprimer les liens dans l'administration (gestion des plugins, gestion de la configuration, gestion des réversions, etc.), il faut créer des fichiers disabled dans chaque répertoires :

  • touch /home/www/projets/wiki-dsi/php/master/lib/plugins/plugin/disabled
  • touch /home/www/projets/wiki-dsi/php/master/lib/plugins/revert/disabled
  • touch /home/www/projets/wiki-dsi/php/master/lib/plugins/config/disabled
  • touch /home/www/projets/wiki-dsi/php/master/lib/plugins/popularity/disabled

4. Conclusion

Ainsi s'achève ce tutoriel sur la mise en place d'une ferme de wikis avec Dokuwiki. Comme vous avez pu vous en rendre compte, cela est très simple à mettre en œuvre et s'avère très pratique pour les fans de wikis (moi même j'en utilise plusieurs régulièrement).

Pour la petite anecdote, voici un screenshot de mon wiki au boulot (c'est moi qui ai fait le design à partir ce celui-ci) :


De plus, je vous met à disposition le (petit) diaporama de ma présentation de cette solution : presentation-DW.pdf.

Pour ceux que ça intéresse, je vais bientôt mettre en place ce système sur mon serveur pour offrir à qui le souhaite son ou ses wikis rapidement et gratuitement. Si cela vous intéresse, n'hésitez pas à me le faire savoir ;)

Vus : 522
Publié par Génération Linux : 126