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 :
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.
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
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.
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.
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 :
/inc/preload.php
(voir les détails plus bas)./var/www/farm
_animal
en nomduwiki
sudo chown -R www-data: **nom de l'animal**/ sudo chmod -R g+w /var/www/farm/**nom de l'animal**
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.
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/') );
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.
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
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.
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.
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>
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”
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.
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.
dokuwiki/inc
dokuwiki/inc/lang/fr
Les fichiers modifiés dans le dossier conf
sont de la forme “*.local.php” : cela les préserve lors des mises à jour.
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>
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; } }
Voici le contenu complet de inc/preload.php
, modifié pour correspondre à nos usages (partage de la plupart de la config) :
<?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/') );