Pour créer un nouveau wiki géré par Ikiwiki, voici la marche à suivre :

  1. Créer un nouveau dépôt Git.
  2. Mettre un premier fichier (index.mdwn) dans le dépôt.
  3. Créer un nouvel user système et les répertoires pour le wiki.
  4. Configurer Ikiwiki.
  5. Mettre en place le nettoyage du dépot utilisé par Ikiwiki.
  6. Configurer Nginx.
  7. Configurer le dépôt Git.

Dans ce qui suit, $WIKI est à remplacer par le nom du wiki. Les opérations se passent sur bulbe.nos-oignons.net.

Utilisateur système

On crée un nouvel user système :

adduser --system --home /srv/ikiwiki/wiki-$WIKI \
        --group \
        --disabled-login --disabled-password \
        wiki-$WIKI

Afin que ce compte puisse accéder au dépôt Git, on va générer une nouvelle paire de clés SSH :

sudo -H -u wiki-$WIKI ssh-keygen -t rsa -b 4096 -N ''

Il faut ensuite donner accès au dépôt créé précédemment à ce nouveau compte.

Source et destination

On va ensuite préparer l'espace pour les données d'Ikiwiki.

On commence par faire un clone du dépôt qui est utilisé comme source par Ikiwiki :

sudo -H -u wiki-$WIKI \
        git clone ssh://git@bulbe.nos-oignons.net/wiki-$WIKI.git \
        /srv/ikiwiki/wiki-$WIKI/src

On crée le répertoire de destination qui sera servi par Nginx :

mkdir /srv/ikiwiki/wiki-$WIKI/dest
chown wiki-$WIKI:www-data /srv/ikiwiki/wiki-$WIKI/dest
chmod 750 /srv/ikiwiki/wiki-$WIKI/dest

Configuration d'Ikiwiki

On va générer un nouveau fichier de configuration avec les réglages par défaut :

ikiwiki --dumpsetup /etc/ikiwiki/wiki-$WIKI.setup
ln -s /etc/ikiwiki/wiki-$WIKI.setup /srv/ikiwiki/wiki-$WIKI/ikiwiki.setup

C'est le moment de faire etckeeper commit, car on pourra ensuite mieux voir les différences par rapport à la configuration de base.

Pour faire apparaître la configuration relative à Git, faites :

ikiwiki --changesetup /etc/ikiwiki/wiki-$WIKI.setup \
        --rcs git

Pour exemple, voici les changements qui ont été faits dans la configuration du wiki-admin :

wikiname: Admin. sys. Nos oignons
adminemail: machines@nos-oignons.net
srcdir: /srv/ikiwiki/wiki-admin/src
destdir: /srv/ikiwiki/wiki-admin/dest
url: https://nos-oignons.net/wiki-admin/
cgiurl: https://nos-oignons.net/wiki-admin/ikiwiki.cgi
cgi_wrapper: /srv/ikiwiki/wiki-admin/dest/ikiwiki.cgi
rcs: git
add_plugins:
- 404
- favicon
- goodstuff
- httpauth
- pingee
- sidebar
- po
disable_plugins:
- passwordauth
discussion: 0
html5: 1
sslcookie: 1
locale: fr_FR.UTF-8
hardlink: 1
umask: public
timezone: Europe/Paris
gitorigin_branch: origin
gitmaster_branch: master
rss: 1
atom: 1
allowrss: 1
allowatom: 1
po_master_language: fr|French
po_translatable_pages: ''
po_link_to: default
tagbase: tags
tag_autocreate: 0
tag_autocreate_commit: 0

Il faut ensuite ajouter aussi le wiki dans la liste qui se trouve dans /etc/ikiwiki/wikilist :

wiki-$WIKI /etc/ikiwiki/wiki-$WIKI.setup

On peut enfin construire le wiki en faisant :

ikiwiki-mass-rebuild

Nettoyage du dépot

Ikiwiki maintient un clone du dépot Git contenant le wiki. Pour des raisons d'efficacité et d'espace, ce dernier doit être nettoyé mensuellement, à l'aide du script git-gc.

