Pourquoi quitter Ghost(Pro), et ce que vous laissez derrière vous
La grille de Ghost(Pro) est indexée sur l'audience : chaque formule plafonne le nombre de membres, et Ghost vous invite à monter de formule quand la publication grandit. Pour un éditeur seul, c'est un coût lisible. Pour une agence qui opère la newsletter ou le média de cinq clients, c'est cinq abonnements qui suivent chacun leur propre courbe. La formule d'entrée exclut aussi les thèmes personnalisés et les intégrations sur mesure.
Auto-héberger règle ces deux points : un serveur porte plusieurs publications, et vous installez le thème et les intégrations que vous voulez.
Il faut être honnête sur l'autre colonne. Ghost(Pro) inclut l'envoi des newsletters, avec une délivrabilité déjà configurée, les mises à jour, les sauvegardes et le support de l'éditeur. En partant, vous reprenez chacune de ces tâches. Ce n'est pas un chantier insurmontable, mais c'est un coût réel, à chiffrer avant la décision et non à découvrir après.
Ce que vous récupérez en sortant de Ghost(Pro)
- Un coût qui ne suit plus l'audience — le serveur se dimensionne sur le trafic et le volume d'images, pas sur le nombre de membres inscrits.
- Plusieurs publications sur une même machine — une agence regroupe ses instances Ghost sur un ou deux VPS au lieu d'empiler les abonnements.
- Thèmes et intégrations sans restriction de formule — thème sur mesure, webhooks, outils d'analyse ou de recherche branchés directement sur le serveur.
- La main sur les données — base MySQL, dossier
contentet sauvegardes vous appartiennent ; vous choisissez leur emplacement et leur rétention. - Le même format de bout en bout — de Ghost vers Ghost, l'import est natif : aucun convertisseur, aucune réécriture des articles.
- Un calendrier de mises à jour choisi — vous testez une nouvelle version sur une copie avant de l'appliquer à la publication en ligne.
Ce qui change poste par poste
Faites défiler le tableau
| Poste | Ghost(Pro) | Ghost auto-hébergé |
|---|---|---|
| Tarification | Par formule, plafonnée en nombre de membres | Prix du serveur, quel que soit le nombre de membres |
| Envoi des newsletters | Inclus, sans configuration | Compte Mailgun obligatoire, facturé à part |
| E-mails de connexion des membres | Inclus | Serveur SMTP à configurer |
| Mises à jour de Ghost | Appliquées par l'éditeur | À votre charge |
| Sauvegardes | Gérées par l'éditeur | Base MySQL et dossier `content` à sauvegarder vous-même |
| Thème personnalisé | Selon la formule | Toujours possible |
| Commission sur les abonnements | Aucune côté Ghost sur les formules payantes | Aucune ; seuls les frais Stripe s'appliquent |
Prérequis chiffrés avant de toucher à Ghost(Pro)
Serveur : prévoyez 2 vCPU et 2 Go de RAM pour une publication, 4 Go si vous regroupez deux ou trois instances ou si la liste dépasse quelques dizaines de milliers de membres. Le disque se calcule sur vos médias : relevez la taille du dossier d'images, doublez-la pour les sauvegardes locales, ajoutez 10 Go pour le système.
Base de données : MySQL 8, et non MariaDB. La documentation officielle de Ghost est sans ambiguïté : MySQL 8 est la seule base supportée en production, et Ghost recommande de quitter MariaDB. Le moteur ne change rien à l'export JSON, mais l'instance cible, elle, doit tourner sur MySQL 8.
Version : l'instance cible doit être de version égale ou supérieure à celle de Ghost(Pro). Relevez la version affichée dans Ghost Admin avant d'installer quoi que ce soit.
Comptes et accès : l'accès propriétaire au compte Stripe connecté à la publication, un compte Mailgun pour les newsletters, un relais SMTP pour les e-mails de connexion, et l'accès à la zone DNS du domaine.
L'installation elle-même n'est pas répétée ici : suivez notre guide d'installation de Ghost sur VPS, puis revenez à l'étape 5.
La migration en dix étapes, de l'inventaire à la bascule
Relever l'état de référence
Avant tout export, notez ce que la migration devra retrouver : nombre d'articles publiés, de pages, de membres gratuits, payants et offerts (filtres de la vue Membres de Ghost Admin), version de Ghost et liste des URL du sitemap. Gardez cette liste dans un fichier :
curl -s https://votre-domaine.com/sitemap-posts.xml | grep -o '<loc>[^<]*' | sed 's/<loc>//' > urls-avant.txt wc -l urls-avant.txtBaisser le TTL du domaine
Dans la zone DNS, ramenez le TTL des enregistrements du domaine de la publication à 300 secondes, au moins 24 heures avant la bascule. C'est ce qui permet, le jour venu, de changer d'adresse IP en quelques minutes et de revenir en arrière aussi vite.
Exporter tout le contenu
Dans Ghost Admin, ouvrez Settings → Advanced → Import/Export, onglet Export, et choisissez All data. L'archive contient
export.json(contenu et réglages),members.csv, les thèmes installés en.zip,routes.yamletredirects.yaml. Vérifiez la présence de chaque fichier avant de continuer.Récupérer les images et les médias
La documentation de Ghost le précise : les images ne sont pas dans l'export. Sur Ghost(Pro), vous n'avez pas d'accès au serveur ; deux voies existent. Demandez au support Ghost(Pro) l'archive du dossier
content/images, ou reconstituez-la à partir des URL publiques présentes dans l'export :grep -o '/content/images/[^"\\]*' export.json | sort -u > images.txt wc -l images.txtTéléchargez ensuite chaque fichier en conservant l'arborescence
content/images/…: l'importeur de Ghost attend ce chemin.Installer l'instance cible sur un sous-domaine de test
Installez Ghost sur le VPS en lui donnant une URL provisoire, par exemple
https://nouveau.votre-domaine.com, avec MySQL 8 et une version au moins égale à la source. La publication de production reste servie par Ghost(Pro) pendant tout ce temps : vos lecteurs ne voient rien.Importer le contenu, le thème et les redirections
Dans Settings → Advanced → Import/Export, importez un
.zipqui contientexport.jsonet le dossiercontent/images: l'importeur accepte JSON et zip, et une archive d'images volumineuse se découpe en plusieurs zip. Vérifiez ensuite le thème avant de le téléverser :npx gscan -z mon-theme.zipPuis activez-le, et téléversez
redirects.yamletroutes.yamldans Settings → Labs.Connecter le même compte Stripe, puis importer les membres
Ghost demande de connecter le même compte Stripe que la publication d'origine avant d'importer les membres payants. Importez d'abord un échantillon de cinq à dix membres payants, contrôlez leur formule et leur abonnement dans la fiche membre, puis importez le reste de
members.csv.Brancher l'e-mail : SMTP et Mailgun
Configurez le bloc
maildeconfig.production.json(ou les variables d'environnement équivalentes en Docker) avec votre relais SMTP, pour les e-mails de connexion. Saisissez ensuite les clés API Mailgun dans les réglages Email newsletter de Ghost Admin. Testez les deux : un lien de connexion reçu sur une adresse interne, puis une newsletter de test envoyée à un libellé interne.Comparer avant et après
Comptez les articles et les membres sur la nouvelle instance :
mysql -u ghost -p ghost_prod -e "SELECT status, COUNT(*) FROM posts GROUP BY status; SELECT status, COUNT(*) FROM members GROUP BY status;"Les chiffres doivent égaler ceux de l'étape 1. Ouvrez dix articles au hasard, images comprises, et cherchez toute trace de l'ancien hôte dans le code source des pages.
Basculer le domaine et garder Ghost(Pro) en recouvrement
Remplacez l'URL provisoire par le domaine définitif dans la configuration, redémarrez Ghost, puis modifiez l'enregistrement DNS. Rejouez le sitemap et vérifiez que chaque ancienne URL répond 200 :
while read u; do echo "$(curl -s -o /dev/null -w '%{http_code}' "$u") $u"; done < urls-avant.txt | grep -v '^200'Gardez l'abonnement Ghost(Pro) actif une à deux semaines. Pour le transactionnel de plusieurs publications, voyez notre guide du relais SMTP sur VPS.
Abonnements Stripe : ce qui se transfère, et ce qu'il faut tester
L'export des membres porte, pour chaque membre payant, son identifiant client Stripe (stripe_customer_id). L'importeur sait aussi le retrouver lui-même : avec la valeur auto, Ghost cherche dans le compte Stripe connecté un client portant la même adresse e-mail. D'où la condition posée par la documentation : la nouvelle instance doit être branchée sur le même compte Stripe avant l'import. Un autre compte ne contient pas ces clients, et vos abonnés payants arriveraient comme membres gratuits.
Les abonnements eux-mêmes restent chez Stripe : la migration ne les annule pas et ne demande aucune re-souscription. La documentation ne détaille pas, en revanche, la manière dont chaque abonnement retrouve sa formule sur la nouvelle instance. C'est la raison de l'échantillon de l'étape 7 : vérifiez sur quelques fiches que la formule, l'échéance et le statut payant sont justes avant d'importer toute la liste.
Après la bascule, ouvrez les points de terminaison webhook dans le tableau de bord Stripe. Celui de la nouvelle instance doit recevoir les événements ; celui de Ghost(Pro) ne se retire qu'à la fermeture de l'ancien abonnement.
Newsletters : le trou de l'e-mail à combler
C'est le point que la plupart des migrations découvrent trop tard. Sur Ghost(Pro), l'envoi des newsletters est inclus. En auto-hébergé, la documentation de Ghost est explicite : Mailgun est le seul fournisseur d'envoi en masse supporté, et un simple serveur SMTP ne peut pas envoyer les newsletters. Le SMTP ne sert qu'aux e-mails de connexion et aux invitations.
Il vous faut donc deux canaux : un relais SMTP pour le transactionnel, et un compte Mailgun pour la diffusion. Côté coût, Mailgun a retiré ou rendu difficile d'accès son plan Flex pour les nouveaux comptes : vérifiez la grille actuelle sur le site de Mailgun avant de chiffrer, en fonction du nombre d'envois mensuels (membres abonnés multipliés par la fréquence de publication).
Préparez enfin l'authentification du domaine d'envoi : les enregistrements SPF et DKIM fournis par Mailgun s'ajoutent à la zone DNS avant le premier envoi réel. Une newsletter partie depuis un domaine non authentifié atterrit en spam, et c'est la réputation du domaine entier qui en pâtit.
La bascule DNS, avec une coupure réduite au minimum
La coupure se joue sur deux éléments : la propagation DNS et le certificat TLS. Le TTL abaissé à l'étape 2 règle le premier. Pour le second, deux options. Si votre serveur obtient son certificat par défi HTTP (Caddy dans l'installation Docker officielle de Ghost, certbot avec nginx), il ne peut le faire qu'une fois le DNS basculé : comptez quelques secondes à quelques minutes d'erreurs TLS. Si votre DNS le permet, un défi DNS-01 émet le certificat avant la bascule et supprime cette fenêtre.
Choisissez un créneau de faible trafic, et n'envoyez aucune newsletter le jour même. Une publication programmée sur Ghost(Pro) partirait encore depuis l'ancienne instance : suspendez les envois programmés avant l'export.
Tant que Ghost(Pro) reste actif, le retour arrière consiste à remettre l'ancien enregistrement DNS. C'est votre filet. Ne fermez l'abonnement qu'après une semaine sans écart sur les comptages, les webhooks Stripe et la délivrabilité.
Sauvegarder dès le premier jour
Ghost(Pro) sauvegardait pour vous ; c'est désormais votre rôle. Planifiez au minimum un dump quotidien de la base et une copie du dossier content, vers un stockage hors du VPS :
mysqldump --single-transaction -u ghost -p ghost_prod | gzip > /backup/ghost-$(date +%F).sql.gz
tar czf /backup/content-$(date +%F).tar.gz /var/www/ghost/contentFermez au pare-feu tout port autre que 22, 80 et 443, et testez une restauration complète sur une machine vierge au moins une fois par trimestre.
Dépannage : les erreurs les plus fréquentes
413 Request Entity Too Large à l'import : nginx refuse l'archive. Augmentez client_max_body_size dans le bloc server (par exemple 200m), rechargez nginx, ou découpez les images en plusieurs zip.
Images cassées après l'import : l'archive ne respectait pas le chemin content/images/…, ou certains fichiers manquent. Comparez images.txt au contenu du dossier sur le serveur et réimportez les manquants.
Membres payants importés comme gratuits : Stripe n'était pas connecté au moment de l'import, ou il s'agissait d'un autre compte. Connectez le bon compte et réimportez les membres concernés.
Lien de connexion jamais reçu : le bloc mail est absent ou erroné. Consultez les journaux de Ghost (ghost log, ou docker compose logs ghost) au moment de la demande de connexion.
Option d'envoi par e-mail absente à la publication : Mailgun n'est pas configuré. Le SMTP ne suffit pas pour les newsletters ; saisissez les clés API Mailgun dans Email newsletter.
Pour une agence : regrouper les publications de ses clients
La migration d'une publication prend une demi-journée de préparation et une heure de bascule. La deuxième se fait plus vite, parce que le serveur, le relais SMTP et la méthode existent déjà. C'est là que l'auto-hébergement devient rentable pour une agence : plusieurs instances Ghost sur un même VPS, chacune avec sa base et son domaine, et une seule facture d'infrastructure.
Sur ServOrbit, les VPS démarrent à 99 DH/mois hors taxes (HT), avec accès root et IPv4 dédiée, et vos domaines, serveurs et renouvellements sont suivis au même endroit. Si la question reste « qui tient le serveur ? », l'option d'administration VPS y répond : vous gérez la relation éditoriale avec vos clients, nous tenons l'infrastructure.
Ce guide est fourni tel quel : ServOrbit ne réalise pas la migration de votre publication Ghost(Pro) ; l'administration VPS porte sur le serveur, pas sur cette bascule.