Table des matières

Dokuwiki, ferme de wiki

Nous avons installé Dokuwiki comme wiki, un CMS pratique, simple à maintenir et riche en possibilités quand on a envie de bidouiller, bref de quoi faire plaisir à tout le monde.

Nos wikis sont organisées en ferme : un wiki principal qui sert à l'installation des divers plugins, thèmes ; des wikis animaux qui n'ont que les articles et font appel au wiki maitre pour leurs fonctionnalités. Cela permet de différencier les espaces : on peut mettre des administrateurs différents suivant les wikis, des thèmes, désactiver ou activer certains plugins, gérer les arborescences de façons différentes…

Cela permet de mettre à jour l'ensemble des wikis via la seule mise à jour du wiki maitre. Les plugins sont les mêmes pour chaque wiki.

La procédure simplifiée pour installer un nouvel “animal” est indiquée plus bas.

L'architecture de la ferme :

Installation du wiki-Maitre

Le wiki-maître se trouve à l'adresse /var/www/dokuwiki. C'est une installation standard de Dokuwiki, avec quelques modifications ensuite pour le mettre apte à gérer la ferme.

Il existe un plugin pour faciliter la mise à niveau : plugin:upgrade ; même si ça permet d'assister la mise à jour, il faut bien faire le backup et les tests avant ! Et vérifier que cela ne perturbe pas la ferme.

Installation de base

Téléchargez la dernière version sur http://download.dokuwiki.org/. Désactivez le support des diverses langues en dehors de l'anglais et du français sauf si vous comptez les utiliser (sinon ça prend quand même de la place) ; choisissez la version stable ; cochez les divers plugins de base qui vont vous servir (sinon, on peut les ajouter par la suite).

Mettez ce dossier décompressé dans /var/www. Changez les permissions :

chmod -R g+rw /var/www/dokuwiki

Allez à l'adresse web http://monsite.com/dokuwiki/install.php et procédez à l'installation.

Pour plus de sécurité, installez le dokuwiki-maître à une autre adresse. Cependant, il faut adapter le reste du tutoriel. J'ai souvent eu des soucis en tentant de le mettre ailleurs.

zatalyz 2016/01/31 21:03

Réécriture des URL

Les wikis de Khaganat sont configurés pour faire des jolies adresses lisibles, mais cela demande un peu de bidouille en plus. Si cette doc ne suffit pas, voir, entre autre, Dokuwiki : Réécriture d'URL.

Allez dans le panneau d'administration. Dans “Paramètres avancés”, Utiliser des URL esthétiques, sélectionnez Fichier .htaccess, enregistrez, pleurez parce que le wiki n'est plus accessible.

Puis rendez-vous dans le dossier /var/www/dokuwiki, copiez .htaccess.dist (fichier caché) en .htaccess, et modifiez ce dernier de cette façon :

## Enable this to restrict editing to logged in users only

## You should disable Indexes and MultiViews either here or in the
## global config. Symlinks maybe needed for URL rewriting.
#Options -Indexes -MultiViews +FollowSymLinks

## make sure nobody gets the htaccess, README, COPYING or VERSION files
<Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

## Uncomment these rules if you want to have nice URLs using
## $conf['userewrite'] = 1 - not needed for rewrite mode 2
RewriteEngine on
#
RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]
RewriteRule ^$                        doku.php  [L]
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteRule (.*)                      doku.php?id=$1  [QSA,L]
RewriteRule ^index.php$               doku.php
#
## Not all installations will require the following line.  If you do,
## change "/dokuwiki" to the path to your dokuwiki directory relative
## to your document root.

RewriteBase /dokuwiki

#
## If you enable DokuWikis XML-RPC interface, you should consider to
## restrict access to it over HTTPS only! Uncomment the following two
## rules if your server setup allows HTTPS.
RewriteCond %{HTTPS} !=on
RewriteRule ^lib/exe/xmlrpc.php$      https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

Bien lire ce fichier et adapter aux cas particuliers ! Ainsi les deux dernières options concernent un site avec certificat ssl (https) ; décommentez-les sinon.

RewriteBase est à adapter au chemin vers votre wiki-maitre : ici, cela correspond au dossier se situant précisément à /var/www/dokuwiki

S'il y a Apache2 sur le serveur (et en principe c'est le cas), alors on a une belle “erreur 500” quand on essaie d'aller sur le wiki, si la réécriture des URLs n'a pas été activée. C'est normal : apache2 est un peu plus contraignant que son prédécesseur pour réécrire les urls (déjà que c'était pas un cadeau…). Faire la manipulation décrite ici.

