On parle beaucoup de la création d'un site WordPress, rarement de ce qui vient après. Pourtant, c'est la maintenance qui décide si un site est encore sûr, rapide et en ligne deux ans plus tard. Ce guide décrit la routine que nous appliquons à nos sites et à ceux que nous maintenons en sous-traitance, et surtout les raisons de chaque étape — la plupart viennent d'un incident.

1. Les sauvegardes : vérifier, puis éloigner

Une sauvegarde doit prouver qu'elle est complète

Un dump de base de données peut échouer à mi-parcours — disque plein, connexion coupée, table verrouillée — et laisser un fichier tronqué qui a toutes les apparences d'une sauvegarde. Le jour où l'on en a besoin, il ne se restaure pas.

La parade est simple : un dump complet produit par mysqldump se termine par une ligne de commentaire -- Dump completed. Notre script de sauvegarde contrôle sa présence avant de conserver le fichier, et considère la sauvegarde comme échouée sinon. Le fichier compressé est également testé (gzip -t). Ce sont deux lignes de script qui transforment « un fichier existe » en « une sauvegarde exploitable existe ».

Une copie sur le même serveur ne protège pas du serveur

Nos sauvegardes quotidiennes sont conservées sept jours sur le serveur de production. Elles protègent contre une erreur de manipulation ou une corruption de données, pas contre la perte du serveur lui-même. Pour cela, il faut une copie ailleurs.

Le modèle que nous avons retenu est une copie tirée plutôt que poussée : c'est la machine de stockage distante qui vient chercher les sauvegardes, avec une clé SSH dédiée limitée côté serveur à la lecture seule d'un unique répertoire. Un attaquant qui prendrait le contrôle du serveur de production n'aurait ainsi aucun accès en écriture aux copies distantes et ne pourrait pas les effacer. La copie distante est organisée en rotations quotidienne, hebdomadaire et mensuelle, ce qui permet de remonter plusieurs mois en arrière sans multiplier l'espace occupé.

Répéter la restauration

Une procédure de restauration jamais exécutée est une hypothèse. Au moins une fois, restaurez une sauvegarde sur un environnement de test et vérifiez que le site fonctionne. Sur un multisite, vérifiez aussi que vous savez restaurer un seul site sans ramener les autres en arrière — ce point est détaillé dans notre guide sur le multisite à domaines distincts.

2. Les mises à jour : un seul chemin

La règle qui évite le plus de problèmes : une mise à jour suit le même chemin que le code. Elle est faite en local ou en test, enregistrée dans le dépôt, puis déployée. Jamais cliquée directement dans l'administration de production.

Nous avons constaté ce qui arrive quand la règle n'est pas tenue : une mise à jour du cœur de WordPress appliquée hors du flux laisse le dépôt désynchronisé : des fichiers du cœur modifiés dans wp-admin et wp-includes qu'aucun commit ne décrit. Le prochain déploiement risque alors d'écraser la mise à jour, ou d'embarquer par accident des changements que personne n'a relus. Le rattrapage est possible, mais demande un tri soigneux plutôt qu'un git add général.

Tester ce qui est livré, pas ce qui est développé

Un autre incident nous a appris à tester l'artefact final. Une de nos extensions a nécessité trois versions correctives successives, parce que le fichier principal avait été reconstruit sans une partie de ses inclusions : l'extension fonctionnait dans l'environnement de développement, où un chargeur automatique masquait le problème, et échouait une fois installée ailleurs. Depuis, l'archive livrée est installée dans un WordPress vierge avant publication. Le guide publier une extension sur WordPress.org reprend ces vérifications.

L'ordre des opérations

  1. Sauvegarde vérifiée juste avant.
  2. Mise à jour en test : cœur, puis extensions une par une, en lisant les notes de version des versions majeures.
  3. Parcours des pages critiques : accueil, un article, un formulaire, la connexion, et les fonctions métier du site.
  4. Enregistrement dans le dépôt et déploiement.
  5. Vérification en production, avec et sans contournement du cache.

3. La surveillance : les pannes silencieuses d'abord

Surveiller que la page d'accueil répond 200 est nécessaire, mais c'est la panne la moins probable à passer inaperçue : vous la verrez vous-même. Les pannes coûteuses sont celles qui ne se voient pas.

Enfin, surveillez depuis l'extérieur ce que voit Google : les erreurs serveur et les 404 dans Search Console sont souvent les premiers signes d'un problème que la surveillance technique ne voit pas. Notre guide sur le rapport d'indexation explique comment les lire.

4. Les journaux : lisibles et bornés

Des journaux utiles doivent répondre à deux exigences contradictoires : être assez complets pour diagnostiquer un incident, et ne jamais remplir le disque. Sous Docker, le pilote de journalisation par défaut n'a pas de limite de taille. Nous plafonnons chaque conteneur :

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "3"

Trente mégaoctets au plus par conteneur : assez pour remonter les dernières heures d'activité, jamais assez pour saturer le disque. À l'inverse, veillez à ce qu'aucune erreur ne soit envoyée vers /dev/null par commodité : un journal vide est pire qu'un journal bavard, car il donne une fausse assurance.

Côté WordPress, WP_DEBUG_DISPLAY doit rester à false en production — un message d'erreur affiché aux visiteurs révèle des chemins de fichiers et parfois des requêtes — mais les erreurs doivent être journalisées quelque part où quelqu'un les lira.

5. Le ménage régulier

La routine, en résumé

FréquenceTâche
Automatique, quotidienneSauvegarde vérifiée, copie distante tirée, sondes de surveillance
Dès publicationCorrectifs de sécurité du cœur et des extensions exposées
MensuelleMises à jour en test puis déploiement, revue des alertes, Search Console
TrimestrielleRevue des comptes et des extensions, ménage disque, test de restauration

Aucune de ces tâches n'est difficile. Ce qui est difficile, c'est de les tenir dans la durée ; d'où l'intérêt de les automatiser partout où c'est possible et de les écrire là où ça ne l'est pas.