Blogging · 13 min read · Oct 23, 2025
Comment déployer Ghost Blog avec Nginx sur Debian 12

Ghost est une plateforme de blogging open-source qui vous aide à créer un blog au look professionnel. Elle a été lancée en 2013 comme alternative à WordPress. Elle est écrite en JavaScript et est alimentée par la bibliothèque Node.js.
Dans ce tutoriel, nous allons explorer comment installer Ghost CMS en utilisant Nginx et MySQL sur un serveur alimenté par Debian 12. Nous utiliserons le certificat SSL Let’s Encrypt pour sécuriser notre installation.
Prérequis
- Un serveur exécutant Debian 12 avec un minimum de 2 Go de RAM.
- Un utilisateur non-root avec des privilèges sudo.
- Un nom de domaine entièrement qualifié (FQDN) comme
example.compointant vers votre serveur. - Assurez-vous que tout est à jour.
$ sudo apt update $ sudo apt upgrade - Quelques paquets dont votre système a besoin.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yCertains de ces paquets peuvent déjà être installés sur votre système.
Étape 1 - Configurer le pare-feu UFW
La première étape consiste à configurer le pare-feu. Debian est livré avec ufw (Uncomplicated Firewall) par défaut.
Vérifiez si le pare-feu est en cours d’exécution.
$ sudo ufw status
Vous devriez obtenir la sortie suivante.
Status: inactive
Autorisez le port SSH afin que le pare-feu ne rompe pas la connexion actuelle lors de son activation.
$ sudo ufw allow OpenSSH
Autorisez également les ports HTTP et HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Activez le pare-feu
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Vérifiez à nouveau l’état du pare-feu.
$ sudo ufw status
Vous devriez voir une sortie similaire.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Étape 2 - Installer Nginx
Debian 12 est livré avec une version plus ancienne de Nginx. Pour installer la dernière version, vous devez télécharger le dépôt officiel de Nginx.
Importez la clé de signature de Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Ajoutez le dépôt pour la version stable de Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Mettez à jour les dépôts du système.
$ sudo apt update
Installez Nginx.
$ sudo apt install nginx
Vérifiez l’installation. Le sudo est requis pour exécuter la commande sur Debian.
$ sudo nginx -v
nginx version: nginx/1.24.0
Démarrez le serveur Nginx.
$ sudo systemctl start nginx
Étape 3 - Installer Node.js
L’installateur Ghost a besoin de Nodejs pour fonctionner. La première étape consiste à importer la clé GPG de Nodesource.
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
Ensuite, créez le fichier de dépôt Nodesource. Nous allons installer Node 18x qui est la version LTS (Long Term Support) actuelle que Ghost recommande.
$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
Mettez à jour la liste des dépôts du système.
$ sudo apt update
Installez Node.
$ sudo apt install nodejs -y
Confirmez l’installation de Node.
$ node --version
v18.18.2
Étape 4 - Installer MySQL en utilisant Docker
Debian n’est plus livré avec MySQL. Au lieu de cela, il est livré avec MariaDB. Ghost ne prend en charge que MySQL. Vous pouvez modifier Ghost pour fonctionner avec MariaDB, mais ce n’est pas recommandé. Comme les dépôts officiels de MySQL n’ont pas été mis à jour pour Debian 12 au moment de la rédaction de ce tutoriel, nous allons l’installer en utilisant Docker.
Importez la clé GPG de Docker.
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
Créez un fichier de dépôt Docker.
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Mettez à jour la liste des dépôts du système.
$ sudo apt update
Installez Docker et Docker Compose.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Par défaut, Docker nécessite des privilèges root. Si vous souhaitez éviter d’utiliser sudo chaque fois que vous exécutez la commande docker, ajoutez votre nom d’utilisateur au groupe docker.
$ sudo usermod -aG docker $(whoami)
Vous devrez vous déconnecter du serveur et vous reconnecter en tant que même utilisateur pour activer ce changement ou utiliser la commande suivante.
$ su - ${USER}
Confirmez que votre utilisateur a été ajouté au groupe Docker.
$ groups
navjot wheel docker
Maintenant que Docker est installé, nous devons créer un fichier de composition Docker pour MySQL. Créez un répertoire pour Docker MySQL.
$ mkdir ~/mysql
Créez et ouvrez le fichier docker-compose.yml pour l’édition.
$ nano docker-compose.yml
Collez le code suivant dedans.
services:
database:
image: container-registry.oracle.com/mysql/community-server:latest
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: ghost
MYSQL_PASSWORD: ghostpassword
MYSQL_DATABASE: ghostdb
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Ici, nous avons défini le mot de passe root et les identifiants MySQL pour la base de données Ghost. Ceux-ci seront créés lorsque le conteneur sera exécuté.
Démarrez le conteneur MySQL.
$ docker compose up -d
Vérifiez l’état du conteneur Docker.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec42fb205f1e container-registry.oracle.com/mysql/community-server:latest "/entrypoint.sh mysq…" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp mysql
Ghost peut se connecter au conteneur MySQL en utilisant le port 3306 et effectuer des opérations dessus.
Étape 5 - Installer Ghost
Nous pouvons également installer Ghost en utilisant Docker, ce qui peut simplifier les choses, mais nous ne le ferons pas ici.
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.
$ 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 sur 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
Passez 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 plusieurs questions pour configurer le blog.
- URL du blog : Entrez l’URL complète de votre blog avec le protocole https. (
https://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
ghostcomme nom d’utilisateur MySQL. - Mot de passe MySQL : Entrez votre mot de passe root créé précédemment dans le fichier docker.
- Nom de la base de données Ghost : Entrez le nom de la base de données (
ghostdb) configuré dans le fichier docker. - Mot de passe Sudo : Il demandera votre mot de passe sudo pour effectuer des tâches administratives.
- Configurer Nginx ? : En général, Ghost-CLI détecte votre installation Nginx et la configure automatiquement pour votre blog. Mais cela ne fonctionne que pour Nginx installé via le package OS. Comme nous l’avons installé en utilisant le dépôt de Nginx, Ghost ne peut pas le détecter et le sautera automatiquement.
- Configurer SSL ? : Puisqu’il a sauté la configuration de Nginx, l’outil CLI sautera également la configuration d’un SSL.
- Configurer systemd ? : Ghost 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. Cependant, cela ne fonctionnera pas car Nginx et SSL ne sont pas encore configurés.
Étape 6 - Installer SSL
Avant de continuer, nous devons installer l’outil Certbot et installer 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. Cependant, Debian n’est pas livré avec Snapd installé. Installez-le d’abord.
$ sudo apt install snapd
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
Vérifiez l’installation.
$ certbot --version
certbot 2.7.1
Générez un certificat SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/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
Vérifiez le service de planification de renouvellement de Certbot.
$ sudo systemctl list-timers
Vous trouverez snap.certbot.renew.service comme l’un des services programmés pour s’exécuter.
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left Mon 2023-10-16 00:00:18 UTC 9h ago dpkg-db-backup.timer dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer apt-daily.service
Faites un essai 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 example.com par votre domaine.
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
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;
}
}
La configuration ci-dessus redirigera toutes les requêtes HTTP vers HTTPS et servira de proxy pour le service Ghost pour 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. Redémarrez le serveur Nginx pour appliquer la configuration.
$ sudo systemctl restart nginx
Étape 9 - Exécuter le site
Maintenant, vous pouvez vérifier votre installation en ouvrant https://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://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.
Ici, 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.
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 e-mails 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": "'Support HowtoForge' [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 abordable et ne nécessite pas de frais mensuels.
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 e-mail.

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, créez un nouveau post de test, publiez-le et sélectionnez l’option Email uniquement. Si vous souhaitez également publier le post, sélectionnez l’option Publier et envoyer par e-mail.

Cliquez sur le bouton Continuer, dernière révision pour continuer. La page suivante demandera à nouveau une confirmation finale.

Cliquez sur le bouton Envoyer l’e-mail, maintenant pour envoyer la newsletter. Vous recevrez le message suivant une fois le mail envoyé.

Vérifiez votre e-mail pour le post.

É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 exécuter une mise à jour mineure. Cela crée une sauvegarde de tous les posts, membres, thèmes, images, fichiers et fichiers de redirection.
$ 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 à laquelle vous êtes 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 Debian 12 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.