Migration de mon blog de ghost CMS vers Astro
Pourquoi cette migration ?
Section intitulĂ©e « Pourquoi cette migration ? »Pour le panache đ€© ! Non, en vrai, lâancienne version de mon blog Ă©tait basĂ©e sur GhostCMS. Ce CMS me convenait parfaitement, grĂące notamment Ă un Backend trĂšs bien fait. NĂ©anmoins, jâĂ©tais confrontĂ© Ă certaines problĂ©matiques :
- Il est obligatoire dâavoir une BDD.
- Les plugins sont limitĂ©s Ă des outils permettant lâinteraction sociale.
- La construction dâun thĂšme (bien que bien documentĂ©) nâest pas des plus simples.
- De fait, il existe un vĂ©ritable marchĂ© des thĂšmes (beaucoup de designers font des thĂšmes payants) et nâĂ©tant pas « dev front », je voulais trouver un thĂšme open source qui me conviendrait.
- Le backup est manuel.
- Le site est globalement lourd et nâest pas personnalisable.
- Il y a parfois des lenteurs sur le site.
Bon du coup, pourquoi choisir Astro ?
Section intitulée « Bon du coup, pourquoi choisir Astro ? »
Tout dâabord, jâai vu la techno Ă lâĆuvre grĂące au superbe blog de Stephane Robert. Jâai trouvĂ© le site rapide et ergonomique, cela mâa tout suite plu.
Ensuite, pour les raisons suivantes :
- Pas besoin de backup, car jâai tout mis dans un repo gitlab, les pages Ă©tants simplement des fichiers markdown.
- Il est bien plus « customisable » que GhostCMS.
- Je lâai dĂ©jĂ dit, mais le framework est rapide, genre trĂšs rapide mĂȘme.

- A terme, je souhaite mettre en place des formations sur mon site. Or, Astro starlight est dâabord un outil de documentation.
- Une barre de recherche performante (oui bon, câest basique, mais le package de base dâAstro contient en production une barre de recherche).
- Une sĂ©curitĂ© accrue car il nây a pas de backend, pas dâidentification, pas de base de donnĂ©es. Keep it simple !
La crĂ©ation dâun projet Astro starlight
Section intitulĂ©e « La crĂ©ation dâun projet Astro starlight »
Commençons par la base : créer un projet Astro avec la template starlight comme ceci :
npm create Astro@latest -- --template starlightVous pouvez donner un nom Ă votre projet, puis demander Ă Astro dâajouter les dĂ©pendances et dâinitialiser un projet git si vous le souhaitez.

Ensuite, nous allons installer un plugin trĂšs important pour mon site. Il sâagit du plugin « blog » dâAstro starlight.
npm i starlight-blogPuis, il convient de modifier la configuration dans le Astro.config.mjs :
import { defineConfig } from 'Astro/config';import starlight from '@Astrojs/starlight';import starlightBlog from "starlight-blog";
// https://Astro.build/configexport default defineConfig({ integrations: [ starlight({ plugins: [ starlightBlog({ authors: { Bob: { name: "Antoine CALLOT", title: "Couteau suisse IT", picture: "/assets/antoine-callot.jpeg", }, }, postCount: 12, frontmatter: { prev: false, next: false, }, }), ], title: "My Docs", social: { github: "https://github.com/withAstro/starlight", }, defaultLocale: "root", pagination: true, // optional locales: { root: { label: "French", lang: "fr-FR", // lang is required for root locales }, }, sidebar: [ { label: "Guides", items: [ // Each item here is one entry in the navigation menu. { label: "Example Guide", slug: "guides/example" }, ], }, { label: "Reference", autogenerate: { directory: "reference" }, }, ], }), ],});Vous pouvez run le projet :
npm run devSont maintenant opérationnels votre documentation avec Starlight ainsi que le plugin starlight-blog :

