Comment déployer Ghost CMS avec Docker en 15 minutes

Comment déployer Ghost CMS avec Docker en 15 minutes

Introduction

Vous avez entendu parler de Ghost CMS — la plateforme de blogging moderne, rapide et centrée sur la publication — et vous voulez l'héberger vous-même ? Bonne nouvelle : avec Docker, vous pouvez avoir un blog Ghost 5 entièrement fonctionnel en moins de 15 minutes sur votre propre serveur.

Dans ce tutoriel, je vous montre exactement comment j'ai déployé le blog de BOTUM (blog.botum.ca) avec Ghost 5, Docker Compose, Zoraxy comme reverse proxy SSL, et Cloudflare pour le DNS. Pas de bullshit — juste les commandes réelles, les fichiers réels, les décisions réelles.

Points clés à retenir

  • Ghost 5 tourne dans un conteneur Docker léger — zéro dépendance système à installer.
  • Un fichier docker-compose.yml suffit pour définir tout l'environnement.
  • Le reverse proxy (Zoraxy ou Nginx) gère HTTPS — Ghost n'a pas besoin de connaître les certificats.
  • Les données persistent dans /mnt/docker-data/ghost-blog/ — survivent aux mises à jour.
  • Cloudflare DDNS + CNAME blog.botum.ca → botum.ca assure la résolution DNS sans IP fixe.

Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Un serveur Linux (Ubuntu 22.04+ recommandé) avec accès SSH
  • Docker et Docker Compose installés (docker compose v2)
  • Un nom de domaine — ici blog.botum.ca via Cloudflare
  • Un reverse proxy avec SSL — ici Zoraxy (ou Nginx, Traefik, Caddy)
  • Un utilisateur non-root avec accès sudo
  • Ports 80 et 443 ouverts sur le pare-feu

Étape 1 — Créer la structure de répertoires

Ghost a besoin d'un espace persistant pour ses fichiers (thèmes, images, DB SQLite). On crée la structure sur le disque hôte :

mkdir -p /mnt/docker-data/ghost-blog/content
# Le dossier content contiendra : data/, images/, themes/, adapters/

Pourquoi /mnt/ ? Sur ce serveur, /mnt/ est monté sur un disque séparé — les données Ghost survivent ainsi à une réinstallation du système.

Docker - Container platform
Docker

Étape 2 — Créer le fichier docker-compose.yml

Créez le fichier de configuration Docker Compose. Ce fichier définit le conteneur Ghost, les variables d'environnement et les volumes persistants :

nano /mnt/docker-data/ghost-blog/docker-compose.yml
services:
  ghost-blog:
    image: ghost:5
    container_name: ghost-blog
    restart: unless-stopped
    ports:
      - "4598:4598"
    environment:
      url: https://blog.botum.ca
      NODE_ENV: production
    volumes:
      - /mnt/docker-data/ghost-blog/content:/var/lib/ghost/content
      - /mnt/docker-data/ghost-blog/config.production.json:/var/lib/ghost/config.production.json

Points importants : restart: unless-stopped redémarre automatiquement le conteneur au reboot. La variable url doit correspondre exactement à l'URL publique finale avec HTTPS — Ghost l'utilise pour générer tous ses liens internes.

Étape 3 — Créer config.production.json

Ghost lit sa configuration depuis ce fichier JSON. Créez-le avant de démarrer le conteneur :

{
  "url": "https://blog.botum.ca",
  "server": {
    "port": 4598,
    "host": "0.0.0.0"
  },
  "database": {
    "client": "sqlite3",
    "connection": {
      "filename": "/var/lib/ghost/content/data/ghost.db"
    }
  },
  "mail": {
    "transport": "Direct"
  },
  "logging": {
    "transports": ["stdout"]
  },
  "process": "local",
  "paths": {
    "contentPath": "/var/lib/ghost/content"
  }
}

Étape 4 — Lancer Ghost avec Docker Compose

Démarrez le conteneur en arrière-plan :

cd /mnt/docker-data/ghost-blog
docker compose up -d
Commandes Docker en ligne de commande
Lancement de Ghost CMS avec docker-compose up -d