Ceci est automatisé avec une entrée dans /etc/cron.d/git-gc :

#m h  dom mon dow  user         command
57 6   22  *  *    wiki-$WIKI   git-gc /srv/ikiwiki/wiki-$WIKI/src

On veillera à ne pas déclancher toutes les tâches de ce genre simultanément.

Configuration de Nginx

C'est Nginx qui s'occupe de rendre le site disponible à travers un navigateur.

Pages web

On va ajouter dans la configuration du serveur une section location et une dircetive alias pour rendre le wiki accessible. Par exemple :

server {
    [...]
    location /wiki-$WIKI {
        alias /srv/ikiwiki/wiki-$WIKI/dest;
    }
    [...]
}

Exécution du CGI

Pour que les interactions web d'Ikiwiki fonctionnent correctement, il faut indiquer à Nginx d'exécuter le CGI :

server {
    [...]
    location /wiki-$WIKI {
        alias /srv/ikiwiki/wiki-$WIKI/dest;
        [...]
        location = /wiki-$WIKI/ikiwiki.cgi {
            fastcgi_param SCRIPT_FILENAME /srv/ikiwiki/wiki-$WIKI/dest/ikiwiki.cgi;
            include snippets/fastcgi.conf;
        }
    }
    [...]
}

Authentification HTTPS

Pour limiter l'accès au wiki en utilisant une authentification HTTP, il faut créer une nouvelle base avec htpasswd :

htpasswd -c /etc/nginx/passwd/wiki-$WIKI $USER

Et pour le deuxième, on enlève -c :

htpasswd /etc/nginx/passwd/wiki-$WIKI $ANOTHER_USER

Pour le confort, on ajoute un lien symbolique :

ln -s /etc/nginx/passwd/wiki-$WIKI /srv/ikiwiki/wiki-$WIKI/passwd

On configure ensuite l'authentification :

server {
    [...]
    location /wiki-$WIKI {
        alias /srv/ikiwiki/wiki-$WIKI/dest;
        auth_basic "Description du wiki";
        auth_basic_user_file /etc/nginx/passwd/wiki-$WIKI;
        [...]
        }
    }
    [...]
}

Avec cette configuration, on active en général le plugin httpauth et on désactive par contre la base d'authentification interne d'Ikiwiki en désactivant le plugin passwordauth.

On peut à ce moment-là tester si le CGI et l'écriture vers le dépôt Git central fonctionnent correctement. Par exemple en allant modifier le bac à sable :

https://nos-oignons.net/wiki-$WIKI/sandbox/

Configuration du dépôt Git

Si l'accès à ikiwiki.cgi est protégé par une authentification HTTP, il faut y ajouter un compte pour pouvoir réaliser les pings. On prendra un mot de passe aléatoire, long et compliqué :

htpasswd /etc/nginx/passwd/wiki-$WIKI pinger

On configure le hook du dépôt Git pour réaliser le ping en prenant en compte les spécificités de Gitolite. La suite doit donc être exécutée en tant qu'user git :

sudo -u git -s -H

On va créer un nouveau répertoire pour nos hooks :

mkdir ~/.gitolite/hooks/wiki-$WIKI

On crée alors un nouveau script ~git/.gitolite/hooks/wiki-$WIKI/post-update, en mettant le mot de passe généré précédemment :

#!/bin/sh

at now <<EOF
        curl --silent --show-error \
                --basic --user 'pinger:$PINGER_PASSWD' \
                'https://nos-oignons.net/wiki-$WIKI/ikiwiki.cgi?do=ping' >/dev/null
EOF

L'utilisation de at now est nécessaire pour éviter un deadlock. Les explications détaillées se trouvent dans la procédure d'installation.

On va rendre ce script exécutable, et demander à Gitolite de faire le lien symbolique au bon endroit :

chmod +x ~/.gitolite/hooks/wiki-$WIKI/post-update
cd ~/repositories/wiki-$WIKI.git/hooks
ln -s ../../../.gitolite/hooks/wiki-$WIKI/post-update .
gl-setup

Si tout va bien, le prochain push vers le dépôt déclenchera la mise à jour du wiki.