Développement · 16 min read · Oct 14, 2025
Comment déployer Ghost CMS sur Rocky Linux 9

Ghost est une plateforme de blogging open-source qui vous aide à créer un blog au design professionnel. Elle a été lancée en 2013 comme alternative à WordPress, car ce dernier devenait trop complexe. Elle est écrite en JavaScript et est alimentée par la bibliothèque Node.js.
Ce tutoriel explorera comment installer Ghost CMS en utilisant Nginx et MySQL sur un serveur alimenté par Rocky Linux 9. Nous utiliserons le serveur Nginx pour héberger le blog et le certificat SSL Let’s Encrypt pour sécuriser notre installation.
Prérequis
- Un serveur exécutant Rocky Linux 9.
- Un utilisateur non-root avec des privilèges sudo.
- Un nom de domaine entièrement qualifié (FQDN) pointant vers votre serveur. Pour nos besoins, nous utiliserons
ghost.example.comcomme nom de domaine. - Assurez-vous que tout est à jour.
$ sudo dnf update - Installez les paquets utilitaires de base. Certains d’entre eux peuvent déjà être installés.
$ sudo dnf install wget curl nano unzip yum-utils -y
Étape 1 - Configurer le pare-feu
La première étape consiste à configurer le pare-feu. Rocky Linux utilise Firewalld Firewall. Vérifiez l’état du pare-feu.
$ sudo firewall-cmd --state
running
Le pare-feu fonctionne avec différentes zones, et la zone publique est celle par défaut que nous allons utiliser. Listez tous les services et ports actifs sur le pare-feu.
$ sudo firewall-cmd --permanent --list-services
Il devrait afficher la sortie suivante.
cockpit dhcpv6-client ssh
Wiki.js a besoin des ports HTTP et HTTPS pour fonctionner. Ouvrez-les.
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
Rechargez le pare-feu pour appliquer les modifications.
$ sudo firewall-cmd --reload
Étape 2 - Installer Nginx
Rocky Linux 9 est livré avec une version plus ancienne de Nginx. Vous devez télécharger le dépôt officiel de Nginx pour installer la dernière version.
Créez et ouvrez le fichier /etc/yum.repos.d/nginx.repo pour créer le dépôt officiel de Nginx.
$ sudo nano /etc/yum.repos.d/nginx.repo
Collez le code suivant dedans.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Installez le serveur Nginx.
$ sudo dnf install nginx -y
Vérifiez l’installation.
$ nginx -v
nginx version: nginx/1.22.1
Activez et démarrez le serveur Nginx.
$ sudo systemctl enable nginx --now
Vérifiez l’état du serveur.
$ sudo systemctl status nginx
? nginx.service - nginx - serveur web haute performance
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 08:27:47 UTC; 2s ago
Docs: http://nginx.org/en/docs/
Process: 1650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1651 (nginx)
Tasks: 2 (limit: 5912)
Memory: 1.9M
CPU: 7ms
CGroup: /system.slice/nginx.service
??1651 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??1652 "nginx: worker process"
Oct 25 08:27:47 ghost.example.com systemd[1]: Starting nginx - high performance web server...
Étape 3 - Installer Node.js
Ghost Installer a besoin de Nodejs pour fonctionner. Exécutez les commandes suivantes pour installer Node 16.
$ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
Installez Node.
$ sudo dnf install -y nodejs
Vérifiez l’installation de Node.
$ node --version
v16.18.0
Au moment de la rédaction de ce tutoriel, Node 18 est sorti et est la version LTS. Ghost n’a pas encore ajouté de support pour cela. Veillez à vérifier le document Ghost concernant les versions de Node pour la dernière version de Node prise en charge. Lorsque Ghost ajoutera le support pour Node 18, installez Node 18 en utilisant les commandes suivantes à la place.
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
Étape 4 - Installer MySQL
Rocky Linux 9 est livré avec la dernière version de MySQL. Vous pouvez l’installer avec une seule commande.
$ sudo dnf install mysql-server
Vérifiez la version de MySQL.
$ mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)
Activez et démarrez le service MySQL.
$ sudo systemctl enable mysqld --now
Vérifiez l’état du service.
$ sudo systemctl status mysqld
? mysqld.service - MySQL 8.0 serveur de base de données
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 09:00:26 UTC; 3s ago
Process: 2920 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Process: 2942 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Main PID: 3021 (mysqld)
Status: "Le serveur est opérationnel"
Tasks: 39 (limit: 5912)
Memory: 404.4M
CPU: 4.686s
CGroup: /system.slice/mysqld.service
??3021 /usr/libexec/mysqld --basedir=/usr
Oct 25 09:00:18 ghost.example.com systemd[1]: Starting MySQL 8.0 serveur de base de données...
Oct 25 09:00:18 ghost.example.com mysql-prepare-db-dir[2942]: Initializing MySQL database
Oct 25 09:00:26 ghost.example.com systemd[1]: Started MySQL 8.0 serveur de base de données.
Vous pouvez vous connecter à l’interface de commande MySQL en utilisant l’authentification Unix par défaut. Mais vous ne pouvez pas exécuter l’assistant de configuration de sécurité. Par conséquent, l’étape suivante est nécessaire pour les versions de MySQL 8.0.28 et supérieures. Entrez dans l’interface de commande MySQL.
$ sudo mysql
Exécutez la commande suivante pour définir le mot de passe de votre utilisateur root. Assurez-vous qu’il contient un mélange de chiffres, de majuscules, de minuscules et de caractères spéciaux.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';
Quittez l’interface. L’inconvénient de cette étape est que vous ne pouvez plus vous connecter à l’interface de commande MySQL en utilisant l’authentification Unix.
mysql> exit
Exécutez le script d’installation sécurisée de MySQL.
$ sudo mysql_secure_installation
Vous serez invité à installer le composant de validation des mots de passe. Il vérifie la force des mots de passe utilisés dans MySQL. Appuyez sur Y pour l’installer.
Sécurisation du déploiement du serveur MySQL.
Connexion à MySQL avec un mot de passe vide.
LE COMPOSANT DE VALIDATION DES MOTS DE PASSE peut être utilisé pour tester les mots de passe
et améliorer la sécurité. Il vérifie la force du mot de passe
et permet aux utilisateurs de définir uniquement les mots de passe qui sont
suffisamment sécurisés. Souhaitez-vous configurer le composant de validation des mots de passe ?
Appuyez sur y|Y pour Oui, toute autre touche pour Non : Y
Ensuite, vous serez invité à définir le niveau de la politique de validation des mots de passe. Choisissez 2 car c’est le plus fort. Vous serez ensuite invité à créer un mot de passe root. Entrez un mot de passe répondant aux exigences données. Et lorsque vous serez invité à continuer avec le mot de passe, appuyez sur Y pour continuer.
Il existe trois niveaux de politique de validation des mots de passe :
FAIBLE Longueur >= 8
MOYENNE Longueur >= 8, numérique, casse mixte et caractères spéciaux
FORT Longueur >= 8, numérique, casse mixte, caractères spéciaux et fichier de dictionnaire
Veuillez entrer 0 = FAIBLE, 1 = MOYENNE et 2 = FORT : 2
Veuillez définir le mot de passe pour root ici.
Nouveau mot de passe :
Ressaisissez le nouveau mot de passe :
Force estimée du mot de passe : 100
Souhaitez-vous continuer avec le mot de passe fourni ? (Appuyez sur y|Y pour Oui, toute autre touche pour Non) : Y
Enfin, appuyez sur Y pour supprimer les utilisateurs anonymes, interdire les connexions root à distance, supprimer la base de données de test et recharger les tables de privilèges.
Par défaut, une installation MySQL a un utilisateur anonyme,
permettant à quiconque de se connecter à MySQL sans avoir à créer
un compte utilisateur pour eux. Cela est uniquement destiné à
l'essai, et pour rendre l'installation un peu plus fluide.
Vous devriez les supprimer avant de passer à un environnement de production.
Supprimer les utilisateurs anonymes ? (Appuyez sur y|Y pour Oui, toute autre touche pour Non) : Y
Succès.
Normalement, root ne devrait être autorisé à se connecter que depuis
'localhost'. Cela garantit que quelqu'un ne peut pas deviner le
mot de passe root depuis le réseau.
Interdire la connexion root à distance ? (Appuyez sur y|Y pour Oui, toute autre touche pour Non) : Y
Succès.
Par défaut, MySQL est livré avec une base de données nommée 'test' à laquelle
quiconque peut accéder. Cela est également destiné uniquement à l'essai,
et doit être supprimé avant de passer à un environnement de production.
Supprimer la base de données de test et l'accès à celle-ci ? (Appuyez sur y|Y pour Oui, toute autre touche pour Non) : Y
- Suppression de la base de données de test...
Succès.
- Suppression des privilèges sur la base de données de test...
Succès.
Recharger les tables de privilèges garantira que toutes les modifications
apportées jusqu'à présent prendront effet immédiatement.
Recharger les tables de privilèges maintenant ? (Appuyez sur y|Y pour Oui, toute autre touche pour Non) : Y
Succès.
Tout est fait !
Cela complète le processus d’installation et de sécurisation de MySQL.
Étape 5 - Installer Ghost
L’installation de Ghost comprendra trois composants - l’outil en ligne de commande Ghost-CLI qui installe et gère les mises à jour du blog Ghost et le package du blog lui-même.
Installer Ghost-CLI
Exécutez la commande suivante pour installer l’outil Ghost-CLI. Ignorez les avertissements que vous recevez pendant le processus.
$ sudo npm install ghost-cli@latest -g
Préparer le répertoire Ghost
Créez le répertoire racine de Ghost.
$ sudo mkdir -p /var/www/html/ghost
Définissez la propriété du répertoire à l’utilisateur actuel.
$ sudo chown $USER:$USER /var/www/html/ghost
Définissez les permissions correctes du répertoire.
$ sudo chmod 755 /var/www/html/ghost
Accédez au répertoire Ghost.
$ cd /var/www/html/ghost
Installer Ghost
L’installation de Ghost est un processus d’une seule commande.
$ ghost install
Pendant l’installation, l’outil CLI posera un certain nombre de questions pour configurer le blog.
- Au moment de la rédaction de ce tutoriel, Ghost-CLI ne prend en charge aucun autre système d’exploitation à part Ubuntu. Il vous demandera si vous souhaitez toujours continuer avec l’installation. Appuyez sur Y pour continuer.
- URL du blog : Entrez l’URL complète de votre blog avec le protocole https. (
https://ghost.example.com) - Nom d’hôte MySQL : Appuyez sur Entrée pour utiliser la valeur par défaut de
localhostpuisque notre installation Ghost et MySQL sont sur le même serveur. - Nom d’utilisateur MySQL : Entrez
rootcomme nom d’utilisateur MySQL. - Mot de passe MySQL : Entrez votre mot de passe root créé précédemment.
- Nom de la base de données Ghost : Donnez un nom à votre base de données Ghost. (
ghostdb) - Mot de passe sudo : Entrez le mot de passe sudo de votre système pour exécuter des commandes élevées.
- Configurer un utilisateur MySQL pour Ghost ? : L’installateur vous demandera si vous souhaitez créer un utilisateur MySQL séparé pour Ghost. Appuyez sur Y pour continuer.
- Configurer Nginx ? : En général, Ghost-CLI détecte votre installation Nginx et la configure automatiquement pour votre blog. Mais pour l’instant, il ne peut pas détecter notre installation Nginx. Par conséquent, l’installateur sautera automatiquement cette étape. Nous configurerons Nginx manuellement.
- Configurer SSL ? : Puisqu’il a sauté la configuration de Nginx, l’outil CLI sautera également la configuration d’un SSL.
- Configurer systemd ? : Ghost vous demandera si vous souhaitez configurer un service système pour Ghost. Appuyez sur Y pour continuer.
- Démarrer Ghost ? : Appuyez sur Y pour démarrer votre installation Ghost. Le service démarrera mais nous devrons configurer Nginx et SSL pour le faire fonctionner.
Étape 6 - Installer SSL
Avant de continuer, nous devons installer l’outil Certbot et un certificat SSL pour notre domaine.
Pour installer Certbot, nous utiliserons le gestionnaire de paquets Snapd. Snapd porte toujours la dernière version stable de Certbot, que vous devriez utiliser.
L’outil Snapd nécessite le dépôt Epel pour fonctionner.
$ sudo dnf install epel-release -y
Nous utiliserons Snapd pour installer Certbot. Installez Snapd.
$ sudo dnf install snapd -y
Activez et démarrez le service Snap.
$ sudo systemctl enable snapd.socket --now
Créez les liens nécessaires pour que Snapd fonctionne.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Assurez-vous que votre version de snapd est à jour.
$ sudo snap install core
$ sudo snap refresh core
Installez Certbot.
$ sudo snap install --classic certbot
Utilisez la commande suivante pour vous assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Générez un certificat SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d ghost.example.com
La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/ghost.example.com sur votre serveur.
Générez un certificat de groupe Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Faites un essai à sec du processus pour vérifier si le renouvellement SSL fonctionne correctement.
$ sudo certbot renew --dry-run
Si vous ne voyez aucune erreur, vous êtes prêt. Votre certificat se renouvellera automatiquement.
Étape 7 - Configurer Nginx
Créez et ouvrez le fichier /etc/nginx/conf.d/ghost.conf pour l’édition.
$ sudo nano /etc/nginx/conf.d/ghost.conf
Collez le code suivant dans le fichier ghost.conf. Remplacez toutes les instances de ghost.example.com par votre domaine.
## imposer HTTPS
server {
listen 80;
listen [::]:80;
server_name ghost.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ghost.example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
http2_push_preload on; # Activer HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ghost.example.com/chain.pem;
ssl_session_timeout 1d;
# Activer les versions TLS (TLSv1.3 est requis pour le prochain HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Activer le 0-RTT de TLSv1.3. Utilisez $ssl_early_data lors de la mise en proxy vers
# prévenir les attaques de rejeu.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling ---
# récupérer les enregistrements OCSP à partir de l'URL dans ssl_certificate et les mettre en cache
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
# Ce bloc est utile pour déboguer TLS v1.3. N'hésitez pas à supprimer cela
# et à utiliser la variable `$ssl_early_data` exposée par NGINX directement si vous
# souhaitez le faire.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
La configuration ci-dessus redirigera toutes les requêtes HTTP vers HTTPS et servira de proxy pour le service Ghost afin de le servir via votre domaine.
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Ouvrez le fichier /etc/nginx/nginx.conf pour l’édition.
$ sudo nano /etc/nginx/nginx.conf
Ajoutez la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Vérifiez votre configuration Nginx.
$ sudo nginx -t
Si vous ne voyez aucune erreur, cela signifie que vous êtes prêt à partir. Rechargez le serveur Nginx.
$ sudo systemctl reload nginx
Étape 8 - Configurer SELinux
Autorisez Nginx à se connecter au réseau.
$ sudo setsebool -P httpd_can_network_connect 1
Étape 9 - Exécuter le site
Maintenant, vous pouvez vérifier votre installation en ouvrant https://ghost.example.com dans votre navigateur web. Vous obtiendrez la page suivante indiquant une installation réussie.

Étape 10 - Compléter la configuration
Pour terminer la configuration de votre blog Ghost, visitez https://ghost.example.com/ghost dans votre navigateur. Le /ghost supplémentaire à la fin du domaine de votre blog vous redirige vers le panneau d’administration de Ghost ou, dans ce cas, la configuration puisque vous y accédez pour la première fois.
Vous devrez créer votre compte administrateur et choisir un titre de blog.

Entrez vos détails et cliquez sur le bouton Créer un compte et commencer à publier pour continuer.
Ensuite, vous serez dirigé vers l’écran suivant, où vous aurez des options telles que rédiger votre premier post, personnaliser votre site et importer des membres.

Nous choisirons Explorer l’administration Ghost pour explorer et aller directement au tableau de bord. À la fin de la configuration, vous serez accueilli avec le panneau d’administration de Ghost.

Si vous souhaitez passer en mode sombre, vous pouvez le faire en cliquant sur le bouton bascule à côté du bouton d’engrenage des paramètres en bas de la page des paramètres.
Passez à la page des posts et vous verrez un post par défaut. Vous pouvez le dépublier ou le supprimer et commencer à publier.
)
Étape 11 - Configurer le Mailer
Ghost agit non seulement comme une plateforme de blogging mais aussi comme un gestionnaire de newsletters. Pour les opérations quotidiennes, vous pouvez utiliser n’importe quel service de mail transactionnel pour travailler avec Ghost pour l’envoi de mails. Mais si vous souhaitez envoyer des newsletters via Ghost, le seul expéditeur de masse officiel pris en charge est Mailgun. Vous pouvez également utiliser un autre service de newsletter, mais pour cela, vous devrez utiliser la fonctionnalité d’intégration Zapier de Ghost.
Commençons par configurer un service SMTP pour les emails transactionnels. Pour cela, ouvrez le fichier /var/www/html/ghost/config.production.json pour l’édition.
$ nano /var/www/html/ghost/config.production.json
Trouvez les lignes suivantes.
"mail": {
"transport": "Direct"
},
Remplacez-les par le code suivant.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
Ici, nous utilisons le service de mail Amazon SES car il est très bon marché et gratuit à vie si vous utilisez leur service EC2.
Si vous souhaitez utiliser leur service de newsletter via Mailgun, entrez le code suivant à la place.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.mailgun.org",
"port": 587,
"secure": true,
"auth": {
"user": "[email protected]",
"pass": "1234567890"
}
}
},
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Une fois terminé, redémarrez l’application Ghost pour que les modifications prennent effet.
$ ghost restart
Pour configurer les paramètres de la newsletter, visitez la section Paramètres >> Newsletter par email.