Vous devez ensuite créer un répertoire dans src/content/docs intitulé blog.
Puis vous pouvez crĂ©er du contenu en format markdown (ou mdx) sur votre site dans le dossier blog avec lâen-tĂȘte suivante dans votre fichier :
---title: "Mon titre"description: "Migration de mon blog"date: 2025-01-15 # date de crĂ©ationtags: ["Mes_tags"]featured: true # Permet de mettre en avant un articledraft: true # Permet de mettre en draft un article, donc de ne pas l'afficher sur la production---# IntroductionMon article...Ajouter dâautres plugins au blog
Section intitulĂ©e « Ajouter dâautres plugins au blog »Voici quelques exemples de plugins qui peuvent ĂȘtre utiles si vous souhaitez vous lancer dans un projet starlight :
- starlight-image-zoom : ce plugin permet dâactiver le zoom au clic sur les images.

- Astro-icon permet de gérer les icÎnes en svg.
- Starlight-site-graph permet de crĂ©er de beaux graphiques pour du âsite mapâ.
- Starlight-view-modes permet dâavoir un mode âprĂ©sentation (Zen pages)â sur vos pages.
- Starlight-theme-rapide vous permet dâobtenir un thĂšme simple pour vos pages.
La plupart des plugins sâinstalle de cette maniĂšre (exemple avec starlight-image-zoom) :
- Ajouter le package avec npm
npm i starlight-image-zoom- Modifier le fichier de configuration
Astro.config.mjs
Pour les plugins starlight, dans la plupart des cas, vous devez modifier le fichier Astro.config.mjs Ă la racine du projet.
import starlight from '@astrojs/starlight'import { defineConfig } from 'astro/config'+import starlightImageZoom from 'starlight-image-zoom'
export default defineConfig({ integrations: [ starlight({+ plugins: [starlightImageZoom()], title: 'My Docs', }), ],})Une fois, ceci fait, votre plugin est installé.
Le problĂšme de lâimportation des donnĂ©es depuis ghost
Section intitulĂ©e « Le problĂšme de lâimportation des donnĂ©es depuis ghost »Je ne pouvais pas exporter mes pages depuis ghost directement, ce qui a rendu la migration un peu plus compliquĂ©e. Jâai donc trouvĂ© un plugin sympathique qui mâa permis dâexporter une page en format markdown ainsi que les images de chaque page web de mon blog prĂ©cĂ©dent.
Ce plugin, câest MarkDownload - Markdown Web Clipper.
Une fois le plugin installĂ©, il faut aller sur lâancien site et cliquer sur lâextension. Il est alors possible dâexporter en markdown le contenu dâune page Web et crĂ©er un dossier contenant toutes les images :

