Aller au contenu

Migration de mon blog de ghost CMS vers Astro

migration-ghost-Astro

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.

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 !

Commençons par la base : créer un projet Astro avec la template starlight comme ceci :

FenĂȘtre de terminal
npm create Astro@latest -- --template starlight

Vous 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.

FenĂȘtre de terminal
npm i starlight-blog

Puis, 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/config
export 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 :

FenĂȘtre de terminal
npm run dev

Sont 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éation
tags: ["Mes_tags"]
featured: true # Permet de mettre en avant un article
draft: true # Permet de mettre en draft un article, donc de ne pas l'afficher sur la production
---
# Introduction
Mon article...

Voici quelques exemples de plugins qui peuvent ĂȘtre utiles si vous souhaitez vous lancer dans un projet starlight :

La plupart des plugins s’installe de cette maniùre (exemple avec starlight-image-zoom) :

  1. Ajouter le package avec npm
FenĂȘtre de terminal
npm i starlight-image-zoom
  1. 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.

Comme je ne souhaitais pas installer node sur mon serveur, j’ai créé un dockerfile du projet.

FenĂȘtre de terminal
# Étape 1 : Construire l'application
FROM node:lts AS builder
WORKDIR /app
# Copier les fichiers essentiels pour installer les dépendances
COPY package.json package-lock.json ./
RUN npm install
# Copier le reste des fichiers pour le build
COPY . .
RUN npm run build
# Étape 2 : PrĂ©parer l'environnement de production
FROM node:lts AS runtime
WORKDIR /app
# Copier uniquement les fichiers nécessaires au runtime
COPY --from=builder /app/dist /app/dist
COPY --from=builder /app/package.json /app/package-lock.json /app/
# Installer uniquement les dépendances en production
RUN npm install --production
# Exposer le port pour le serveur
ENV HOST=0.0.0.0
ENV PORT=4321
EXPOSE 4321
# Commande pour démarrer le serveur
CMD ["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 :

FenĂȘtre de terminal
version: '3.8'
services:
app:
container_name: blog-callot-starlight
build:
context: .
dockerfile: Dockerfile
ports:
- "4321:4321"
environment:
- HOST=0.0.0.0
- PORT=4321

Le docker-compose va simplement construire le container et exposer le port.

docker compose build && docker compose up

Votre conteneur docker est maintenant opérationnel. Bravo !

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 :

Cliquer sur Worker et pages (1), puis Pages (2) puis “se connecter à Git” (3).

  • Il faut ensuite choisir le bon repo :

Cliquer sur (1) pour Gitlab, puis sélectionner votre compte Gitlab (2) et enfin votre repo (3).

  • Puis il faut choisir l’architecture de dĂ©ploiement :

J’ai rentrĂ© les configurations suivantes :

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.

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 301

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.