Vous l'avez peut-être remarqué, mais le site a un peu changé.

J'ai profité d'un changement de VPS pour revoir également le mode de publication de mes articles. Depuis le début, mon blog était propulsé par Drupal, CMS sur lequel j'avais eu l'occasion de travailler il y a déjà bien longtemps, dans sa version 7.

Drupal est un CMS puissant, écrit en PHP, et utilisant une base MySQL.

Au fil du temps cependant, il est devenu de plus en plus lourd, beaucoup plus orienté vers une utilisation en entreprise, et clairement trop complexe pour un simple site personnel. De plus, les mises à jour se font maintenant plus facilement via composer, qui n'est pas forcément disponible sur un hébergement mutualisé "traditionnel".

J'ai donc décidé de partir sur un CMS plus léger. Comme j'utilisais déjà Grav pour le site de ma société ID NUM Consulting, je suis parti sur la même base.

Grav utilise une syntaxe de type Markdown pour les articles, ce qui est assez simple à produire.

Les étapes de migration

Je n'ai pas trouvé de solution toute faite pour la migration, mais j'avais un volume de données tout à fait maîtrisable (un peu plus de 200 articles).

Les points à considérer étaient les suivants :

  • reprise de la charge graphique, pour ne pas trop perturber les utilisateurs
  • reprise des URL, pour que les moteurs de recherche ne renvoient pas d'erreurs
  • reprise du contenu, avec les images, catégories, tags

Choix des plugins et du thème

Dans un premier temps, j'ai cherché s'il existait des skeletons Grav adaptés à ce que je voulais faire, mais au final je suis parti sur une installation de base, avec quelques plugins :

  • admin : pour disposer d'un back-office d'administration du site
  • archives : affiche les articles par date
  • feed : flux de syndication RSS / Atom
  • form : pour le formulaire de contact
  • pagination : pagination des articles
  • simplesearch : barre de recherche simple
  • sitemap : création de la sitemap pour les moteurs de recherche
  • taxonomylist : affichage des tags

Pour le thème, je suis également parti du thème Quark (le thème de base), que j'ai customisé selon mes besoins.

Reprise des données

Dans un premier temps, je voulais caractériser le contenu de mon site sous Drupal. Pour agit efficacement, il faut savoir de quoi on parle.

PLutôt que de partir de la base de données, j'ai préféré faire un scraping de mon site pour en extraire les éléments. J'ai fait ça avec un programme python, et plusieurs modules :

  • requests : pour gérer les appels http
  • bs4 pour récupérer BeautifulSoup qui me permet de récupérer les composants HTML
  • markdownify qui permet de convertir le HTML en Markdown

Le programme fait un appel pour chaque numéro de node Drupal. On récupère ensuite les éléments tels que titre, chemin (URL), type de contenu, date de publication, catégorie, tags, images et fichiers.

A partir de là, j'ai pu avoir une liste des contenus, et leur catégorie et tags. J'avais assez peu de contenus avec des images et des fichiers, j'ai donc préféré ne pas passer de temps à reprendre ces éléments de manière précise.

Une fois que le programme de liste a été réalisé, un autre programme me permet de récupérer le contenu, et le convertir en Markdown, tout en générant l'entête qui va bien pour donner les méta-données :

  • titre
  • date de rédaction
  • catégorie
  • tags
  • path.

J'en ai profité pour valider le contenu, éventuellement l'adapter ou le supprimer.

Je n'ai pas repris, volontairement, tout ce qui concerne le CMS Drupal, puisque j'avais arrêté de travailler dessus en version 7, et que j'imagine que ce qui était valable à l'époque (en 2012) n'est plus pertinent en 2026.

Publication des données

Pour la publication, je rédige les pages en local, avec une instance sur mon localhost.

Lorsque c'est OK, je pousse les modifications sur mon serveur Git.

Je vais ensuite sur le VPS, et je récupère les dernières mises à jour. Je gère ça manuellement, car je n'ai pas un rythme de publication très élevé. On pourrait sans doute ajouter un hook qui irait déclencher une mise à jour lorsqu'on fait le commit côté Git, mais je n'ai pas encore poussé l'automatisation jusque là.

Previous Post