Comme je nâen avais pas beaucoup, jâai donc fait cela pour lâensemble de mes prĂ©cĂ©dents billets de blog.
Dockerfile et Docker-compose
Section intitulĂ©e « Dockerfile et Docker-compose »Comme je ne souhaitais pas installer node sur mon serveur, jâai créé un dockerfile du projet.
# Ătape 1 : Construire l'applicationFROM node:lts AS builderWORKDIR /app
# Copier les fichiers essentiels pour installer les dépendancesCOPY package.json package-lock.json ./RUN npm install
# Copier le reste des fichiers pour le buildCOPY . .RUN npm run build
# Ătape 2 : PrĂ©parer l'environnement de productionFROM node:lts AS runtimeWORKDIR /app
# Copier uniquement les fichiers nécessaires au runtimeCOPY --from=builder /app/dist /app/distCOPY --from=builder /app/package.json /app/package-lock.json /app/
# Installer uniquement les dépendances en productionRUN npm install --production
# Exposer le port pour le serveurENV HOST=0.0.0.0ENV PORT=4321EXPOSE 4321
# Commande pour démarrer le serveurCMD ["node", "./dist/server/entry.mjs"]Le dockerfile, situé à la racine de mon projet est trÚs simple : il se base sur une image docker contenant la derniÚre version de Nodejs. Le script copie le projet dans le conteneur et installe les modules nodes. Puis il faut run le serveur.
Voici le docker-compose.yml :
version: '3.8'
services: app: container_name: blog-callot-starlight build: context: . dockerfile: Dockerfile ports: - "4321:4321" environment: - HOST=0.0.0.0 - PORT=4321Le docker-compose va simplement construire le container et exposer le port.
docker compose build && docker compose upVotre conteneur docker est maintenant opérationnel. Bravo !
Astro et Cloudflare Pages
Section intitulée « Astro et Cloudflare Pages »
Il est possible dâhĂ©berger gratuitement un site sous Astro avec Cloudflare Pages.
Quâest-ce que Cloudflare Page ?
Cloudflare Pages est un service dâhĂ©bergement pour sites web statiques ou gĂ©nĂ©rĂ©s par des frameworks (comme Astro ou Next.js). Il dĂ©ploie automatiquement votre site depuis un dĂ©pĂŽt Git (GitHub, GitLab), en le consruisant dans un environnement cloud rapide et globalement distribuĂ©.
En effet, il est possible de créer un pipeline entre Gitlab ou Github et Cloudflare pour que chaque commit sur une branche puisse directement pousser une nouvelle version du site sur Cloudflare Pages !
De plus, selon le nombre de vues sur votre page, cela va rendre lâhĂ©bergement de votre site gratuit grĂące Ă lâutilisation Cloudflare Pages đ
Voici comment jâai procĂ©dĂ© pour mettre le site sur Cloudflare Pages :
- Tout dâabord, il faut forcer le contenu âstaticâ du site.
Pour ce faire, configurez comme ceci les paramĂštres de votre configuration Astro.config.mjs :
export default defineConfig({ output: 'static',- Ensuite, il faut créer un compte sur Cloudflare pour pouvoir créer des Cloudflare Pages :

- Il faut ensuite choisir le bon repo :

- Puis il faut choisir lâarchitecture de dĂ©ploiement :

npm run build -> commande de version.
dist/client -> répertoire de sortie de version.
- Pour finir, on peut regarder si lâexecution sâest bien passĂ©e :

Et voila, le site est en ligne et vous allez pouvoir faire pointer votre dns.
Redirection vers les bonnes pages
Section intitulĂ©e « Redirection vers les bonnes pages »Les url ne sont pas constituĂ©es de la mĂȘme façon entre ghost et Astro-starlight.
Pour conserver les liens précédents du site et faire en sorte de ne pas finir sur une erreur 404, il faut créer un fichier dans /public/_redirects. Ce fichier est interprété par Cloudflare pour créer des redirection :
/n8n-le-concurrent-opensource-a-zapier-make-et-ifttt /blog/2024-03/n8n-alternative 301Conclusion et axes dâamĂ©lioration
Section intitulĂ©e « Conclusion et axes dâamĂ©lioration »En conclusion, le passage de ce blog de GhostCMS Ă Astro.js Ă©tait simple. Câest cependant dommage que GhostCMS ne facilite pas la migration par des systĂšmes dâexport (autre quâun .json compatible uniquement avec GhostCMS).
En tout cas, on peut dire que cette migration mâa beaucoup appris sur Astro.js et Astro-Starlight. Câest un super outil de documentation que lâon peut transformer en blog avec un plugin. Jâai ainsi obtenu un site lĂ©ger et statique, tout en Ă©tant ergonomique et pas trop moche.
Dans les axes dâamĂ©liorations, jâai notĂ© quâil est prĂ©fĂ©rable de :
- Avoir une bonne organisation pour trier ces dossiers đ. Pour le moment, je suis parti sur 2 types dâarchitecture diffĂ©rentes : une architecture par mois de crĂ©ation pour les articles (Ex :
blog>2024-12>mon_arcticle.md) et une architecture par thĂ©matiques et sous-parties pour les formations (Ex :Formations>Notion>section_1>ma_formation.md). Je ne sais pas si câest judicieux, mais cela a le mĂ©rite dâĂȘtre clair pour moi. - Trouver un bon Ă©diteur .mdx car je ne suis pas satisfait du plugin de visual code pour ce langage.