Fignoler

En principe, à partir de là, le wiki-maître est opérationnel. On peut copier d'une sauvegarde précédente les fichiers suivants :

Et remettre les plugins, thèmes, etc.

Plugins installés

Nous avons installé les plugins suivants sur Khaganat : Fonctionnalités de ce wiki (plugins).

La liste des plugins pour Dokuwiki est disponible ici.

Et sinon en une seule liste :

Installer les animaux de la ferme de wiki

Résumé

sudo chown -R www-data: **nom de l'animal**/
sudo chmod -R g+w /var/www/farm/**nom de l'animal**

Détail

Paramétrage de base de preload.php

Dans le dokuwiki-maître, copiez ./inc/preload.php.dist en ./inc/preload.php. Ce fichier ./inc/preload.php va surcharger certains paramètres par défaut pour permettre à la ferme de fonctionner.

Avant tout, les aspects concernant la ferme elle-même :

// set this to share some config : DOKU_CONF_SHARED = path to farmer conf = /var/www/dokuwiki/conf/
if(!defined('DOKU_CONF_SHARED')) define('DOKU_CONF_SHARED', '/var/www/dokuwiki/conf/');
 
 
// set this to your farm directory
if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', '/var/www/farm/');
 
// include this after DOKU_FARMDIR if you want to use farms
include(fullpath(dirname(__FILE__)).'/farm.php');

Adaptez les chemins à votre installation.

Permettre de surcharger les traductions

On peut créer des chaînes de traduction personnalisés dans Dokuwiki (voir la doc officielle) mais cela ne marche dans une ferme qu'à condition d'ajouter le chemin absolu suivant vers les fichiers de langue dans ./inc/preload.php :

$config_cascade['lang'] = array(
             'core'      => array(DOKU_CONF_SHARED . 'lang/'), 
             'plugin'    => array(DOKU_CONF_SHARED . 'plugin_lang/'), 
             'template'  => array(DOKU_CONF_SHARED . 'template_lang/') 
        );

Une seule authentification

L'option suivante permet de partager le même fichier d'utilisateurs sur les animaux. Chaque animal peut avoir sa propre base d'utilisateurs (le fichier farm/animal/conf/users.auth.php) mais, si les divers wikis sont utilisés par les mêmes personnes, on peut utiliser un seul fichier, ce qui simplifie en cas de changement de mot de passe.

Toujours dans ./inc/preload.php, ajoutez :

$config_cascade['plainauth.users'] = array(
    'default'   => DOKU_CONF_SHARED . 'users.auth.php',
); 

Dans ce cas, mieux vaut aussi s'identifier une seule fois pour toute la ferme. Il faut donc paramétrer le cookie différemment1).

Modifiez dokuwiki/inc/init.php et cherchez la ligne

define('DOKU_COOKIE', 'DW' . md5(DOKU_REL . (($conf['securecookie']) ? $serverPort : '')));

Remplacez-la par

define('DOKU_COOKIE', 'DW' . md5(commoncookie));

Pour plus de contexte : le bout de code complet une fois modifié est

// define cookie and session id, append server port when securecookie is configured FS#1664
if (!defined('DOKU_COOKIE')) {
    $serverPort = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : '';
//    define('DOKU_COOKIE', 'DW' . md5(DOKU_REL . (($conf['securecookie']) ? $serverPort : '')));
    define('DOKU_COOKIE', 'DW' . md5(commoncookie));
    unset($serverPort);
}

DOKU_REL est une variable relative concernant le dossier du wiki et des animaux. On va simplement mettre à la place un chemin absolu. On supprime des bouts qui ne semblent servir à rien et nous foutent le bordel ; éviter ça si vous permettez la connexion en http (sans forcer en https). Mais pour quelle raison feriez-vous ça ?

Je laisse ce message ici, si vous avez des soucis ; cependant dans Igor, laisser DOKU_REL à cet endroit ne semble pas poser de souci au cookie, donc vous pouvez ne pas changer ce morceau.

Il faut aussi modifier cette valeur dans dokuwiki/inc/auth.php. Il faut modifier deux fois la valeur dans ce fichier, à chaque fois avec la même ligne :

//    $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
    $cookieDir = empty($conf['cookiedir']) ? '/' : $conf['cookiedir'];

Ajoutez ou modifiez la valeur $conf['cookiedir'] dans dokuwiki/conf/local.php :

$conf['cookiedir'] = '/';

Il faudra aussi modifier le fichier local.php des animaux mais on voit ça après.

Dossier des animaux

Créer le dossier /var/www/farm/, se mettre dedans, y télécharger l'animal de base. Dézipper ce dossier, _animal, puis le copier en nomduwiki.

Ajouter dans le dossier farm un .htaccess contenant ceci :

    RewriteEngine On
     
    RewriteRule ^/?([^/]+)/(.*)  /dokuwiki/$2?animal=$1 [QSA]
    RewriteRule ^/?([^/]+)$      /dokuwiki/?animal=$1 [QSA]
    Options +FollowSymLinks

Vérification des droits

Il faut vérifier les droits sur ce dossier. Apache ne tourne pas en tant qu'utilisateur “lambda”, mais en tant qu'utilisateur “www-data”. Donc, quand tous les fichiers n'appartiennent qu'à “lambda”, Apache n'a pas le droit d'y écrire.

Il faut placer les fichiers dans le groupe “www-data”, et donner les droits d'écriture au groupe :

sudo chown -R www-data: /var/www/farm/**nom de l'animal**
sudo chmod -R g+w /var/www/farm/**nom de l'animal**

La première commande change le propriétaire et le groupe pour www-data : le double-point après le nom du propriétaire indique à chown qu'il faut aussi changer le groupe. L'option “-R” (c'est l'option courte de “--recursive”) indique qu'on ne veut pas changer le propriétaire/groupe uniquement pour le dossier, mais aussi pour tout son contenu. “www-data” est le groupe d'Apache, et il faut remplacer “/var/www/farm/dog/data” par le dossier que tu veux rendre accessible à Apache.

La deuxième commande indique au système que c'est OK pour quelqu'un qui appartient au groupe (“g”) d'écrire (“+w”) dans les fichiers.

Paramétrer un animal

Modifier /var/www/farm/nomduwiki/conf/local.php et paramétrer ces informations :

#Mettre le nom de son wiki, c'est plus joli
$conf['title'] = 'Titre du wiki';
#Indiquer le chemin depuis /var/www pour arriver à l'animal
$conf['basedir'] = '/farm/nomduwiki/';
#Vu qu'on a activé la réécriture des URLs, on doit le faire partout, sinon ça fait des sales bugs.
$conf['userewrite'] = '1';
# Pour utiliser le même cookie sur toute la ferme
$conf['cookiedir'] = '/';

La variable ['basedir'] se base sur ce qui est configuré dans Apache. Donc, s'il y a un alias du genre

/animal /var/www/farm/animal

Il faut indiquer l'alias

$conf['basedir'] = '/animal/';

Prendre aussi le temps de vérifier les options (et entre autre qui peut poster !) dans l'administration.

Alias

Créez des alias pour accéder aux animaux, c'est plus élégant. Par exemple, dans /etc/apache2/sites-available/000-default.conf, ajoutez ceci :

Alias /wikhan /var/www/farm/wikhan
Alias /mediateki /var/www/farm/mediateki

        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/ >
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

Bug sur les flux des derniers changements

Pour une raison que je ne comprends pas, parfois le fichier des derniers changements est corrompu. Trop de changements mineurs, entre autre.

Dans ce cas, il faut se mettre dans le dossier du wiki incriminé (par exemple www/farm/wikhan) et lancer la commande suivante :

find data/meta -name '*.changes' ! -name '_media.changes' -exec cat '{}' \; | sort -u > data/meta/_dokuwiki.changes

Pour modifier le nombre de derniers changements affichés, c'est dans l'administration, Gestionnaire de configuration, Paramètres d'affichage, les options “recent” et “recent_days”

Cas des VM

Dans certains cas, et typiquement dans les VM sur Xen, si on essaie de récupérer un flux rss situé sur la même VM, ça bloque.

Dans ce cas, il faut modifier /etc/hosts afin d'ajouter l'ip interne associée au nom de domaine2) :

127.0.0.1    localhost
192.168.20.39    jukni3 jukni3
192.168.20.39   khaganat.net
192.168.20.43   git.khaganat.net

Note : à ce stade, on ne récupère que les flux en http, pas en https. Activer un certificat autosigné et le ssl sur la VM ne suffit pas.

Pour les flux sur le reste du web, tout va bien.

Mise à jour

Il suffit de mettre à jour le wiki principal. Attention, certaines choses peuvent casser, il convient de sauver le dossier avant la mise jour !

Sur Khaganat, les fichiers suivants ont été modifiés et sont écrasés par la mise à jour.

Les fichiers modifiés dans le dossier conf sont de la forme “*.local.php” : cela les préserve lors des mises à jour.

Mise à jour de Hogfather vers Igor

Dokuwki ajoute le dossier data/log/, nécessaire pour fonctionner. Pour l'ajouter dans tous les animaux du wiki, un script pour récupérer les commandes et automatiser la tâche :

cd farm/
cp -r ../dokuwiki/data/log _animal/data/log
for farm in * ; do echo "sudo cp -r _animal/data/log $farm/data/log" ; echo "sudo chown -R www-data: $farm/data/log" ; done

On nettoie, dans ce qu'on récupère, ce qui n'est pas une ferme qu'on veut mettre à jour (genre, si on a mis un index.php dans le coin), on vérifie que tout va bien puis on lance le lot de commande.

Le processus d'authentification a changé aussi, mais la page ici est mise à jour. Il suffit de modifier dokuwiki/inc/init.php et tout ira bien.

Il faut aussi modifier le .htaccess et indiquer le passage suivant :

<Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</Files>

Nginx

EN COURS DE TEST

server{
    listen 80;
    listen [::]:80;
    server_name khaganat.net;
 
    access_log /var/log/nginx/dokuwki_access_log;
    error_log /var/log/nginx/dokuwiki_error_log;
 
    root /var/www;
    index doku.php index.php index.html;
 
    client_max_body_size 4M;
    client_body_buffer_size 128k;
 
        location / {
                try_files $uri $uri/ @dokuwiki;
        }
 
 
        location /bienvenue {
            return 301 http://$host/farm/bienvenue/doku.php;
            }
 
 
        location /wikhan {
            return 301 http://$host/farm/wikhan/doku.php;
            }
 
        location /rc {
            #return 301 http://$host/rc;
            alias /var/www/rc2/dev.ryzom.com/projects/ryzom/wiki;
            }
 
        location ~ /farm {
            index index.php;
            autoindex on;
            rewrite ^/farm/?([^/]+)/(.*) /dokuwiki/$2?animal=$1;
            rewrite ^/farm/?([^/]+)$ /dokuwiki/?animal=$1;
 
            }
 
 
        location @dokuwiki {
                rewrite ^/dokuwiki/_media/(.*) /lib/exe/fetch.php?media=$1 last;
                rewrite ^/dokuwiki/_detail/(.*) /lib/exe/detail.php?media=$1 last;
                rewrite ^/dokuwiki/_export/([^/]+)/(.*) /index.php?do=export_$1&id=$2 last;
                rewrite ^/dokuwiki/(?!lib/)(.*) /index.php?id=$1&$args last;
        }
 
        location ~ \.php$ {
                if (!-f $request_filename) { return 404; }
                include fastcgi_params;
               fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
                include snippets/fastcgi-php.conf;
        }
 
        location ~ /(data|conf|bin|inc)/ {
                deny all;
        }
 
        location ~* \.(png|ico)$ {
                expires 90d;
        }
}

Annexes

preload.php dans nos installations

Voici le contenu complet de inc/preload.php, modifié pour correspondre à nos usages (partage de la plupart de la config) :

preload.php
<?php
// set this to share some config : DOKU_CONF_SHARED = path to farmer conf = /var/www/dokuwiki/conf/
if(!defined('DOKU_CONF_SHARED')) define('DOKU_CONF_SHARED', '/var/www/dokuwiki/conf/');
 
// set this to your farm directory
if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', '/var/www/farm');
 
// include this after DOKU_FARMDIR if you want to use farms
include(fullpath(dirname(__FILE__)).'/farm.php');
 
// you can overwrite the $config_cascade to your liking
//$config_cascade = array(
//);
 
$config_cascade['plainauth.users'] = array(
    'default'   => DOKU_CONF_SHARED . 'users.auth.php',
);
 
$config_cascade['lang'] = array(
             'core'      => array(DOKU_CONF_SHARED . 'lang/'), 
             'plugin'    => array(DOKU_CONF_SHARED . 'plugin_lang/'), 
             'template'  => array(DOKU_CONF_SHARED . 'template_lang/') 
);
1)
Merci à IsilinBN pour l'astuce ; la source est ici
2)
Ici, en exemple, la VM a l'ip 192.168.20.39 sur le réseau interne, et on ajoute aussi une autre VM présente sur le réseau interne.