Ce blog a-t-il vraiment besoin de WordPress et de Kubernetes ? Une expérience avec Hugo, de vrais chiffres et le coût réel d’une migration
J'ai reconstruit une partie de ce blog avec Hugo et je l'ai comparée à WordPress sur K3s : vitesse, matériel, correctifs, sécurité, Grafana, rôles Ansible et effort de migration. La décision reste ouverte.

🌐 Aussi en: English · Deutsch · Español
Mise à jour du 6 novembre 2026 : c’est désormais décidé et fait : ce blog tourne sur Hugo. Ce qui s’est passé est décrit ici.
En bref : ce blog se compose surtout de texte et d’images, mais il tourne sur Kubernetes avec une base de données, un pool PHP, un cache et dix extensions. J’en ai donc reconstruit une partie sous forme de site statique avec Hugo, puis j’ai comparé les deux. Le résultat m’a surpris dans les deux sens : pour les lecteurs, le gain de vitesse est plus faible que prévu ; pour l’exploitation, le gain est bien plus important. Rien n’est décidé. Ce blog tourne toujours sur WordPress.
Par le passé, je trouvais Hugo trop compliqué, trop laborieux et peu convivial, aussi bien à l’usage que pour migrer depuis WordPress. Avec une assistance IA rapide, tout a changé : la conversion, le thème et les scripts de vérification de ce test ont vu le jour en peu de temps. C’est pour cela que je me repose la question aujourd’hui.
Cet article rassemble tout ce que je veux savoir avant de trancher : des mesures, des estimations clairement signalées, les conséquences sur chaque rôle Ansible, Grafana, SELinux, la question d’un nouveau dépôt, l’effort réel et une liste de contrôle au cas où je me lancerais.
Table des matières
🧒 Pour les non-informaticiens : quelle est la différence ?
WordPress construit une page quand quelqu’un la demande : un programme lit le texte dans une base de données et assemble la page, et un cache conserve le résultat un moment. Hugo construit toutes les pages une seule fois, à l’avance, sur ma propre machine. Le serveur ne fait ensuite que distribuer des fichiers terminés. Aucun programme ne s’exécute pour le visiteur, il n’y a pas de base de données ni de page de connexion à attaquer.
Le prix à payer : il n’y a plus d’éditeur confortable dans le navigateur. Un article devient un fichier texte, et publier signifie construire puis envoyer.
À retenir : WordPress est un programme en marche qui sert des pages. Hugo est un outil qui produit des fichiers. Presque toutes les différences décrites ici en découlent.
🧪 L’expérience : trois articles, toutes les pages, quatre langues
J’ai converti en Markdown les trois derniers articles et toutes les pages statiques en anglais, allemand, français et espagnol, puis j’ai écrit un petit thème avec les mêmes couleurs, les mêmes polices et la même structure. Un article ressemble désormais à ceci sur le disque :
---
title: 'HTTP/3 pour mon blog et Nextcloud'
slug: http-3-pour-mon-blog-et-nextcloud
date: '2026-11-03T19:59:27+01:00'
translationKey: wp3277
categories: [DevSecOps]
image: img/2026_11_no_http3.webp
---
**Mise à jour du 4 novembre 2026 :** HTTP/3 est de nouveau désactivé sur tous mes serveurs.
Pour un lecteur, le site se comporte de la même façon : même menu, drapeaux de langue, bandeau, carrousel, liste d’articles, barre latérale, table des matières et recherche. Les petites différences ne se voient qu’en comparant côte à côte. Le thème est ma propre reconstruction et non une copie du thème WordPress, si bien que quelques pixels diffèrent.
Une ressemblance ne prouve pas grand-chose. Un script a donc comparé chaque page à l’original :
| Vérifié | Résultat |
|---|---|
| Pages comparées à l’original WordPress | 28 sur 28, texte identique |
| Blocs de code, caractère par caractère | 24, aucune différence |
| Tableaux, titres, éléments de liste | 20, 251 et 300, nombres identiques |
| Liens dans le texte des articles | 84, tous corrects |
| Adresses, canonical, hreflang, noindex | Identiques sur les 28 pages |
| Références internes de tout le site généré | 7 740 dans 225 fichiers HTML, 0 cassée |
| Temps de construction | 1,9 s la première fois, puis 0,14 s |
| Taille du thème et des outils | 561 lignes de thème, 217 lignes de Python |
Le test a aussi trouvé les erreurs qui justifient son existence. Hugo remplaçait silencieusement les liens tel: de mes mentions légales par #ZgotmplZ. Les archives mensuelles des autres langues atterrissaient dans le chemin anglais. Ma première version affichait la méta-description au lieu du véritable extrait. Et le logo était inversé. Seul le script de comparaison a repéré la première erreur ; je n’aurais jamais cliqué sur un lien téléphonique.
À retenir : une migration ne vaut que par sa comparaison automatique. Un site qui a l’air correct peut quand même contenir des contenus cassés.
⚡ Vitesse : ce que j’ai mesuré et ce que j’estime seulement
D’abord les mesures. Elles ont été réalisées depuis mon serveur domestique vers le vrai blog, avec 14 requêtes par ligne, en mesurant le temps jusqu’au premier octet. Un fichier statique sur le serveur réel représente ce que livrerait un site Hugo.
| Requête | Médiane | Plage |
|---|---|---|
| Fichier statique | 57 ms | 50–59 ms |
| Page d’accueil depuis le cache de pages WordPress | 58 ms | 55–62 ms |
| Article depuis le cache de pages WordPress | 60 ms | 56–63 ms |
| Même article, généré par PHP (cache contourné) | 146 ms | 134–163 ms |
Voilà la surprise : une page WordPress en cache est aussi rapide qu’un fichier statique. Le cache fait déjà son travail. La différence n’apparaît que lorsqu’il n’est pas utilisé.
Le gain est plus net sur le volume que le navigateur doit télécharger, sans compter les images et les polices :
| Page d’accueil, compressée | WordPress | Hugo | Variation |
|---|---|---|---|
| HTML | 19,4 Ko | 4,9 Ko | −75 % |
| CSS | 8 fichiers, 67,7 Ko | 1 fichier, 3,6 Ko | −95 % |
| JavaScript | 16 fichiers, 111,1 Ko | 1 fichier, 1,0 Ko | −99 % |
| Total | 25 fichiers, 198 Ko | 3 fichiers, 9,5 Ko | −95 % |
Passons aux estimations. Ce sont mes attentes, pas des mesures. Je n’ai pas encore réalisé de véritable test dans un navigateur et en conditions réalistes.
| Situation | Gain attendu | Base |
|---|---|---|
| Page déjà dans le cache WordPress | Environ 0 % | Mesuré : 57 contre 58 ms |
| Page absente du cache | Environ 60 % d’attente en moins, soit 2,5 fois plus rapide | Mesuré : 146 contre 57 ms |
| Première visite sur téléphone avec une connexion moyenne | Environ 20–40 % plus rapide jusqu’à ce que la page soit utilisable | Estimation à partir de 95 % de CSS et JavaScript en moins |
| Pages suivantes de la même visite | Faible | Les fichiers sont déjà dans le cache du navigateur |
| Pic de trafic | Nettement plus robuste | Ni limite de workers ni base de données sur le chemin |
À retenir : la vitesse seule ne justifierait pas une migration. Un WordPress bien mis en cache est déjà rapide. Le lecteur gagne surtout parce qu’il télécharge moins de code, en particulier sur téléphone.
🖥️ Matériel : ce dont le serveur aurait vraiment besoin
Voici les valeurs actuelles du serveur du blog et mon estimation pour un site statique. Grafana et toute la supervision restent dans les deux cas, car je veux les conserver.
| Valeur | WordPress sur K3s (mesuré) | Hugo (estimation) |
|---|---|---|
| Processeur | 4 cœurs, charge d’environ 0,2 | 1–2 cœurs |
| Mémoire utilisée | 2,7 Go sur 7,5 Go | Environ 1,0–1,2 Go |
| Taille de serveur raisonnable | 4 Go ou plus | 2 Go |
| Données Kubernetes sur le disque | 7,1 Go | 0 |
| Site sur le disque | 375 Mo d’application et de médias | Moins de 500 Mo pour tous les articles |
| Pods actifs / images de conteneurs | 17 / 14 | 0 / 0 |
| Tâche de fond toutes les quelques minutes | wp-cron | Aucune |
| Règles de pare-feu (sortie de nftables) | 7 760 lignes, surtout de K3s | Quelques centaines de lignes |
Voici où va la mémoire aujourd’hui, par processus. Ces valeurs se recoupent, leur somme dépasse donc la consommation réelle :
| Composant | Mémoire | Avec Hugo |
|---|---|---|
| k3s-server | 847 Mo | Disparaît |
| containerd et ses shims | 383 Mo | Disparaît |
| php-fpm | 349 Mo | Disparaît |
| MariaDB | 249 Mo | Disparaît |
| Ingress (nginx et contrôleur) | 316 Mo | Remplacé par un petit nginx |
| Grafana | 357 Mo | Reste |
| Alloy | 273 Mo | Reste |
| Loki | 179 Mo | Reste |
| Prometheus | 175 Mo | Reste |
À retenir : le site lui-même ne demanderait presque rien. Avec environ 1 Go, la supervision deviendrait le plus gros poste du serveur et en fixerait la taille minimale.
📅 Travail quotidien et correctifs
Depuis le 1er septembre, ce dépôt a reçu 256 commits, dont 76 touchaient les trois grands rôles du blog. Tout n’est pas de la maintenance, car une bonne partie relevait de la construction. Cela montre néanmoins où va l’attention. La journée de mise à jour et les deux failles PHP en un jour illustrent bien ce que cela signifie en pratique.
| Tâche | WordPress sur K3s | Hugo |
|---|---|---|
| Mises à jour du système | Oui | Oui |
| K3s, Helm, ingress, cert-manager | Oui | Disparaît |
| WordPress, 10 extensions, thème | Oui, automatique avec contrôles | Disparaît |
| PHP, y compris correctifs d’urgence | Oui | Disparaît du serveur |
| MariaDB et Redis | Oui | Disparaît |
| Versions figées pour le blog | 9 entrées sur 30, plus la pile K3s commune | nginx du système, Hugo sur ma machine |
| Analyse nocturne des images et ses résultats | Oui, voir Trivy | Disparaît ; les paquets système restent |
| Alertes sur workers, pods, base de données | Oui | Disparaît |
| Vider les caches après un changement | Cache de pages, d’objets et d’optimisation | Disparaît |
| Lire les courriels de supervision et de sécurité | Oui | Oui, pour bien moins de raisons |
| Écrire un article | Éditeur dans le navigateur | Fichier texte, Git, construction, envoi |
| Si une mise à jour casse quelque chose | Le site réel peut tomber | La construction échoue, le site reste tel quel |
| Retour arrière | Dump de base et restauration de fichiers | Renvoyer la construction précédente |
Les Nextcloud restent sur K3s, ma journée de mise à jour ne disparaît donc pas. Elle raccourcit seulement.
À retenir : c’est là le vrai gain. Des catégories entières de mises à jour, d’urgences et d’alertes disparaissent, car le logiciel n’existe plus sur le serveur.
🔐 Sécurité : une évaluation honnête
Cette évaluation est mon jugement, pas une mesure. « Élevé » signifie ici un risque élevé.
| Menace | WordPress sur K3s | Hugo | Pourquoi |
|---|---|---|---|
| Faille d’une extension ou du cœur | Moyen à élevé | Aucun | Aucun code ne s’exécute sur le serveur |
| Exécution de code à distance en PHP | Moyen | Aucun | Pas de PHP |
| Injection SQL | Faible à moyen | Aucun | Pas de base de données |
| Connexion admin volée | Faible, grâce à la 2FA et au filtre géographique | Aucun | Il n’y a pas de connexion web |
| Perte de données après une intrusion | Moyen | Faible | Pas de données d’utilisateurs ; une reconstruction propre suffit |
| Faille de nginx | Moyen | Moyen | Demeure |
| Noyau ou système d’exploitation | Moyen | Moyen | Demeure |
| SSH ou clé de déploiement | Faible | Faible à moyen | La clé de déploiement devient le secret précieux |
| Chaîne de construction (Hugo, thème, ma machine) | Non concerné | Faible à moyen | Nouveau : une construction empoisonnée serait publiée |
| Connexion à Grafana | Faible à moyen | Faible à moyen | Demeure et devient la principale cible web |
| Kubernetes comme surface d’attaque | Faible à moyen | Aucun | Pas de serveur d’API |
Deux points inconfortables. D’abord, « statique » ne veut pas dire « sûr » : le serveur, SSH, nginx et le DNS demandent le même soin, et mes neuf couches de défense ne deviennent pas inutiles. Ensuite, avec Grafana, l’hôte n’est justement pas purement statique. Une connexion y subsiste, et c’est elle qui mérite le plus d’attention.
À retenir : la surface d’attaque diminue fortement, car plusieurs catégories d’attaques n’ont plus rien à viser. Les risques restants se déplacent vers la clé de déploiement et Grafana.
🧱 Ai-je encore besoin de K3s sur le serveur du blog ?
Techniquement, non. L’article approfondi sur K3s et l’article sur WordPress sur Kubernetes expliquent pourquoi je l’avais choisi. Un simple nginx avec un dossier de fichiers n’a pas besoin d’orchestrateur. Mais K3s a des avantages que je perdrais réellement :
| Aspect | Avec K3s | Sans K3s |
|---|---|---|
| Mémoire et disque | ➖ Environ 1,2 Go de RAM et 7,1 Go de disque | ➕ Rien |
| Pièces mobiles | ➖ Serveur d’API, kubelet, containerd, CNI, ingress, cert-manager | ➕ Un service |
| Pare-feu | ➖ K3s ajoute des milliers de lignes ; prudence à chaque changement | ➕ Seulement mes règles |
| Mises à jour | ➖ K3s, charts et images | ➕ Paquets système |
| Haute disponibilité | ➖ Aucune de toute façon sur un seul nœud | ➖ Aucune non plus |
| Isolation entre les composants | ➕ Pods, NetworkPolicies | ➖ Guère nécessaire avec un service |
| Mises à jour sans interruption | ➕ Mises à jour progressives intégrées | ➕ Remplacées par une bascule atomique de dossier |
| Mêmes outils que sur les Nextcloud | ➕ Une seule façon de travailler | ➖ Deux façons de travailler |
| Banc d’essai pour les Nextcloud | ➕ Petit hôte qui reçoit K3s en premier | ➖ Perdu ; une VM de test devrait le remplacer |
| Valeur d’apprentissage et matière pour le blog | ➕ Élevée | ➖ Plus faible sur cet hôte |
Les Nextcloud sont un autre cas : PHP, Collabora, push et tâches cron y forment vraiment plusieurs services qui coopèrent.
À retenir : pour le blog, K3s ne se justifie plus par une nécessité technique, mais par l’uniformité, les tests et l’apprentissage. Ce sont des raisons légitimes, à condition de les nommer honnêtement.
📝 Ce qui justifie encore WordPress
Il serait facile d’enterrer WordPress ici. Ce serait une erreur, car il résout de vrais problèmes que Hugo ne résout pas :
| Atout de WordPress | Avec Hugo |
|---|---|
| Éditeur dans le navigateur, utilisable par tous | Éditeur de texte et Git, ou un outil CMS supplémentaire |
| Écrire et publier depuis un téléphone | Peu pratique sans outils supplémentaires |
| Médiathèque avec envoi et recherche | Des fichiers dans un dossier |
| Plusieurs auteurs avec des rôles | Seulement via Git ou un outil supplémentaire |
| Commentaires et formulaires | Service externe nécessaire |
| Publication programmée | Seulement avec une construction planifiée |
| Des extensions pour presque tout | À construire soi-même |
| Analyse SEO pendant l’écriture (Yoast) | Balises méta oui, analyse en direct non |
| Transmission à une personne non technique | Presque impossible |
| Boutique, membres, contenu dynamique | Pas le bon outil |
Voici ce que deviendraient les extensions actuelles :
| Extension | Avec Hugo |
|---|---|
| Polylang | Intégré à Hugo |
| Yoast SEO | Mes propres modèles : titres, méta, Open Graph, schema, sitemap. Schema plus simple, pas d’analyse dans l’éditeur |
| Easy Table of Contents | Intégré à Hugo |
| Autoptimize | Intégré à Hugo (minify) |
| CompressX | Traitement d’image de Hugo à la construction |
| WP Super Cache, Redis Cache | Inutiles |
| Two Factor, Limit Login Attempts | Inutiles sans connexion |
| Classic Editor | Sans objet |
Il y a aussi un aspect personnel. La plupart de mes derniers articles sont rédigés avec l’aide de l’IA, et l’éditeur confortable compte donc moins pour moi que pour la plupart des blogueurs. Avec un fichier Markdown et un commit Git, le travail avec un assistant IA serait même plus simple qu’aujourd’hui. Je n’en deviendrais pas dépendant pour autant : le Markdown se modifie avec n’importe quel éditeur de texte.
À retenir : WordPress reste le bon choix quand d’autres personnes écrivent, quand on publie en déplacement ou quand le site fait plus qu’afficher du contenu. Il n’est le mauvais outil que si rien de tout cela ne s’applique.
📈 Combien de sites WordPress, combien de sites Hugo ?
Sur le marché, Hugo est une petite niche. Selon W3Techs, au 5 novembre 2026 :
| Indicateur | WordPress | Hugo |
|---|---|---|
| Part de tous les sites web | 39,5 % | 0,1 % |
| Part des sites au CMS connu | 58,2 % | 0,2 % |
| Rapport sur l’ensemble des sites | Environ 400 : 1 | 1 |
| Étoiles sur GitHub | 21 519 (un miroir ; le développement se fait ailleurs) | 90 379 |
| Licence | GPL | Apache 2.0 |
Ces chiffres sont à lire avec prudence. W3Techs donne des parts et non des nombres absolus, et ne reconnaît pas toujours les sites statiques : Hugo est donc probablement sous-estimé. Les étoiles mesurent l’intérêt des développeurs et non les sites en service, et le dépôt WordPress n’est qu’un miroir. Il ne faut pas comparer directement ces deux valeurs.
Les chiffres montrent tout de même quelque chose : des millions de personnes utilisent WordPress sans avoir jamais vu un dépôt Git, alors que Hugo a une communauté étonnamment grande au regard de sa part de marché. Mon impression, sans données solides : ce sont surtout les passionnés qui prennent ce chemin, et pour des raisons qui correspondent à cet article : pas de PHP, pas de base de données, pas de connexion, peu de surface d’attaque, Markdown et Git plutôt qu’une interface web. Un site rapide est un bonus appréciable. Pour beaucoup, je suppose que c’est aussi le plaisir d’une installation que l’on comprend entièrement.
À retenir : WordPress est la valeur sûre avec le plus grand écosystème, Hugo une niche choisie délibérément. Être minoritaire n’est un argument dans aucun sens.
🛡️ SELinux deviendrait-il plus simple ?
Oui, nettement pour la partie web, mais il ne disparaît pas. L’article approfondi sur SELinux montre tout le travail que cela représente.
| Sujet | WordPress sur K3s | Hugo sur AlmaLinux |
|---|---|---|
| Paquet de règles pour conteneurs | k3s-selinux, pas encore stable pour AlmaLinux 10 | Inutile |
| Domaines de la partie web | Conteneurs avec leurs catégories | nginx dans le domaine éprouvé httpd_t |
| Fichiers | Volumes et étiquettes de conteneurs | Un dossier en httpd_sys_content_t |
| Réétiquetage après un téléchargement de K3s | Obligatoire | Sans objet |
| Proxy vers Grafana | Via l’ingress dans un pod | Un booléen ou un port étiqueté |
Mes domaines de supervision (homelab_*) | Restent | Restent |
| Refus masqués par dontaudit | À vérifier | À vérifier |
| Effort de migration | — | Nouvelle phase d’apprentissage pour nginx sur l’hôte |
Sur FreeBSD, la question change totalement, car SELinux n’y existe pas. Les jails et le framework MAC prennent sa place.
À retenir : la partie la plus difficile de SELinux, les conteneurs et leur paquet, disparaît. Le mode enforcing reste, tout comme le devoir de vérifier le domaine réel de chaque service.
📊 Grafana reste. Qu’est-ce que cela implique ?
Grafana fonctionne aujourd’hui comme un service système normal, mais il est accessible via l’ingress de K3s. C’est la dépendance la plus importante :
| Composant | Aujourd’hui | Avec Hugo | Effort |
|---|---|---|---|
| Service Grafana | Service système | Inchangé | Aucun |
| Accès via /grafana/ | Ingress K3s | Proxy inverse dans le nginx de l’hôte, avec WebSocket | Faible |
| Filtre géographique de la connexion | Dans l’ingress | À déplacer dans le nginx de l’hôte | Faible |
| fail2ban pour la connexion Grafana | Lit les journaux des pods | Lit le journal nginx, nouveau chemin et filtre | Faible |
| Prometheus | Node, kubelet, kube-state, MariaDB, PHP-FPM | Node et un exportateur nginx | Faible |
| Alloy et Loki | Lisent /var/log/pods | Lisent /var/log/nginx et le journal | Moyen |
| Tableau de bord des conteneurs | Présent | Plus sur cet hôte | Retirer |
| Tableaux de bord PHP-FPM, MariaDB, Redis | Présents | Plus sur cet hôte | Retirer |
| Alertes sur workers, pods, base de données | Actives | À retirer, sinon elles signalent NoData | Moyen |
| Nouveau : requêtes et erreurs nginx | Via l’ingress | Via l’exportateur nginx et les journaux | Moyen |
| Nouveau : dernier déploiement réussi | — | Métrique d’horodatage avec alerte | Faible |
| Expiration des certificats TLS | Contrôle Monit sur l’ingress | Contrôle Monit sur l’hôte | Faible |
| Mémoire | Environ 1 Go | Environ 1 Go | Détermine la taille du serveur |
Une ancienne leçon s’applique ici directement : si je retire des métriques et oublie une règle, elle peut ne plus rien signaler et rester verte à jamais. Après une migration, je vérifierais donc l’état de chaque règle, et non l’absence de courriels.
Une autre solution serait un Grafana central à la maison, qui collecterait les données de tous les serveurs. Cela retirerait la dernière connexion de l’hôte du blog, mais c’est une décision à part, avec ses propres risques.
À retenir : garder Grafana n’est pas un obstacle. Cela signifie toutefois qu’un proxy inverse, le filtre géographique et une connexion restent sur l’hôte, et que la supervision doit être réorientée des pods vers nginx.
🎭 Les rôles Ansible, un par un
Ma première hypothèse était qu’il ne resterait presque aucun rôle. Elle était fausse. La plupart des rôles protègent l’hôte et non WordPress, ils restent donc en majorité. Voici les 29 rôles de blog.yml, avec le nombre de lignes qui concernent Kubernetes :
| Rôle | Lignes | Lignes K8s | Avec Hugo |
|---|---|---|---|
| blog_k3s_deploy | 2 962 | 69 | ❌ Supprimé |
| blog_wordpress | 1 473 | 45 | ❌ Supprimé |
| common_k3s | 1 139 | 186 | ❌ Pas sur cet hôte (Nextcloud le garde) |
| common_kube_metrics | 214 | 5 | ❌ Pas sur cet hôte |
| common_trivy | 406 | 14 | ❌ Pas sur cet hôte (pas d’images) |
| blog_packages | 222 | 0 | 🔄 À réécrire : nginx, client ACME, rsync |
| blog_verify | 478 | 13 | 🔄 À réécrire : site, certificats, liens, déploiement |
| blog_visitor_stats | 237 | 3 | 🔄 Nouveau chemin de journal, même idée |
| common_version_check | 340 | 49 | 🔄 Nouvelle branche pour le blog |
| common_version_active | 223 | 17 | 🔄 Nouvelle branche pour le blog |
| common_fail2ban | 487 | 42 | 🔧 Nouveaux chemins, jail WordPress supprimée |
| common_firewall | 1 179 | 18 | 🔧 Plus simple : ni tables K3s ni NodePorts |
| common_monit | 702 | 12 | 🔧 Pas de contrôle des pods ; contrôles nginx et déploiement |
| common_grafana | 1 552 | 0 | 🔧 Moins de tableaux de bord et d’alertes |
| common_loki | 843 | 7 | 🔧 Fichiers journaux au lieu des journaux de pods |
| common_prometheus | 451 | 1 | 🔧 Autres cibles |
| common_selinux | 220 | 6 | 🔧 Pas de k3s-selinux ; règles nginx |
| common_selinux_monitoring | 399 | 0 | 🔧 Moins de domaines |
| common_clamav | 261 | 0 | 🔧 Sans doute désactivé : pas d’envois sur le serveur |
| common_cis_hardening | 571 | 8 | 🔧 Retirer les exceptions K3s |
| common_auditd | 252 | 4 | 🔧 Retirer les chemins K3s |
| common_sysctl | 313 | 2 | 🔧 Retirer les réglages K3s |
| common_aide_refresh | 101 | 1 | 🔧 Dossier web exclu volontairement |
| common_dnf_automatic | 225 | 1 | 🔧 Petit ajustement |
| common_ssh | 650 | 0 | ✅ Inchangé |
| common_msmtp | 138 | 0 | ✅ Inchangé |
| common_rkhunter | 187 | 0 | ✅ Inchangé |
| common_logrotate | 115 | 0 | ✅ Inchangé, nginx en plus |
| common_node_exporter | 273 | 1 | ✅ Inchangé |
| Résultat | Rôles |
|---|---|
| ❌ Retiré de cet hôte | 5 |
| 🔄 À réécrire | 5 |
| 🔧 À ajuster | 14 |
| ✅ Inchangé | 5 |
En lignes, environ 6 200 des quelque 16 600 lignes que le blog parcourt aujourd’hui n’y serviraient plus, soit 37 %. Seules 4 400 environ quitteraient vraiment le dépôt, car les Nextcloud ont besoin du reste. La visite Ansible consacrée au blog deviendrait un document historique.
Bien sûr, certaines choses seraient à créer :
| Nouveau | Rôle | Ampleur |
|---|---|---|
| Rôle pour le site statique | nginx sur l’hôte, en-têtes de sécurité, redirections, proxy Grafana | Moyenne |
| Certificats | Client ACME avec renouvellement et rechargement de nginx, à la place de cert-manager | Faible |
| Déploiement | Utilisateur restreint, rsync, nouveau dossier par version, bascule atomique, dernières versions conservées | Faible à moyenne |
| Exportateur nginx | Requêtes et erreurs pour Prometheus | Faible |
| Chaîne de construction | Version de Hugo figée, construction, comparaison, index de recherche, envoi | Moyenne |
| Vérification | Contrôle des liens et comparaison du contenu à chaque construction | Existe depuis l’expérience |
| Table de redirections | Anciennes adresses comme le flux et les chemins de médias | Faible |
| Sauvegarde | Simplifiée : contenu dans Git, plus configuration du serveur et journaux | Faible |
À retenir : les rôles coûteux disparaissent, le socle de sécurité reste. C’est une bonne nouvelle : le durcissement construit pendant des mois est conservé.
📦 Un nouveau dépôt ?
Mon dépôt contient actuellement les deux piles. Les rôles communs décident d’après la variable stack, et ma règle est que chaque changement doit fonctionner pour les deux. Passer à Hugo pose la question du découpage :
| Option | Avantage | Inconvénient |
|---|---|---|
| A : tout dans le dépôt actuel | Un seul endroit, un seul historique | Chaque article et image arrive dans l’historique Ansible et passe par son lint ; le dépôt grossit avec les médias |
| B : nouveau dépôt pour contenu, thème et construction. Ansible reste | Séparation nette ; aucun changement aux rôles communs ; CI propre et simple | Deux dépôts ; le déploiement doit les relier |
| C : séparation complète, rôles communs en collection | Propre pour plusieurs utilisateurs | Versions et publications pour deux utilisateurs seulement ; effort élevé |
| D : dépôt Ansible séparé pour le blog avec rôles copiés | Totalement indépendant | Chaque correctif de sécurité en double ; les copies divergent |
Je choisirais l’option B. Articles, images, thème et scripts de construction iraient dans un nouveau dépôt. Le serveur reste dans le dépôt Ansible avec une troisième valeur, stack: static. Les rôles restent au même endroit et le durcissement n’a pas à être maintenu deux fois. Pour publier, une clé de déploiement restreinte suffit, sans accès au code Ansible ni à son coffre-fort.
Le prix est réel cependant : la règle « fonctionne pour les deux piles » deviendrait « fonctionne pour les trois ». En contrepartie, les branches WordPress disparaissent de nombreux rôles.
À retenir : le contenu et l’infrastructure n’évoluent pas au même rythme et ne portent pas les mêmes secrets : ils doivent être dans des dépôts séparés. Le durcissement commun, lui, ne doit pas être copié.
🐡 Et sur FreeBSD ?
Je suis enthousiasmé par FreeBSD depuis des années, même s’il mène une existence de niche à côté de Linux. C’est un système complet et cohérent, très bien documenté, avec les jails, ZFS et pf. Il n’a pourtant jamais eu sa chance pour ce blog, car K3s dépend de fonctions du noyau Linux et n’y tourne pas de façon adaptée à la production.
C’est exactement ce que Hugo change. Sans K3s, conteneurs, PHP ni base de données, les besoins se réduisent à nginx, un client ACME, rsync et la supervision, qui sont tous des logiciels ordinaires sur FreeBSD. La complexité qui me liait à Linux a disparu. Voici les trois variantes comparées :
| Sujet | WordPress sur K3s | Hugo sur AlmaLinux | Hugo sur FreeBSD |
|---|---|---|---|
| RAM avec supervision complète (estimation) | 2,7 Go | Environ 1,0–1,2 Go | Environ 1,0–1,2 Go |
| Correctifs | ➖ Nombreuses couches | ➕ Système et nginx | ➕ freebsd-update et pkg |
| Mises à jour automatiques | ➕ Existent | ➕ Existent | ➖ À construire |
| Isolation des services | ➕ SELinux et pods | ➕ SELinux et bac à sable systemd | ➖ Jails, plus grossières mais simples |
| Pare-feu et bannissements | ➕ Existent | ➕ Existent, plus simples | ➖ pf et fail2ban à refaire |
| Rôles réutilisables | Tous | 24 sur 29, en partie ajustés | Peu ; l’essentiel serait nouveau |
| Grafana, Prometheus, Loki | ➕ Existent | ➕ Existent, ajustés | ➖ Paquets disponibles ; chemins et règles à refaire |
| Instantanés avant mise à jour | ➖ Aucun | ➖ Aucun par défaut | ➕ ZFS |
| Exploitation à côté des Nextcloud | ➕ Identique | ➕ Même système | ➖ Deuxième plateforme |
| Connaissances existantes | ➕ Grandes | ➕ Grandes | ➖ À acquérir |
| Intérêt comme sujet de blog | Déjà écrit | Moyen | ➕ Élevé |
La question décisive est de savoir si cette installation pourrait être aussi bien sécurisée que l’actuelle. Je l’ai évaluée couche par couche. C’est une évaluation théorique : je ne l’ai ni construite ni testée sur FreeBSD.
| Couche | Aujourd’hui sur AlmaLinux | Hugo sur FreeBSD | Évaluation |
|---|---|---|---|
| Filtre de paquets | nftables | pf avec des tables | 🟢 Équivalent |
| Durcissement SSH, filtre géographique | sshd et ensembles nftables | sshd et tables pf | 🟢 Équivalent |
| Bannir les attaquants | fail2ban | fail2ban avec pf | 🟢 Équivalent, nouvelles règles nécessaires |
| Isoler nginx | SELinux et bac à sable systemd | Jail, contenu monté en lecture seule | 🟢 Bon ; simple et facile à vérifier |
| Isoler la supervision | Mes domaines SELinux | Une jail par service | 🟡 Plus grossier, mais frontières claires |
| Règles fines par processus | Type enforcement SELinux | Pas d’équivalent direct ; framework MAC, Capsicum seulement si le logiciel le prend en charge | 🔴 Plus faible |
| Surface d’attaque du serveur web | Avec WordPress : grande | Fichiers statiques | 🟢 Bien plus petite qu’aujourd’hui |
| Informations sur les failles | dnf, Trivy | pkg audit et freebsd-update | 🟢 Bon |
| Journal d’audit | auditd | OpenBSM | 🟡 Équivalent en principe ; exploitation à refaire |
| Intégrité des fichiers, rootkits | AIDE, rkhunter | AIDE, rkhunter, freebsd-update IDS | 🟢 Équivalent |
| Retour arrière après mise à jour | Paquets, restauration | Instantanés ZFS et boot environments | 🟢 Meilleur |
| Base de durcissement | Référentiel CIS appliqué dans mon rôle | À refaire à la main | 🟡 Effort ; moins de matériel prêt à l’emploi |
| Grafana | Derrière filtre géographique et fail2ban | Pareil, dans sa propre jail | 🟡 Reste la principale cible |
| Expérience d’incidents réels | Des mois de constats réels | Part de zéro | 🔴 Plus faible au début |
Mon évaluation : oui, pour un site statique, FreeBSD pourrait être globalement sécurisé à un niveau comparable, mais par d’autres moyens. Ce que je perdrais vraiment, c’est le contrôle fin de SELinux par processus. Pour un WordPress avec PHP et des extensions, ce serait pénalisant. Pour un nginx qui livre des fichiers en lecture seule depuis une jail, cela pèse bien moins, puisqu’un attaquant peut tout simplement y faire beaucoup moins. En échange, les jails sont assez simples pour être vérifiées à l’œil. Les deux vrais points faibles sont Grafana, qui exige toujours une connexion, et mon manque de pratique : mon installation AlmaLinux a traversé des mois de vraies erreurs, pas une installation FreeBSD.
Un point reste ouvert : à ma connaissance, les paquets de Grafana, Prometheus, Loki et node_exporter existent dans les ports FreeBSD, mais je devrais d’abord vérifier Alloy et les versions actuelles. Sinon, il faudrait un autre collecteur de journaux.
À retenir : le grand gain vient de Hugo, pas du système d’exploitation. Mais c’est Hugo qui rend FreeBSD possible : une fois K3s parti, le choix n’est plus technique. Ce serait un choix de conviction, et pour un site statique, un choix défendable.
💶 Coûts et bénéfices
| Point | Coût | Bénéfice |
|---|---|---|
| Migration | Ponctuel, voir plus bas | — |
| Serveur | — | Serveur plus petit et moins cher possible |
| Maintenance | Nouvelle chaîne de construction à entretenir | Beaucoup moins de correctifs et d’alertes |
| Sécurité | Protéger la clé de déploiement et la construction | Plusieurs catégories d’attaques éliminées |
| Vitesse | — | Moins à télécharger ; mieux lors des pics et hors cache |
| Écriture | Pas d’éditeur, pas de travail depuis le téléphone | Historique Git, fichiers simples, facile avec l’IA |
| Sauvegardes | — | Bien plus simples |
| Portabilité | — | Le Markdown fonctionne partout ; pas de dépendance à une base |
| Savoir-faire | Banc d’essai K3s perdu | Moins de cas particuliers en tête |
| SEO | Risque pendant le déménagement ; plus d’analyse Yoast | Pages rapides et contrôle total |
| Matière pour le blog | Moins d’histoires d’exploitation sur cet hôte | Une belle histoire de migration |
Je ne peux pas donner ici de prix de serveur utile, car cela dépend de l’hébergeur. L’économie reste de toute façon modeste. La vraie monnaie ici, c’est l’attention.
À retenir : cette migration ne se paie pas en argent et ne rapporte pas d’argent non plus. C’est un échange : le confort d’écriture contre beaucoup moins de travail d’exploitation.
⏱️ Quelle quantité de travail ?
Le blog compte 143 articles dans chacune des quatre langues, soit 572 au total, plus 16 pages statiques et environ 1 400 fichiers médias. Les valeurs suivantes sont des estimations. L’expérience a pris environ une soirée avec l’aide de l’IA, ce qui laisse penser que la conversion est la plus petite partie.
| Phase | Avec l’aide de l’IA | Remarque |
|---|---|---|
| Inventaire : extensions, blocs spéciaux, téléchargements | 2–3 h | L’outil d’export existe |
| Convertir tous les articles et médias | 3–6 h | Le script existe ; les anciens articles réservent des surprises |
| Finir le thème : pagination, étiquettes, archives, téléphone | 3–5 h | La base existe |
| SEO : adresses, redirections, flux, schema, sitemap | 2–3 h | Comparaison automatique avec le sitemap actuel |
| Ansible : nouveau rôle, 14 ajustés, 5 réécrits, VM de test | 8–15 h | La plus grande partie |
| Supervision et Grafana | 3–5 h | Vérifier chaque règle |
| Sauvegarde, test de restauration, documentation en trois langues, politique de confidentialité | 3–5 h | À faire avec soin |
| Bascule et surveillance active | 2–3 h | Puis deux semaines d’observation |
| Total, Hugo sur AlmaLinux | Environ 26–45 h | En pratique sur 2–3 semaines |
| En plus pour FreeBSD | Environ 15–30 h | Peu de rôles réutilisables |
| Sans l’aide de l’IA (estimation grossière) | 3–5 semaines de travail | Surtout le thème, la conversion et les trois langues |
Les exécutions réelles en production, la relecture de chaque diff et les décisions restent de mon ressort. L’IA accélère la saisie, mais elle ne dispense pas de vérifier.
À retenir : l’essentiel du travail n’est pas dans la conversion, mais dans Ansible, la supervision et la vérification. C’est là qu’il faut prévoir du temps.
✅ Ce que je devrais faire si je choisis Hugo
- Clarifier le besoin : puis-je me passer de l’éditeur dans le navigateur et du travail sur téléphone ? Sans cette réponse, le reste n’a pas d’importance.
- Choisir la plateforme : AlmaLinux par défaut, FreeBSD seulement par choix délibéré.
- Tout sauvegarder : base de données, fichiers et médias. Garder WordPress disponible plusieurs semaines.
- Créer le dépôt de contenu avec articles, médias, thème et version de Hugo figée. Rechercher les secrets avant le premier push.
- Tout convertir et comparer chaque page automatiquement : texte, blocs de code avec leurs barres obliques inverses, tableaux, liens, textes alternatifs, titres et descriptions.
- Conserver chaque adresse : articles, langues, catégories, étiquettes et aussi
/wp-content/uploads/, car des images sont liées depuis l’extérieur. Comparer avec le sitemap actuel. - Mettre en place les redirections : sans configuration, le flux RSS passe de
/feed/à/index.xml. Vérifier aussi les liens?p=et l’ancienne adresse de recherche. - Réécrire la politique de confidentialité et vérifier les mentions légales. Le texte actuel décrit WordPress et ses extensions. Vérifier aussi la notice sur l’IA et les licences de tous les téléchargements.
- Finir le thème et le SEO, y compris des images Open Graph sous la limite de WhatsApp et
noindexpour les pages légales. - Construire la partie Ansible sur une VM de test :
stack: static, le nouveau rôle, les rôles ajustés. Lancer deux fois ; la seconde exécution doit afficherchanged=0. - Vraiment vérifier SELinux : domaines avec
ps -eZ, refus masqués avecsemodule -DBet journal propre à chaque service. - Refaire la supervision : Grafana derrière nginx avec filtre géographique et fail2ban, nouvel exportateur, anciennes règles retirées, puis contrôle de l’état de chaque règle.
- Protéger le chemin de déploiement : clé restreinte, bascule atomique, dernières versions conservées et alerte en cas d’échec.
- Tester une restauration : construire un serveur propre à partir des seuls dépôts, avant de toucher à la production.
- Adapter tout ce qui gravite autour : scripts de sauvegarde, surveillance externe, contrôle des mises à jour et de la dérive, guides d’exploitation en trois langues, note sur les anciens articles approfondis.
- Planifier la bascule : baisser le TTL DNS, choisir un moment calme, garder le retour arrière prêt, puis contrôler les moteurs de recherche et les 404 dans les journaux.
- Observer pendant deux semaines, et seulement ensuite retirer WordPress et K3s de l’hôte.
À retenir : la plupart de ces points ne concernent pas du tout Hugo. Ils visent à ne perdre aucune adresse, à rester correct juridiquement, à conserver la supervision et à garder un chemin de retour.
🌐 HTTP/3 serait-il plus simple ?
En partie. Comme je l’ai décrit dans l’article sur HTTP/3, je l’ai désactivé parce que des connexions restaient bloquées après un rechargement. Avec nginx directement sur l’hôte, la mise en place serait plus simple, car le détour par l’ingress disparaît. La cause demeure pourtant : les anciens workers gardent les sockets UDP. C’est une question de nginx et non de K3s, et c’est pourquoi j’ai ouvert l’issue #1937. Moins de connexions longues et des rechargements rares atténueraient le problème. Je ne l’ai pas testé. Sur un site statique, le bénéfice serait de toute façon faible, je le laisserais donc désactivé pour l’instant.
À retenir : une mise en place plus simple ne corrige pas un défaut dans la couche inférieure.
🎯 Les leçons
- Mesurer avant de croire. J’attendais un grand gain de vitesse. Un WordPress en cache répondait en 58 ms, un fichier statique en 57 ms.
- L’essentiel du bénéfice est dans l’exploitation. Un logiciel qui n’existe plus n’a besoin ni de correctif, ni d’alerte, ni d’urgence.
- Le durcissement survit. Mon idée qu’il resterait peu de rôles était fausse : 24 sur 29 restent au moins en partie, car ils protègent l’hôte.
- « Statique » ne veut pas dire « simple ». Grafana, le déploiement et la chaîne de construction restent, et le risque se déplace vers la clé de déploiement.
- Une migration exige un outil de comparaison. Sans lui, je n’aurais pas vu les liens téléphoniques cassés de mes mentions légales.
🤔 Où j’en suis
Je n’ai pas tranché. Pour ce blog, K3s et WordPress ne sont plus techniquement nécessaires, c’est clair. Tout aussi clair : ils me coûtent de l’attention, pas de l’expérience aux lecteurs. De l’autre côté, il y a l’éditeur, le banc d’essai K3s pour les Nextcloud et une installation qui fonctionne et que je connais très bien.
Si je me lance, ce sera avec Hugo et un dépôt de contenu séparé, et la supervision reste. AlmaLinux est le choix raisonnable, car presque tout est conservé. FreeBSD est le choix qui m’enthousiasme, et pour la première fois, il serait réaliste sur ce blog. Et si je le fais, il y aura une deuxième partie avec les vrais chiffres, y compris tout ce que ces estimations ont mal prévu.