Vérifiez que le conteneur tourne :

docker ps | grep ghost-blog
# Attendu : ghost-blog   Up X minutes   0.0.0.0:4598->4598/tcp

# Consultez les logs si besoin :
docker logs ghost-blog --tail 50

Ghost effectue ses migrations de base de données au premier démarrage — attendez 30 à 60 secondes avant de tester.

Étape 5 — Configurer le DNS Cloudflare

Dans le dashboard Cloudflare, configurez :

Cloudflare DNS configuration
Cloudflare
  • Un enregistrement A botum.ca → IP publique de votre serveur (activez Cloudflare Proxy ☁️)
  • Un enregistrement CNAME blog → botum.ca (proxié)
  • Optionnel : DDNS automatique via un script ou l'addon Cloudflare DDNS si votre IP change

Résultat : blog.botum.ca résout vers l'IP de votre serveur via Cloudflare, avec protection DDoS et cache CDN gratuits.

Étape 6 — Configurer Zoraxy comme reverse proxy SSL

Zoraxy est un reverse proxy moderne avec interface web et gestion SSL automatique (Let's Encrypt). Dans l'interface Zoraxy, ajoutez une règle de proxy :

  • Domaine entrant : blog.botum.ca
  • Destination : http://localhost:4598 (ou l'IP interne du serveur)
  • SSL : activé — Zoraxy génère automatiquement le certificat Let's Encrypt
  • HTTPS redirect : activé

Ghost tourne sur le port 4598 en HTTP simple — Zoraxy se charge de la terminaison TLS. C'est la séparation des responsabilités : Ghost fait du contenu, Zoraxy fait la sécurité.

Ghost CMS - Plateforme de publication moderne
Ghost CMS — une plateforme de publication open-source moderne

Étape 7 — Première connexion et configuration Ghost

Accédez à https://blog.botum.ca/ghost pour créer votre compte administrateur. Complétez l'assistant de configuration initiale :

  • Nom du blog, description
  • Compte administrateur (email + mot de passe solide)
  • Thème — le thème Source est installé par défaut sur Ghost 5

Votre blog Ghost est maintenant opérationnel. Testez l'accès public sur https://blog.botum.ca — vous devriez voir la page d'accueil Ghost.

Commandes utiles pour la maintenance

# Mettre à jour Ghost vers la dernière version 5.x
docker compose pull && docker compose up -d

# Sauvegarder la base de données SQLite
cp /mnt/docker-data/ghost-blog/content/data/ghost.db ~/backup-ghost-$(date +%Y%m%d).db

# Voir les logs en temps réel
docker logs ghost-blog -f

# Redémarrer Ghost sans perdre les données
docker compose restart ghost-blog

Conclusion

En moins de 15 minutes, vous avez un blog Ghost 5 self-hosted, sécurisé avec HTTPS, accessible publiquement via Cloudflare et Zoraxy. Vos données sont persistantes, le conteneur redémarre automatiquement, et les mises à jour se font en deux commandes.

Les prochaines étapes : configurer l'envoi d'emails (Mailgun ou SMTP), installer un thème personnalisé, activer les membres et abonnements Ghost, et mettre en place des sauvegardes automatiques de la DB.

Passez à l'action

Si ce tutoriel vous a été utile, abonnez-vous au blog BOTUM pour recevoir les prochains articles sur l'auto-hébergement, Docker, et les outils open-source. Des questions sur votre configuration ? Laissez un commentaire ci-dessous — je réponds à chaque message.

📥 Guide PDF complet

Téléchargez ce guide en PDF pour le consulter hors ligne.

⬇ Télécharger le guide (PDF)

🚀 Aller plus loin avec BOTUM

Ce guide couvre les bases. En production, chaque environnement a ses spécificités. Les équipes BOTUM accompagnent les organisations dans le déploiement, la configuration avancée et la sécurisation de leur infrastructure. Si vous avez un projet, parlons-en.

Discuter de votre projet →
📋 Série Infrastructure Proxmox : Voir la série complète →
Série Infrastructure Proxmox