Cliquez sur le lien Configuration Mailgun pour développer.
Remplissez votre région Mailgun, domaine et clé API.

Cliquez sur le bouton Enregistrer en haut à droite pour enregistrer les paramètres.
Pour tester la livraison de la newsletter, ouvrez n’importe quel post, ouvrez ses paramètres et cliquez sur l’option Newsletter par email. Ensuite, envoyez un email de test pour vérifier si cela fonctionne. Si vous ne rencontrez aucune erreur, cela signifie que la livraison de votre newsletter fonctionne.
Étape 12 - Mettre à jour Ghost
Il existe deux types de mises à jour de Ghost - Mises à jour mineures et mises à jour majeures.
Tout d’abord, effectuez une sauvegarde complète si vous souhaitez effectuer une mise à jour mineure.
$ cd /var/www/html/ghost
$ ghost backup
Exécutez la commande de mise à jour pour effectuer la mise à jour mineure.
$ ghost update
Pour effectuer une mise à jour majeure, vous devez suivre le guide de mise à jour détaillé officiel sur Ghost. Selon la version que vous utilisez actuellement et la version majeure vers laquelle vous souhaitez mettre à jour, les étapes varieront.
Conclusion
Cela conclut notre tutoriel sur la façon de configurer Ghost CMS sur votre serveur Rocky Linux 9 en utilisant Nginx. Si vous avez des questions ou des commentaires, partagez-les dans les commentaires ci-dessous.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.