Refonte du site avec Pelican

Publié le 25/08/2021, dans informatique, web
J'ai récemment entièrement refait ce site web en version statique en utilisant Pelican. J'en avais marre de continuer d'utiliser du PHP et une base de données alors qu'en soi ce site n'en a pas besoin. Je vais expliquer ici le chemin qui a mené à cette nouvelle version du site.
Pour remettre un peu de contexte, j'ai créé ce site en 2013, alors au lycée je voulais apprendre à faire un site web avec du PHP et une base de données. Donc je l'ai fait pour mon blog bien que celui-ci n'en ai pas besoin. J'ai toujours aimé les principes simple et efficace propre à UNIX et à l'approche KISS de l'informatique, aujourd'hui j'ai donc décidé de refaire mon site web sans PHP ni aucun autre langage côté serveur, ni base de donnée et toujours sans javascript.
J'aurai pu faire le site à la main en écrivant les fichiers HTML un par un mais ce n'est pas le plus efficace et pratique. Le HTML est simple à écrire mais quand j'écris un article j'aime me concentrer sur le contenu et non sur l'écriture de balises HTML, puis j'écris déjà tous mes articles et pages en Markdown. Sans oublier que gérer la pagination et la réplication des éléments en commun dans chaque page aurait été absurde. J'ai donc utilisé un générateur de site statique : Pelican.
Pourquoi Pelican ?
Je n'avais pas beaucoup d'expérience avec des générateurs de site statique. J'en ai regardé plusieurs…
GoHugo
J'ai déjà touché à GoHugo que l'on utilise pour le site d'Exodus-Privacy et je voulais l'éviter. Chaque fois qu'une nouvelle version de GoHugo sort j'ai l'impression que ça casse quelque chose dans le thème, qu'une fonctionnalité est dépréciée, etc. Peut-être est-ce nous qui ne savons pas bien nous en servir mais en tous cas ça ne me plaisait pas. En plus je ne touche pas trop au Go, donc en cas de pépin je risque de ne pas pouvoir bien réparer.
Jekyll
J'ai un ami qui utilise Jekyll pour son site web et m'en a dit du bien mais ici c'était le fait qu'il soit écrit en Ruby qui m'a rebuté. Ruby est le seul langage que j'ai testé qui me claque systématiquement entre les doigts, je crois n'avoir réussi à faire tourner qu'un seul logiciel écrit en Ruby une fois.
Zola
J'ai découvert Zola après avoir arrêté mon choix sur Pelican, il semble chouette et écrit en Rust (mais oui vous savez ce super langage d'avenir que l'on voit comme le C du futur). Mais j'avais déjà fait un bout du chemin avec Pelican à ce moment et je ne compte pas en changer.
Pelican
Pelican est écrit en Python, un langage que je connais bien, que j'utilise au quotidien et que je n'ai aucun mal à déboguer en cas de soucis. J'en avais déjà lu du bien dans différents articles de blog, il semble simple à utiliser et a une documentation pratique.
Construction du site
J'ai simplement suivi la doc, en commencant par installer pelican[markdown]
et en lançant la commande pelican-quickstart
.
Il crée l'architecture tout seul et même un Makefile pratique pour nettoyer, construire et même publier le site sur un serveur via rsync par exemple, bref il ne réinvente pas la roue et j'aime bien ça. J'ai copié mes articles dans content/articles
et mes pages dans content/pages
comme indiqué par la documentation, je lance Pelican et ça juste marche.
J'ai déjà un design pour mon site et ne veut pas en changer, je suis donc la documentation pour créer mon propre thème : ça marche du premier coup (ce qui, pour tester régulièrement plein de logiciels en suivant la documentation, est assez rare pour être noté). La documentation est claire et quand j'ai un doute je consulte les exemples que sont les nombreux thèmes déjà existant.
Le plus long a été d'écrire le template qui gére la pagination : je trouve toujours ça galère les paginations et là la logique de configuration de Pelican a été un peu compliquée à saisir. La logique se fait en Jinja que je connais déjà donc pas trop de soucis de ce côté.
J'en profite pour nettoyer un peu le CSS et corriger quelques petites bêtises de la version mobile.
Et les commentaires alors ?
Et oui, qui dit site statique dit plus moyen d'envoyer les commentaires à un programme qui les rangera dans une base de données. J'ai discuté un peu sur IRC et ai réfléchi à une autre manière de mettre des commentaires sur mon blog. Voici les différentes idées :
Une mailing list
C'est ce que font certaines personnes pour leur blog et même si l'idée est chouette je voulais tout de même que les personnes qui visitent mon site puissent lire les commentaires sans s'inscrire à quoi que ce soit.
Via le fédiverse
Certaines personnes postent un lien vers leur article sur leur compte du fédiverse et en mette un lien en bas de l'article pour que les gens commentent. Cependant ça oblige les gens qui souhaitent commenter à avoir un compte sur le fédiverse et il n'est pas possible d'intégrer facilement les commentaires dans le site (en soi si, c'est faisable avec un petit bout de code surement mais l'idée ne me plaisait pas).
Un système de commentaires statique et des mails
Je me suis dit qu'en soi je pouvais intégrer directement les commentaires au build du site, mais il faut le coder donc j'ai plutôt commencé par chercher si quelqu'un l'avait déjà fait. Je suis tombé sur plein de systèmes d'intégration de commentaires, tous avec du JS ou abandonnés. Et finalement j'ai découvert un plugin nommé pelican_comment_system spécialement conçu pour Pelican.
Ce plugin permet de créer un dossier par article et de stocker les commentaires au format Markdown à raison d'un fichier par commentaire et il gère même les réponses aux commentaires existants. Je l'installe donc, met mes commentaires dans le dossier qui va bien et relance Pelican, et paf une erreur :
CRITICAL: 'Pelican' object has no attribute 'get_writer'
Bon pas grand-chose au final, juste le nom de cette fonction qui a changé. Une pull request plus tard le soucis est corrigé et les commentaires s'affichent sans soucis sur le site.
Mais comment les personnes qui visitent le site peuvent les envoyer ? Par mail pardi ! Alors oui certaines personnes me diront qu'il faut avoir une adresse mail, mais il est beaucoup plus commun que les gens utilisant le web aient une adresse mail qu'un compte sur le fédiverse et c'est la solution qui m'a semblé être la plus pertinente. Il y a donc à présent un simple bouton « Commenter par mail » en bas de chaque article, ça me permet de les lire tranquillement quand je les reçois, de virer les spams et de les publier ensuite.
Pas de commentaires
En soit l'une des possibilités aurait pu être de supprimer simplement les commentaires, mais pour le moment même s'il y en a très peu sur mon site, je veux les garder.
Un thème sombre
J'ai profité de cette refonte pour créer un thème sombre. J'utilise pour cela la caractéristique CSS média prefers-color-scheme
, ainsi le choix fait par la personne dans son navigateur ou son système est automatiquement honoré et pas besoin de javascript. Ça faisait longtemps que j'avais cette idée en tête, car je préfère les sites au thème sombre.
Publication automagique
Avant pour publier un nouvel article, je devais envoyer le fichier markdown sur le serveur puis aller dans une interface d'administration de mon site pour entrer des informations comme la date, le titre, le lien permanent de l'article, etc. J'ai voulu simplifier cette méthode de publication. Depuis quelques années je versionne ce blog sur un dépôt Git, j'ai donc fait un script qui tourne sur mon serveur et réalise les actions suivantes :
- Il fetch le dépôt Git et compare au dépôt local
- S'il n'est pas à jour il met à jour via un pull
- Il construit le site avec Pelican
- Si la construction réussie, il déplace le dossier contenant le site dans un dossier spécifique en le nommant avec la date et l'identifiant du commit sur lequel il est basé
- Il bascule le lien symbolique (renseigné dans la configuration du serveur web) de l'ancien dossier du site vers le nouveau
- Il supprime les anciennes versions
Et voilà, je peux lancer ce script manuellement ou le mettre dans une tâche cron pour qu'il se lance toutes les heures par exemple. Juste à tranquillement écrire mon article, faire un commit et hop le voilà publié.
Vous pouvez commenter en envoyant un mail via ce bouton (votre adresse ne sera pas publié).
Commenter par mail