1. Présentation et architecture
MediaWiki est le moteur de wiki libre (licence GPL) développé par la fondation Wikimédia : c’est lui qui fait tourner Wikipédia. Il est largement utilisé en entreprise pour la documentation technique (procédures, schémas réseau, base de connaissances du support).
Une installation repose sur trois briques logicielles, plus un espace de stockage pour les fichiers téléversés :
| Composant | Rôle | Paquet Debian 13 |
|---|---|---|
| Serveur web | Reçoit les requêtes HTTP/HTTPS du navigateur et sert les pages | apache2 |
| Interpréteur PHP | Exécute le code de MediaWiki et génère les pages HTML | php8.4 + libapache2-mod-php |
| Base de données | Stocke les pages, l’historique des révisions, les comptes | mariadb-server |
| Système de fichiers | Stocke les fichiers téléversés (images, PDF) dans images/ | — |
Chemin d’une requête : navigateur → Apache (443) → PHP → MariaDB (socket local). La base de données n’a donc aucune raison d’être joignable depuis le réseau : elle n’écoute que localement.
2. Prérequis
| Élément | Minimum (TP) | Recommandé (production) |
|---|---|---|
| Système | Debian 13 sans interface graphique | Debian 13 à jour, installation minimale |
| Processeur / mémoire | 1 vCPU / 1 Go | 2 vCPU / 2 à 4 Go |
| Disque | 10 Go | 20 Go et plus (selon le volume de fichiers téléversés) |
| Réseau | Adresse IP fixe | Adresse IP fixe + nom DNS (ex. wiki.lab.local) |
| Accès | Compte avec sudo, accès SSH | Authentification SSH par clé, root désactivé en SSH |
3. Préparer le serveur
3.1 Vérifier le nom de la machine et le réseau
Avant toute installation, on vérifie que la machine est correctement identifiée : un nom ou une adresse incohérents sont la première cause de dysfonctionnement (certificat, accès au wiki, journaux).
# Nom de la machine
hostnamectl
# Le modifier si nécessaire
sudo hostnamectl set-hostname srv-wiki
# Adresse IP, passerelle et DNS
ip -br a
ip route
cat /etc/resolv.conf
# Résolution du nom local : la ligne suivante doit exister dans /etc/hosts
# 192.168.1.50 wiki.lab.local srv-wiki
getent hosts wiki.lab.local
3.2 Mettre à jour le système
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y curl wget gnupg ca-certificates unzip
| Commande | Effet |
|---|---|
apt update | Met à jour la liste des paquets disponibles dans les dépôts. |
apt full-upgrade -y | Installe toutes les mises à jour, y compris celles qui ajoutent ou retirent des dépendances (noyau, par ex.). |
apt install … | Installe les outils utilisés plus loin : téléchargement (wget, curl) et vérification de signature (gnupg). |
Si le noyau a été mis à jour, redémarrez : sudo reboot.
4. Installer le serveur web Apache
sudo apt install -y apache2
sudo systemctl enable --now apache2
systemctl status apache2 --no-pager
Depuis un poste client, ouvrez http://192.168.1.50 : la page « Apache2 Debian Default Page » doit s’afficher. Activez ensuite les modules utilisés plus loin :
sudo a2enmod ssl headers rewrite
sudo systemctl restart apache2
5. Installer et configurer MariaDB
5.1 Installation et sécurisation
sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation
| Question posée | Réponse conseillée | Pourquoi |
|---|---|---|
| Enter current password for root | Touche Entrée | Aucun mot de passe n’est défini pour root sur une installation neuve. |
| Switch to unix_socket authentication | n | Déjà le cas sur Debian : root s’authentifie par le compte système, sans mot de passe réseau. |
| Change the root password? | n | Inutile avec l’authentification par socket. |
| Remove anonymous users? | Y | Supprime les comptes sans nom, accessibles à tous. |
| Disallow root login remotely? | Y | Root ne doit jamais se connecter à distance. |
| Remove test database? | Y | Base de démonstration accessible à tous. |
| Reload privilege tables now? | Y | Applique immédiatement les changements. |
Vérifiez que MariaDB n’écoute que localement (127.0.0.1:3306) :
sudo ss -tlnp | grep 3306
5.2 Créer la base et l’utilisateur dédiés
Générez d’abord un mot de passe robuste, puis notez-le dans votre gestionnaire de mots de passe :
openssl rand -base64 24
sudo mariadb
Dans le client MariaDB :
CREATE DATABASE wikidb;
CREATE USER 'wikiuser'@'localhost' IDENTIFIED BY 'mot_de_passe_généré';
GRANT ALL PRIVILEGES ON wikidb.* TO 'wikiuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
| Instruction | Explication |
|---|---|
CREATE DATABASE wikidb; | Crée la base qui contiendra toutes les tables du wiki. |
CREATE USER 'wikiuser'@'localhost' | Crée un compte limité à la connexion locale : il est inutilisable depuis une autre machine. |
GRANT ALL PRIVILEGES ON wikidb.* | Donne tous les droits sur cette seule base (nécessaire pour les mises à jour du schéma), et aucun sur les autres. |
FLUSH PRIVILEGES; | Recharge la table des droits. Facultatif après CREATE USER et GRANT, qui s’appliquent immédiatement, mais sans inconvénient. |
Testez la connexion avec le nouveau compte : mariadb -u wikiuser -p wikidb -e "SELECT 1;".
6. Installer PHP et ses extensions
sudo apt install -y php libapache2-mod-php php-mysql php-intl php-mbstring \
php-xml php-apcu php-gd php-curl php-cli imagemagick
| Paquet | Utilité pour MediaWiki |
|---|---|
php, libapache2-mod-php | Interpréteur PHP 8.4 et son intégration à Apache. |
php-mysql | Connexion à MariaDB (pilote mysqli). |
php-intl, php-mbstring | Gestion des langues et des caractères Unicode (obligatoires). |
php-xml | Analyse XML/DOM (obligatoire). |
php-apcu | Cache mémoire : accélère nettement l’affichage des pages. |
php-gd, imagemagick | Création des miniatures des images téléversées. |
php-curl | Requêtes HTTP sortantes (éditeur visuel, extensions). |
php-cli | Exécution des scripts de maintenance en ligne de commande. |
6.1 Ajuster la configuration de PHP
Plutôt que de modifier le fichier php.ini livré par Debian, on ajoute un fichier dédié, plus facile à retrouver et qui survit aux mises à jour :
sudo nano /etc/php/8.4/apache2/conf.d/99-mediawiki.ini
; Réglages pour MediaWiki
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 60
; Ne pas révéler la version de PHP dans les en-têtes HTTP
expose_php = Off
sudo systemctl restart apache2
php -v
php -m | grep -E "intl|mbstring|mysqli|xml|apcu"
7. Télécharger et vérifier MediaWiki
On télécharge l’archive officielle et sa signature, puis on vérifie qu’elle a bien été produite par l’équipe MediaWiki. Cette étape garantit que le fichier n’a été ni corrompu, ni modifié par un tiers.
cd /tmp
wget https://releases.wikimedia.org/mediawiki/1.43/mediawiki-1.43.11.tar.gz
wget https://releases.wikimedia.org/mediawiki/1.43/mediawiki-1.43.11.tar.gz.sig
# Importer les clés publiques des développeurs MediaWiki, puis vérifier
wget https://www.mediawiki.org/keys/keys.txt
gpg --import keys.txt
gpg --verify mediawiki-1.43.11.tar.gz.sig mediawiki-1.43.11.tar.gz
Le résultat doit contenir « Good signature » (ou « Bonne signature »). L’avertissement « This key is not certified with a trusted signature » est normal : il signale seulement que vous n’avez pas vous-même signé la clé. En cas de « BAD signature », ne pas installer : supprimez l’archive et retéléchargez-la.
7.1 Décompresser dans le répertoire web
sudo tar -xzf mediawiki-1.43.11.tar.gz -C /var/www/
sudo mv /var/www/mediawiki-1.43.11 /var/www/mediawiki
ls /var/www/mediawiki
On place le wiki dans /var/www/mediawiki (et non dans /var/www/html) : il disposera de son propre hôte virtuel et sera accessible directement à la racine du site, par exemple https://wiki.lab.local/.
8. Configurer les permissions
Principe : le serveur web doit pouvoir lire le code, mais ne doit pouvoir écrire que là où c’est indispensable (fichiers téléversés et cache). Ainsi, une faille éventuelle dans PHP ne permet pas de modifier le code du wiki.
# Le code appartient à root : lecture seule pour Apache
sudo chown -R root:root /var/www/mediawiki
sudo find /var/www/mediawiki -type d -exec chmod 755 {} \;
sudo find /var/www/mediawiki -type f -exec chmod 644 {} \;
# Seuls les répertoires des fichiers téléversés et du cache sont modifiables par Apache
sudo chown -R www-data:www-data /var/www/mediawiki/images /var/www/mediawiki/cache
9. Configurer l’hôte virtuel Apache en HTTPS
9.1 Créer un certificat
En TP / laboratoire, on génère un certificat auto-signé (le navigateur affichera un avertissement, ce qui est normal). En production, avec un nom de domaine public, on utilise un certificat Let’s Encrypt (sudo apt install certbot python3-certbot-apache puis sudo certbot --apache) ou le certificat de l’autorité interne de l’établissement.
sudo openssl req -x509 -nodes -newkey rsa:3072 -days 825 \
-keyout /etc/ssl/private/wiki.lab.local.key \
-out /etc/ssl/certs/wiki.lab.local.crt \
-subj "/CN=wiki.lab.local" -addext "subjectAltName=DNS:wiki.lab.local"
sudo chmod 600 /etc/ssl/private/wiki.lab.local.key
9.2 Créer le fichier de configuration du site
sudo nano /etc/apache2/sites-available/mediawiki.conf
# Redirection de HTTP vers HTTPS
<VirtualHost *:80>
ServerName wiki.lab.local
Redirect permanent / https://wiki.lab.local/
</VirtualHost>
<VirtualHost *:443>
ServerName wiki.lab.local
ServerAdmin admin@lab.local
DocumentRoot /var/www/mediawiki
SSLEngine on
SSLCertificateFile /etc/ssl/certs/wiki.lab.local.crt
SSLCertificateKeyFile /etc/ssl/private/wiki.lab.local.key
<Directory /var/www/mediawiki>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# Fichiers téléversés : interdire toute exécution de code
<Directory /var/www/mediawiki/images>
php_admin_flag engine off
Options -ExecCGI -Indexes
Header always set X-Content-Type-Options "nosniff"
</Directory>
# Répertoires internes : jamais servis directement
<DirectoryMatch "^/var/www/mediawiki/(cache|includes|languages|maintenance|serialized|tests|vendor)/">
Require all denied
</DirectoryMatch>
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
ErrorLog ${APACHE_LOG_DIR}/wiki_error.log
CustomLog ${APACHE_LOG_DIR}/wiki_access.log combined
</VirtualHost>
| Directive | Rôle |
|---|---|
Redirect permanent | Toute connexion en HTTP (port 80) est renvoyée vers HTTPS : aucun mot de passe ne circule en clair. |
DocumentRoot | Répertoire racine du site : le wiki est servi à la racine de https://wiki.lab.local/. |
Options -Indexes | Interdit l’affichage du contenu d’un répertoire sans page d’index. |
AllowOverride None | Ignore les fichiers .htaccess : toute la configuration est centralisée ici (plus sûr et plus rapide). |
php_admin_flag engine off | Un fichier PHP déposé dans images/ ne sera jamais exécuté. |
Require all denied | Bloque l’accès web aux répertoires de code et de maintenance. |
ErrorLog / CustomLog | Journaux dédiés au wiki, indispensables pour le dépannage et la détection d’incidents. |
9.3 Activer le site
sudo a2ensite mediawiki.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
apache2ctl configtest doit répondre Syntax OK avant tout rechargement. a2ensite active le site (lien symbolique dans sites-enabled), a2dissite désactive la page par défaut de Debian.
9.4 Masquer les informations du serveur
sudo nano /etc/apache2/conf-available/security.conf
# Passer les deux directives suivantes à ces valeurs :
ServerTokens Prod
ServerSignature Off
sudo systemctl reload apache2
10. Finaliser l’installation
10.1 Méthode 1 : assistant web
Depuis un poste client (dont le fichier hosts ou le DNS résout wiki.lab.local), ouvrez https://wiki.lab.local/, puis cliquez sur « set up the wiki » (l’assistant se trouve dans /mw-config/).
| Écran de l’assistant | Valeur à saisir |
|---|---|
| Langue | fr – français pour vous et pour le wiki |
| Environnement | Vérification automatique : tout doit être vert. Une extension manquante est signalée ici (revenir à l’étape 6). |
| Connexion à la base | Type MariaDB, MySQL, hôte localhost, base wikidb, préfixe vide, utilisateur wikiuser et son mot de passe |
| Paramètres de la base | Cocher « Utiliser le même compte que pour l’installation » |
| Nom | Nom du wiki, puis compte administrateur (nom nominatif, mot de passe robuste) |
| Options (« Me poser d’autres questions ») | Profil de droits : « Compte requis pour modifier » ou « Wiki privé » ; activer le téléversement de fichiers ; cache : « PHP object caching (APCu) » |
À la fin, l’assistant génère le fichier LocalSettings.php et vous le propose en téléchargement. Ce fichier contient toute la configuration du wiki, dont le mot de passe de la base : il doit être copié sur le serveur, puis protégé.
# Depuis le poste client : copier le fichier sur le serveur
scp LocalSettings.php utilisateur@192.168.1.50:/tmp/
# Sur le serveur : le mettre en place et le protéger
sudo mv /tmp/LocalSettings.php /var/www/mediawiki/
sudo chown root:www-data /var/www/mediawiki/LocalSettings.php
sudo chmod 640 /var/www/mediawiki/LocalSettings.php
Les droits 640 (propriétaire root, groupe www-data) permettent à Apache de lire le fichier, sans le modifier, et interdisent toute lecture aux autres comptes du système.
10.2 Méthode 2 : installation en ligne de commande
Alternative plus rapide et reproductible, utile pour scripter un déploiement :
cd /var/www/mediawiki
# Saisie des mots de passe sans les afficher ni les garder dans l'historique
read -rsp "Mot de passe wikiuser : " DBPASS; echo
read -rsp "Mot de passe admin du wiki : " ADMPASS; echo
sudo php maintenance/run.php install \
--dbtype=mysql --dbserver=localhost --dbname=wikidb \
--dbuser=wikiuser --dbpass="$DBPASS" \
--installdbuser=wikiuser --installdbpass="$DBPASS" \
--server="https://wiki.lab.local" --scriptpath="" --lang=fr \
--pass="$ADMPASS" "Wiki BTS SIO" "Jean.Dupont"
unset DBPASS ADMPASS
sudo chown root:www-data LocalSettings.php && sudo chmod 640 LocalSettings.php
Le dernier argument est le nom du compte administrateur : choisissez un compte nominatif (ici Jean.Dupont), pas un « Admin » partagé.
Rechargez ensuite https://wiki.lab.local/ : la page d’accueil du wiki s’affiche. Connectez-vous avec le compte administrateur, puis consultez la page Spécial:Version pour vérifier les versions de MediaWiki, PHP et MariaDB.
11. Sécuriser et optimiser le wiki
11.1 Réglages à ajouter dans LocalSettings.php
Ajoutez les lignes suivantes à la fin du fichier (sudo nano /var/www/mediawiki/LocalSettings.php). Elles complètent ou remplacent les valeurs générées par l’assistant :
## --- Droits des visiteurs anonymes ---
$wgGroupPermissions['*']['edit'] = false; // modification réservée aux comptes
$wgGroupPermissions['*']['createaccount'] = false; // comptes créés par un administrateur
# Wiki entièrement privé : décommenter la ligne suivante
# (la page de connexion reste toujours accessible)
# $wgGroupPermissions['*']['read'] = false;
## --- HTTPS ---
$wgServer = "https://wiki.lab.local";
$wgForceHTTPS = true;
## --- Téléversement de fichiers ---
$wgEnableUploads = true;
$wgFileExtensions = [ 'png', 'jpg', 'jpeg', 'gif', 'webp', 'pdf' ];
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
## --- Performances ---
$wgMainCacheType = CACHE_ACCEL; // cache APCu
$wgJobRunRate = 0; // tâches de fond traitées par un timer (11.3)
11.2 Pare-feu
Seuls SSH et le web doivent être joignables. Autorisez SSH avant d’activer le pare-feu, sinon la session à distance sera coupée.
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Pour aller plus loin : restreindre SSH au réseau d’administration (sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp) et installer fail2ban contre les attaques par force brute.
11.3 Traiter les tâches de fond (job queue)
MediaWiki diffère certaines tâches (mise à jour des liens, des catégories, miniatures). Plutôt que de les exécuter pendant les visites, on les confie à un timer systemd qui tourne toutes les 5 minutes sous le compte www-data.
sudo nano /etc/systemd/system/mediawiki-jobs.service
[Unit]
Description=MediaWiki - traitement de la file des tâches
[Service]
Type=oneshot
User=www-data
ExecStart=/usr/bin/php /var/www/mediawiki/maintenance/run.php runJobs --maxtime=240
sudo nano /etc/systemd/system/mediawiki-jobs.timer
[Unit]
Description=MediaWiki - lancer runJobs toutes les 5 minutes
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now mediawiki-jobs.timer
systemctl list-timers | grep mediawiki
12. Sauvegarder et restaurer
Une sauvegarde complète de MediaWiki comporte trois éléments : la base de données, le répertoire images/ et le fichier LocalSettings.php (sans oublier les extensions et habillages ajoutés manuellement).
sudo mkdir -p /var/backups/wiki && sudo chmod 700 /var/backups/wiki
DATE=$(date +%F)
# 1. Base de données (cohérente, sans bloquer le wiki)
sudo mariadb-dump --single-transaction --default-character-set=binary wikidb \
| gzip > /tmp/wikidb-$DATE.sql.gz && sudo mv /tmp/wikidb-$DATE.sql.gz /var/backups/wiki/
# 2. Fichiers téléversés et configuration
sudo tar -czf /var/backups/wiki/wiki-files-$DATE.tar.gz \
-C /var/www/mediawiki images LocalSettings.php
Restauration sur un serveur préparé de la même façon (étapes 3 à 9) :
gunzip -c wikidb-AAAA-MM-JJ.sql.gz | sudo mariadb wikidb
sudo tar -xzf wiki-files-AAAA-MM-JJ.tar.gz -C /var/www/mediawiki
sudo chown -R www-data:www-data /var/www/mediawiki/images
sudo php /var/www/mediawiki/maintenance/run.php update --quick
13. Mettre à jour MediaWiki
Les versions correctives (1.43.x) corrigent surtout des failles de sécurité : elles doivent être appliquées rapidement. La procédure consiste à installer la nouvelle version à côté de l’ancienne, puis à y reporter la configuration et les données.
- Sauvegarder (section 12).
- Télécharger et vérifier la nouvelle archive (section 7), puis la décompresser dans
/var/www/. - Copier dans le nouveau répertoire :
LocalSettings.php, le contenu deimages/, les extensions et habillages ajoutés manuellement. - Basculer : renommer l’ancien répertoire en
mediawiki.old, le nouveau enmediawiki, puis réappliquer les permissions (section 8). - Mettre à jour le schéma de la base :
sudo php /var/www/mediawiki/maintenance/run.php update --quick. - Contrôler la page Spécial:Version, puis supprimer
mediawiki.oldaprès quelques jours.
Le passage à une nouvelle branche (par exemple de la 1.43 LTS à la LTS suivante) suit la même procédure, mais demande de lire les notes de version (RELEASE-NOTES) et de vérifier la compatibilité des extensions installées.
14. Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
| La page par défaut d’Apache s’affiche | Le site 000-default est toujours actif | sudo a2dissite 000-default.conf && sudo systemctl reload apache2 |
| Page blanche ou erreur 500 | Extension PHP manquante, erreur dans LocalSettings.php | Lire /var/log/apache2/wiki_error.log ; vérifier php -m |
| « Access denied for user ‘wikiuser’@‘localhost’ » | Mot de passe ou hôte erroné | Tester mariadb -u wikiuser -p wikidb ; recréer le mot de passe si besoin |
| Retour permanent à l’assistant d’installation | LocalSettings.php absent ou illisible par Apache | Vérifier son emplacement et ses droits (640, groupe www-data) |
| Pages sans mise en forme (CSS absent) | $wgServer ou $wgScriptPath incorrect | Corriger ces variables dans LocalSettings.php |
| Échec du téléversement | Droits sur images/ ou taille maximale atteinte | chown -R www-data:www-data images ; ajuster upload_max_filesize |
| Avertissement de certificat | Certificat auto-signé | Normal en TP ; en production, certificat Let’s Encrypt ou autorité interne |
15. Mise en pratique
Pour aller plus loin
- URL courtes (
/wiki/Nom_de_pageau lieu de/index.php?title=…) : variables$wgArticlePathet règles de réécriture Apache. - PHP-FPM avec le module
mpm_eventd’Apache : meilleure tenue en charge quemod_php. Attention : la directivephp_admin_flag engine offne s’applique plus ; on empêche alors l’exécution dansimages/en n’y transmettant aucun fichier à PHP-FPM (bloc<FilesMatch>ouSetHandler None). - Authentification centralisée sur un annuaire LDAP / Active Directory : extensions
PluggableAuthetLDAPAuthentication2. - Éditeur visuel (VisualEditor, livré avec MediaWiki) :
wfLoadExtension( 'VisualEditor' );dansLocalSettings.php. - Conteneurisation : image Docker officielle
mediawikiassociée à un conteneur MariaDB. - Supervision : surveiller les services Apache et MariaDB, l’expiration du certificat et l’espace disque (voir La supervision informatique).
- Sur ce site : Installer MariaDB sous Debian, Nextcloud, plateforme collaborative (une installation proche), Fiche HTTP, Animation : chiffrement et certificats, Durcir un serveur Linux, Le recettage informatique pour valider l’installation.
🧠 Testez vos connaissances
6 questions. Répondez puis cliquez sur « Corriger ». Rien n’est enregistré : c’est de l’auto-évaluation.
© 2026 Bruno Jousseaume. Ce cours est publié sous licence CC BY-NC-SA 4.0 : vous pouvez le partager et l’adapter en citant l’auteur et un lien vers cette page, sans usage commercial, et en partageant vos adaptations sous la même licence.