Héberger Ghost sur un VPS infogéré, c'est publier vos articles, réunir vos membres et envoyer vos newsletters depuis une machine à vous, que nos équipes tiennent à jour et supervisent jour et nuit. Ghost est un logiciel libre sous licence MIT. Ce guide suit sa documentation officielle : Ghost-CLI ou Docker Compose, MySQL, HTTPS, les e-mails, les sauvegardes et les mises à jour.
Par Simon Vasconcelos Lee
Publié le 9 novembre 2026Lecture : 13 minutes
content, puis mettez à jour avec ghost update ou docker compose pull : le projet publie des mises à jour chaque semaine.Ghost est une plateforme de publication professionnelle et libre, écrite pour Node.js. Elle réunit au même endroit ce qu'une publication indépendante assemble souvent à partir de plusieurs outils.
Selon la documentation, le produit a les mêmes fonctions en auto-hébergement. Ce qui l'entoure vous revient : l'envoi des newsletters, l'analytique web, un CDN et les sauvegardes complètes du site.
Ghost est publié sous licence MIT. Elle autorise à utiliser, copier, modifier, fusionner, publier, distribuer, sous-licencier et vendre le logiciel, à une condition : garder la mention de copyright et le texte de la licence dans toute copie. Vous pouvez donc faire tourner Ghost en entreprise, l'adapter et y publier pour vos clients, sans licence à acheter.
La licence couvre le code. Le nom et le logo appartiennent à Ghost Foundation et relèvent de sa politique de marque : lisez-la si vous construisez une offre autour du logiciel. Ghost est une marque déposée de Ghost Foundation.
This publication is independent of and not affiliated with, authorized, sponsored, or approved by Ghost Foundation. En français : cette publication est indépendante de Ghost Foundation et n’est ni affiliée à elle, ni autorisée, ni parrainée, ni approuvée par elle.
Le projet documente deux chemins pour la production. Ghost-CLI est l'installation qu'il recommande officiellement, et Docker Compose est une « preview », qu'il dit toute nouvelle. Il indique aussi avancer vers cet outillage Docker plutôt que de faire évoluer Ghost-CLI, et il fournit un assistant pour passer de l'un à l'autre.
| Point | Ghost-CLI | Docker Compose (preview) |
|---|---|---|
| Système | Ubuntu 22.04, 24.04 ou 26.04 | Un serveur Linux avec Docker 20.10.13 ou plus récent |
| Mémoire | Au moins 1 Go | Le projet cite en exemple un serveur de 2 Go et 1 processeur |
| Serveur web et HTTPS | Nginx et un certificat Let’s Encrypt, posés par Ghost-CLI | Caddy, dans un conteneur, qui prend en charge TLS |
| Base de données | MySQL 8.0 ou 8.4 installé sur le serveur | MySQL dans un conteneur |
| Analytique web | Non compatible | Disponible, avec un compte Tinybird |
| Réseau social (ActivityPub) | Le service hébergé par le projet, gratuit dans ses limites d’usage | Le même service par défaut, ou le vôtre, auto-hébergé |
Faites pointer le domaine vers le serveur avant l'installation : le certificat se pose pendant la mise en place. Sur un VPS Simafri, les visiteurs arrivent sur les ports 80 et 443, sous le nom de domaine du serveur, avec des enregistrements A et AAAA. L'adresse du site s'écrit en entier, avec son protocole, comme https://example.com : une adresse IP provoque des erreurs.
Au-delà de la mémoire indiquée ci-dessus, le projet ne chiffre ni le disque ni la charge : la taille dépend de votre trafic, de vos images et de vos médias. Sur un VPS infogéré, décrivez-nous votre publication et nous vous recommandons la taille qui convient.
Ghost-CLI s'emploie avec un utilisateur qui n'est pas root, et dont le nom n'est pas ghost, car ce nom entre en conflit avec l'outil. Créez-le depuis le compte root, en remplaçant user par le nom choisi :
adduser <user>
usermod -aG sudo <user>
su - <user>
Mettez le système à jour, installez Nginx (1.9.5 au minimum pour SSL) et MySQL. La ligne ufw ouvre HTTP et HTTPS si ce pare-feu est actif :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx
sudo ufw allow 'Nginx Full'
sudo apt-get install mysql-server
Sur les versions récentes d'Ubuntu, le compte root de MySQL s'authentifie par socket, ce que Ghost ne prend pas en charge. Donnez-lui un mot de passe :
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<your-new-root-password>';
FLUSH PRIVILEGES;
exit
Ghost demande Node.js 22 : les versions 20, 21, 23 et suivantes ne sont pas prises en charge. Le projet demande de l’installer pour tout le système, de cette façon :
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=22
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt-get update
sudo apt-get install nodejs -y
sudo npm install ghost-cli@latest -g
Ghost s'installe dans son propre dossier, avec un propriétaire et des droits précis. Remplacez sitename par le nom de votre choix :
sudo mkdir -p /var/www/sitename
sudo chown <user>:<user> /var/www/sitename
sudo chmod 775 /var/www/sitename
cd /var/www/sitename
ghost install
La commande pose alors ses questions, et le projet recommande de répondre oui à chaque étape proposée :
https://.localhost pour l’hôte, root et le mot de passe posé plus haut, puis le nom de la base, que Ghost-CLI crée.Le site répond alors, et https://example.com/ghost vous invite à créer le compte du propriétaire. Si l'installation est interrompue, ghost setup reprend la configuration ; si elle échoue, ghost uninstall nettoie mieux que la suppression du dossier. ghost doctor vérifie le système à tout moment.
Le projet présente cette méthode comme une « preview » : elle est toute nouvelle à ses yeux. C'est elle qui permet d'auto-héberger l'analytique web et ActivityPub.
Sur un serveur où Docker est installé, récupérez l'outillage officiel dans /opt/ghost et copiez ses deux fichiers d'exemple :
git clone https://github.com/TryGhost/ghost-docker.git /opt/ghost && cd /opt/ghost
cp .env.example .env
cp caddy/Caddyfile.example caddy/Caddyfile
Dans le fichier .env, renseignez ces valeurs :
DOMAIN : le domaine du site, par exemple example.com.ADMIN_DOMAIN : un domaine séparé pour l’administration, si vous le souhaitez.DATABASE_ROOT_PASSWORD et DATABASE_PASSWORD : deux mots de passe tirés avec openssl rand -hex 32. Ils se fixent une fois pour toutes : la base initialisée, les changer casse la connexion.Dans caddy/Caddyfile, décommentez le bloc qui correspond à votre cas : redirection de www vers le domaine nu, ou l'inverse, ou domaine d'administration séparé. Lancez ensuite Ghost, puis terminez la mise en place sur /ghost :
docker compose pull
docker compose up -d
HTTP_PORT et HTTPS_PORT si Ghost passe derrière un autre proxy inverse. MySQL reste sur le réseau interne des conteneurs.data/ghost et la base dans data/mysql, deux emplacements réglables dans .env.-f compose.yml -f compose.ipv6.yml à vos commandes docker compose up.L'analytique demande un compte Tinybird, service externe. Depuis /opt/ghost, connectez-vous, déployez sa configuration et récupérez les jetons à coller dans .env, section « Tinybird configuration » :
docker compose run --rm tinybird-login
docker compose run --rm tinybird-sync
docker compose run --rm tinybird-deploy
docker compose run --rm tinybird-login get-tokens
ActivityPub fonctionne d'emblée avec le service hébergé par le projet, gratuit dans des limites d'usage que publie sa documentation. Pour auto-héberger le vôtre, décommentez ACTIVITYPUB_TARGET=activitypub:8080. Activez ensuite dans .env le ou les profils voulus, puis relancez les conteneurs :
COMPOSE_PROFILES=analytics,activitypub
docker compose pull
docker compose up -d
Pour ActivityPub, le projet demande de recréer aussi Ghost et Caddy, avec docker compose up -d --force-recreate ghost caddy.
Après le clonage et la configuration, bash scripts/migrate.sh copie le dossier content, importe la base dans le conteneur MySQL et démarre Caddy à la place de Nginx. Il propose d'arrêter Nginx, ce qui met le site hors ligne : répondez non si d'autres sites tournent sur le serveur. Il ne supprime aucune donnée. bash recovery_instructions.sh rétablit le site d'origine si vous interrompez la migration.
L'administration de Ghost doit passer par HTTPS, et le projet recommande HTTPS pour tout le site : sans lui, identifiants et mots de passe circulent en clair. Avec Docker Compose, Caddy s'en charge. Avec Ghost-CLI, l'installation pose le certificat, et une commande le fait après coup :
ghost setup ssl
Pour changer l'adresse d'un site installé avec Ghost-CLI, ghost config url https://example.com met à jour la configuration, et ghost restart l'applique.
Le projet conseille aussi un domaine d'administration séparé, qui réduit la surface d'attaque. Le chemin reste /ghost/. Côté Ghost-CLI, il se déclare dans config.production.json :
"admin": {
"url": "https://admin.example.com"
}
Côté Docker Compose, renseignez ADMIN_DOMAIN, décommentez son bloc dans le Caddyfile et lancez docker compose up -d --force-recreate ghost caddy. Ce domaine a besoin, lui aussi, de ses enregistrements A et AAAA.
MySQL 8 est la seule base que le projet prend en charge en production. Ghost-CLI s'installe avec MySQL 8.0 ou 8.4, et le fichier Compose fournit une image MySQL 8.0.
ghost config database.client, dans le dossier du site, indique la base employée.Ghost distingue deux envois, qui ne passent pas par le même chemin. C'est le point le plus important à régler après l'installation.
| Envoi | Exemples | Ce qui le porte |
|---|---|---|
| Transactionnel | Invitations de l’équipe, mots de passe oubliés, inscriptions et liens de connexion des membres, code de connexion depuis un nouvel appareil | La configuration mail de Ghost, en SMTP |
| Newsletters | Les articles envoyés à vos membres | L’API de Mailgun, dont les clés se saisissent dans les réglages « Email newsletter » |
La documentation classe cette configuration comme requise en production. Ghost envoie aussi un code par e-mail quand il détecte une connexion depuis un nouvel appareil : réglez ce relais avant d'inviter votre équipe.
Sur un VPS Simafri, l'envoi passe par un relais SMTP authentifié, sur le port 587 : l'adresse d'un compte de messagerie que vous avez déjà, ou Simafri Suite.
"mail": {
"transport": "SMTP",
"from": "'Acme Support' <support@example.com>",
"options": {
"host": "smtp.example.com",
"port": 587,
"secure": false,
"requireTLS": true,
"auth": {
"user": "support@example.com",
"pass": "1234567890"
}
}
}
mail__transport=SMTP
mail__options__host=smtp.example.com
mail__options__port=587
mail__options__secure=false
mail__options__requireTLS=true
mail__options__auth__user=support@example.com
mail__options__auth__pass=1234567890
mail__from="'Acme Support' <support@example.com>"
docker compose up -d --force-recreate ghost
secure et requireTLS : Ghost envoie par Nodemailer, dont la documentation demande secure à false sur le port 587, la connexion passant ensuite en STARTTLS. requireTLS refuse l'envoi si ce passage échoue. Le fichier d'exemple du dépôt indique le port 465 et secure=true : remplacez ces deux lignes.from porte une adresse réelle et lue, ce qui améliore la délivrabilité selon le projet, et les enregistrements SPF, DKIM et DMARC du domaine d'envoi complètent le réglage.Le relais SMTP ne couvre pas les newsletters. Selon la documentation, l'envoi en masse ne se fait pas en SMTP et Mailgun est, à ce jour, le seul service d'envoi en masse que Ghost prend en charge. Vous créez votre compte Mailgun et saisissez ses clés d'API dans les réglages de Ghost.
Si vous n'envoyez pas vos articles par e-mail, vous n'avez besoin d'aucun compte Mailgun : ces réglages s'ignorent. Si vous préférez un autre outil de newsletter, le projet propose de synchroniser vos membres vers lui, par exemple avec Zapier ou ses guides d'intégration.
Ghost propose trois niveaux de copie, et ils ne contiennent pas la même chose. Pour reconstruire un site à l'identique, le projet demande de sauvegarder directement la base et le dossier content.
| Méthode | Ce qu’elle contient | Pour quel usage |
|---|---|---|
ghost backup (Ghost-CLI) | Un zip : contenus en JSON, membres en CSV, thèmes, images, fichiers et médias, routes et redirections | La précaution avant une mise à jour |
| Export depuis l’administration | Un zip : contenus et réglages, membres, statistiques des articles, thèmes, routes et redirections, au choix. Ni commentaires, ni historique d’activité des membres, ni médias | Le déplacement du contenu vers un autre site |
Base et dossier content | La totalité des données | La reprise après sinistre, ou une copie exacte |
L'export se trouve dans « Settings », « Advanced », « Import/Export », onglet « Export », bouton « All data ». Pour la copie complète, avec Ghost-CLI, le compte MySQL et le nom de la base à reporter sont dans config.production.json :
mkdir -p ~/ghost-backups
mysqldump -u ghost_user -p ghost_production > ~/ghost-backups/ghost_backup.sql
cd /var/www/sitename
tar czf ~/ghost-backups/ghost_content_backup.tar.gz content/
Avec Docker Compose, l'outillage officiel garde le contenu dans data/ghost. Le dump reprend la forme donnée par l'image MySQL, et le mot de passe root est déjà dans le conteneur. Gardez aussi une copie de .env et du Caddyfile.
cd /opt/ghost
mkdir -p ~/ghost-backups
docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' > ~/ghost-backups/ghost_backup.sql
tar czf ~/ghost-backups/ghost_content_backup.tar.gz data/ghost
cd /var/www/sitename
ghost stop
mysql -u ghost_user -p ghost_production < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
sudo chown -R ghost:ghost content
ghost restart
cd /opt/ghost
docker compose stop ghost
docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
docker compose start ghost
Copiez ces fichiers hors du serveur, avec rsync ou scp, et faites un essai de restauration sur une machine de test. Si vous repartez d'un export avec des membres payants, connectez le même compte Stripe avant d'importer vos membres.
Le projet publie des mises à jour chaque semaine et rappelle qu'un serveur web public doit rester à jour. Lisez les notes de version, puis lancez la commande de votre méthode.
ghost check-update
ghost backup
ghost update
ghost update --rollback revient à la version précédente si une mise à jour tourne mal.content reste en place pendant les mises à jour.ghost update [version] --force avec votre version actuelle, car ses dépendances binaires sont compilées pour une version précise de Node.js.cd /opt/ghost
git pull
docker compose pull
docker compose up -d
docker image prune
La dernière ligne, facultative, retire les anciennes images. Laissez GHOST_VERSION commenté dans .env : fixer une version bloque ces commandes de mise à jour.
La documentation donne plusieurs réglages pour un serveur en production :
mysql_secure_installation après une installation Ghost-CLI réussie.Pour la charge, le projet place un CDN et une couche de cache devant Ghost. Il précise que le clustering et le sharding ne sont pas pris en charge : une seule instance sert le site, et le cache absorbe le trafic.
L'auto-hébergement demande de tenir le serveur en plus de l'application. Sur un VPS infogéré, nos équipes prennent le serveur en main et suivent votre instance de manière proactive ; Ghost reste votre logiciel, avec ses réglages et ses données.
| Sujet | Nos équipes | Vous |
|---|---|---|
| Le serveur | Mises à jour du système et de la sécurité, interventions sur le serveur comprises | Le moment qui convient à votre activité |
| La supervision | Serveur suivi 24 h/24 et 7 j/7, avec intervention sans attendre votre appel | Vos contenus, vos membres et vos abonnements |
| Ghost | Suivi proactif : erreurs, lenteurs et espace disque repérés, correction recommandée | Son installation, ses mises à jour, ses réglages, son relais SMTP et son compte Mailgun, que vous appliquez, vous ou votre assistant IA |
| Les sauvegardes | Chaque nuit, chiffrées et gardées hors de la machine ; restauration comprise | La demande de restauration, quand vous en avez besoin |
| La migration | Votre serveur actuel migré, offert | Le moment de la bascule |
Si vous préférez que nos équipes interviennent dans l'application elle-même, cette prestation se facture à l'heure ou au forfait, avec un chiffrage communiqué avant l'intervention.
Avec un VPS infogéré Simafri, nos équipes tiennent à jour le serveur de votre instance Ghost, le surveillent jour et nuit et interviennent sans attendre votre appel ; elles suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez, vous ou votre assistant IA. Les sauvegardes sont chiffrées chaque nuit et gardées hors de la machine, leur restauration est comprise, et la migration de votre serveur actuel est offerte.
Oui. Ghost est sous licence MIT : vous pouvez l'utiliser en entreprise et l'adapter, en gardant sa mention de licence. Restent les services autour de lui : le serveur, le relais d'e-mails, Mailgun si vous envoyez des newsletters, Tinybird si vous voulez son analytique.
Le projet recommande Ubuntu 22.04, 24.04 ou 26.04, Nginx, Node.js 22, MySQL 8.0 ou 8.4, systemd, au moins 1 Go de mémoire, un domaine et un utilisateur qui n'est pas root. Pour Docker Compose, il cite en exemple un serveur de 2 Go et 1 processeur.
Ghost-CLI est l'installation que le projet recommande pour la production. Docker Compose est une preview, seule à permettre l'analytique web et ActivityPub auto-hébergé, et le projet dit avancer vers cet outillage. Un assistant permet de passer de Ghost-CLI à Docker Compose.
En production, MySQL 8 est la seule base prise en charge. Le projet recommande une réinstallation sur MySQL 8 depuis SQLite, et une migration vers MySQL 8 depuis MariaDB. Sa documentation ne prévoit pas PostgreSQL.
Non. Le SMTP sert aux e-mails transactionnels : invitations, mots de passe, liens de connexion des membres. Les newsletters demandent l'API de Mailgun, seul service d'envoi en masse pris en charge. Sans envoi d'articles par e-mail, aucun compte Mailgun n'est nécessaire.
Pour une reprise complète, sauvegardez la base MySQL avec mysqldump et le dossier content avec tar. La commande ghost backup produit un zip avant une mise à jour. L'export de l'administration laisse de côté les commentaires, l'historique d'activité des membres et les médias.
Avec Ghost-CLI, lancez ghost backup puis ghost update dans le dossier du site, et ghost update --rollback en cas de problème. Avec Docker Compose, lancez git pull, docker compose pull et docker compose up -d dans /opt/ghost.
Un VPS infogéré couvre le serveur : système, sécurité, supervision et sauvegardes. Nos équipes suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez. Une intervention dans l'application se facture à l'heure ou au forfait.
Simafri
Parlons de votre projet
Dites-nous en deux mots ce qu'il vous faut : on revient vers vous rapidement.
Merci ! Votre demande a bien été envoyée. Nous vous répondrons rapidement.
Vous préférez l'email ? Écrivez-nous à support@simafri.com.