Guide de déploiement

Migrer de Ghost(Pro) vers Ghost auto-hébergé sur VPS

Déployer sur un VPS Cloud →

Tutoriel

Migrer de Ghost(Pro) vers Ghost auto-hébergé sur VPS

Self-hosting11 min de lecture10 étapes

Ghost(Pro) facture selon le nombre de membres : chaque palier franchi relève l'abonnement, et une agence qui porte plusieurs publications paie autant d'abonnements que de sites. Ghost étant open source, la même publication peut tourner sur votre propre serveur, avec le même format d'export. Le risque n'est pas l'import du contenu, mais ce qui l'entoure : les images, les abonnements Stripe, l'envoi des newsletters et la bascule du domaine. Ce guide traite ces quatre points, étape par étape, avec un retour arrière possible tant que Ghost(Pro) reste actif.

Sommaire· Pourquoi quitter Ghost(Pro), et ce que vous laissez derrière vous1/11
  1. 01Pourquoi quitter Ghost(Pro), et ce que vous laissez derrière vous
  2. 02Ce que vous récupérez en sortant de Ghost(Pro)
  3. 03Ce qui change poste par poste
  4. 04Prérequis chiffrés avant de toucher à Ghost(Pro)
  5. 05La migration en dix étapes, de l'inventaire à la bascule
  6. 06Abonnements Stripe : ce qui se transfère, et ce qu'il faut tester
  7. 07Newsletters : le trou de l'e-mail à combler
  8. 08La bascule DNS, avec une coupure réduite au minimum
  9. 09Sauvegarder dès le premier jour
  10. 10Dépannage : les erreurs les plus fréquentes
  11. 11Pour une agence : regrouper les publications de ses clients

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 content et 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

PosteGhost(Pro)Ghost auto-hébergé
TarificationPar formule, plafonnée en nombre de membresPrix du serveur, quel que soit le nombre de membres
Envoi des newslettersInclus, sans configurationCompte Mailgun obligatoire, facturé à part
E-mails de connexion des membresInclusServeur SMTP à configurer
Mises à jour de GhostAppliquées par l'éditeurÀ votre charge
SauvegardesGérées par l'éditeurBase MySQL et dossier `content` à sauvegarder vous-même
Thème personnaliséSelon la formuleToujours possible
Commission sur les abonnementsAucune côté Ghost sur les formules payantesAucune ; 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

  1. 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.txt
  2. Baisser 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.

  3. 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.yaml et redirects.yaml. Vérifiez la présence de chaque fichier avant de continuer.

  4. 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.txt

    Téléchargez ensuite chaque fichier en conservant l'arborescence content/images/… : l'importeur de Ghost attend ce chemin.

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

  6. Importer le contenu, le thème et les redirections

    Dans Settings → Advanced → Import/Export, importez un .zip qui contient export.json et le dossier content/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.zip

    Puis activez-le, et téléversez redirects.yaml et routes.yaml dans Settings → Labs.

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

  8. Brancher l'e-mail : SMTP et Mailgun

    Configurez le bloc mail de config.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.

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

  10. 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/content

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

Vos publications Ghost, regroupées sur vos serveurs

Un seul espace pour les domaines, les VPS et les échéances de renouvellement de tout votre portefeuille de publications. L'option d'administration VPS porte sur l'exploitation du serveur, pas sur la migration elle-même : vous gérez la relation avec vos clients, nous tenons l'infrastructure.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet