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.com pointant 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 -y Certains 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 localhost puisque notre installation Ghost et MySQL sont sur le même serveur.
  • Nom d’utilisateur MySQL : Entrez ghost comme 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.

Page d'accueil Ghost

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

Détails de la configuration Ghost

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.

Suggestions de l'installateur Ghost

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.

Tableau de bord Admin 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.

Panneau des posts Ghost

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

Paramètres de la newsletter par e-mail Ghost

Cliquez sur le lien Configuration Mailgun pour développer.

Remplissez votre région Mailgun, domaine et clé API.

Paramètres de la newsletter MailGun Ghost

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.

Option Publier/Email Ghost

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

Confirmer l'envoi de la newsletter Ghost

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

Message de livraison réussie de la newsletter Ghost

Vérifiez votre e-mail pour le post.

E-mail de newsletter Ghost

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

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.