Héberger Ghost : votre blog et newsletter (alternative à Substack et Medium)
Bâtir son audience sur Substack ou Medium, c'est dépendre de leur plateforme. Ghost réunit blog rapide, newsletter et abonnements sur votre propre domaine. Voici comment l'héberger.
Publier sur Substack ou Medium est simple, mais votre audience, votre distribution et votre image restent dépendantes d’une plateforme tierce. Un changement de règles, d’algorithme ou de commission peut affecter directement votre activité. En auto-hébergeant votre site, vous conservez le contrôle de votre contenu, de votre domaine et de vos données membres.
Ghost est une plateforme de publication open source conçue pour les créateurs, indépendants et entreprises. Elle réunit un blog rapide, une newsletter par email, un système de membres et des abonnements payants dans une interface plus spécialisée que WordPress.
Héberger Ghost sur une infrastructure française comme TalCloud permet aussi de rapprocher les données de votre audience, avec des serveurs en France, du stockage NVMe, une protection Anti-DDoS Netrix et un support humain. Les offres VPS TalCloud démarrent à 4,99 € par mois.
Ce que Ghost apporte à une stratégie de contenu
Ghost fournit un éditeur moderne centré sur la rédaction. Il permet d’intégrer des images, des vidéos, des boutons, des appels à l’action, des contenus réservés aux membres et différents formats éditoriaux sans multiplier les extensions.
La plateforme comprend notamment :
- un site de publication performant ;
- des thèmes personnalisables ;
- des fonctions SEO intégrées, comme les métadonnées, les URL canoniques et les sitemaps ;
- des membres gratuits ou payants ;
- une ou plusieurs newsletters ;
- un portail permettant aux membres de gérer leur compte ;
- des abonnements récurrents via Stripe ;
- une API pour connecter Ghost à d’autres outils.
Contrairement à un WordPress généraliste, Ghost se concentre sur la publication et les abonnements. Cette spécialisation réduit le nombre de composants à maintenir et facilite la création d’un média, d’une newsletter professionnelle ou d’un espace éditorial réservé aux clients.
L’auto-hébergement ne supprime cependant pas les prestataires tiers. Stripe reste nécessaire pour encaisser les abonnements payants. Pour les newsletters volumineuses, un service spécialisé dans l’envoi en masse est également recommandé.
Prérequis pour auto-héberger Ghost
Une installation de production demande :
- un VPS Linux avec Docker et Docker Compose (voir installer Docker sur un VPS) ;
- un nom de domaine ou sous-domaine ;
- un enregistrement DNS pointant vers l’adresse IP du serveur ;
- une base MySQL 8 ;
- un reverse proxy pour terminer les connexions HTTPS ;
- un fournisseur SMTP pour les emails transactionnels ;
- un service adapté aux newsletters envoyées en masse ;
- une méthode de sauvegarde externe.
Ghost doit connaître son URL publique exacte. Si le site répond sur https://blog.exemple.fr, cette même valeur doit être définie dans la variable url. Une incohérence entre HTTP, HTTPS ou le domaine peut provoquer des redirections incorrectes et des problèmes dans les liens générés.
Déployer Ghost avec Docker Compose
Créez un répertoire dédié, puis placez-y un fichier compose.yaml. L’exemple suivant expose Ghost uniquement sur l’interface locale du serveur. Le port 2368 ne sera donc pas directement accessible depuis Internet : le reverse proxy s’y connectera localement.
services:
ghost:
image: ghost:6-alpine
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
ports:
- "127.0.0.1:2368:2368"
environment:
url: https://blog.exemple.fr
database__client: mysql
database__connection__host: mysql
database__connection__port: 3306
database__connection__user: ghost
database__connection__password: ${MYSQL_GHOST_PASSWORD}
database__connection__database: ghost
mail__transport: SMTP
mail__from: "Mon Blog <newsletter@blog.exemple.fr>"
mail__options__host: ${SMTP_HOST}
mail__options__port: 587
mail__options__secure: "false"
mail__options__auth__user: ${SMTP_USER}
mail__options__auth__pass: ${SMTP_PASSWORD}
volumes:
- ghost_content:/var/lib/ghost/content
mysql:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: ${MYSQL_GHOST_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -p$$MYSQL_ROOT_PASSWORD"]
interval: 10s
timeout: 5s
retries: 10
volumes:
ghost_content:
mysql_data:
Placez les secrets dans un fichier .env situé à côté du fichier Compose :
MYSQL_GHOST_PASSWORD=mot_de_passe_long_et_unique
MYSQL_ROOT_PASSWORD=autre_mot_de_passe_long_et_unique
SMTP_HOST=smtp.exemple.fr
SMTP_USER=utilisateur_smtp
SMTP_PASSWORD=secret_smtp
Protégez ce fichier et ne l’ajoutez jamais à un dépôt Git. Démarrez ensuite les services :
docker compose up -d
docker compose ps
docker compose logs --tail=100 ghost
Dans un environnement sensible, utilisez une balise d’image Ghost correspondant à une version précise et testée, plutôt qu’une balise flottante. Cela rend les mises à jour reproductibles et limite les changements inattendus.
Effectuer la configuration initiale
Une fois le reverse proxy et le certificat HTTPS opérationnels, ouvrez l’adresse suivante :
https://blog.exemple.fr/ghost
L’assistant vous invite à créer le compte propriétaire, nommer le site et définir les premiers paramètres. Utilisez une adresse email réellement accessible, car elle servira aux notifications et à la récupération du compte.
Vérifiez ensuite le titre, la description, la langue, le fuseau horaire, l’identité visuelle et les informations d’expéditeur. Avant d’importer une audience existante, publiez un article de test et contrôlez son affichage sur ordinateur et mobile.
Configurer correctement l’envoi des emails
Il faut distinguer deux catégories d’emails.
Les emails transactionnels sont déclenchés individuellement : connexion d’un membre, lien d’authentification, confirmation ou notification. Un relais SMTP correctement configuré convient généralement à cet usage. Les variables mail__* du fichier Compose définissent ce transport.
Une newsletter envoyée à plusieurs milliers de membres répond à d’autres contraintes : débit, réputation d’expéditeur, gestion des rebonds, plaintes, désabonnements et délivrabilité. Un SMTP basique fourni avec une boîte mail n’est pas forcément conçu pour ces volumes et peut suspendre les envois.
Pour les newsletters en masse, Ghost recommande Mailgun. Sur une instance auto-hébergée, configurez dans Ghost le domaine d’envoi et les identifiants Mailgun nécessaires à l’envoi bulk. D’autres services peuvent convenir aux emails transactionnels, mais cela ne signifie pas qu’ils remplacent automatiquement l’intégration attendue par Ghost pour les newsletters massives.
Quel que soit le fournisseur, ajoutez dans le DNS les enregistrements SPF, DKIM et, idéalement, DMARC demandés. Testez la réception auprès de plusieurs messageries avant d’envoyer une campagne réelle.
Activer les membres et les abonnements payants
Ghost peut proposer plusieurs niveaux d’accès :
- visiteurs anonymes ;
- membres gratuits ;
- membres payants ;
- contenus accessibles à un niveau d’abonnement précis.
Activez les membres dans l’administration, puis configurez le portail membres. Ce portail permet l’inscription, la connexion par lien envoyé par email et la gestion de l’abonnement.
Les paiements passent par Stripe, qui reste un prestataire tiers. Vous devez connecter un compte Stripe, compléter les vérifications demandées et définir vos offres dans Ghost. Testez tout le parcours avant l’ouverture : souscription, email de connexion, accès au contenu réservé, changement d’offre et résiliation.
L’hébergement en France améliore la maîtrise de l’emplacement du serveur, mais ne rend pas seul l’ensemble du service conforme au RGPD. Documentez les traitements, limitez les données collectées, encadrez les prestataires externes et fournissez une politique de confidentialité adaptée.
Choisir et personnaliser un thème
Ghost inclut un thème par défaut, mais vous pouvez installer un thème compatible depuis l’administration. Les fichiers de thème et les images sont stockés dans le volume monté sur /var/lib/ghost/content.
Commencez par personnaliser les couleurs, le logo, la typographie, la navigation et les modèles disponibles. Pour des modifications avancées, dupliquez le thème avant de l’éditer. Modifier directement un thème tiers complique les futures mises à jour.
Contrôlez également la vitesse d’affichage, l’accessibilité, les métadonnées sociales, les pages d’archives et le rendu des contenus réservés. Un design sobre sert souvent mieux une publication que l’accumulation de scripts externes.
Publier Ghost derrière un reverse proxy HTTPS
Utilisez Nginx, Caddy ou Traefik pour recevoir le trafic public sur les ports 80 et 443, gérer le certificat TLS et transmettre les requêtes vers :
http://127.0.0.1:2368
Le proxy doit transmettre les en-têtes indiquant le nom d’hôte et le protocole d’origine. La variable url de Ghost doit correspondre exactement à l’adresse HTTPS publique.
N’exposez ni MySQL ni le port interne de Ghost sur toutes les interfaces réseau. Seuls les ports nécessaires au reverse proxy et à l’administration du serveur doivent être ouverts par le pare-feu.
Sécuriser et mettre à jour l’installation
Utilisez des mots de passe uniques, désactivez les accès inutiles et protégez SSH avec des clés. Maintenez le système, Docker, le reverse proxy et Ghost à jour.
Avant une mise à niveau, consultez les changements de version, sauvegardez les données et testez si possible sur une instance secondaire. La procédure habituelle est ensuite :
docker compose pull
docker compose up -d
docker compose logs --tail=100 ghost
Évitez les mises à jour automatiques non supervisées de l’image Ghost. Une version explicitement définie dans compose.yaml offre davantage de contrôle.
Sauvegarder Ghost et MySQL
Une sauvegarde complète doit couvrir deux ensembles : la base MySQL et le volume ghost_content. La base contient les articles, membres et paramètres. Le volume contient notamment les images, thèmes et fichiers importés.
Pour exporter MySQL depuis le conteneur :
docker compose exec -T mysql mysqldump \
-uroot \
-p"$MYSQL_ROOT_PASSWORD" \
--single-transaction \
--routines \
--triggers \
ghost > ghost.sql
Cette commande suppose que MYSQL_ROOT_PASSWORD est disponible dans votre shell. Sinon, fournissez-le au moyen d’une méthode sécurisée adaptée à votre environnement.
Sauvegardez aussi le contenu avec un conteneur temporaire :
docker run --rm \
-v ghost_content:/source:ro \
-v "$PWD/backups:/backup" \
alpine \
tar -czf /backup/ghost-content.tar.gz -C /source .
Selon le nom du projet Compose, Docker peut préfixer le nom réel du volume. Vérifiez-le avant d’exécuter la commande.
Conservez plusieurs générations de sauvegardes sur un stockage distinct du VPS, chiffrez-les et testez régulièrement une restauration. Notre guide sur les sauvegardes chiffrées avec restic détaille l’automatisation. Une sauvegarde dont la restauration n’a jamais été vérifiée reste une promesse, pas une garantie.