Comment laisser Claude Code déployer votre blog Ghost (DNS, VPS et Ghost API)
Un guide étape par étape pour laisser Claude Code configurer de manière autonome le DNS Cloudflare, mettre en place un VPS Hetzner via SSH, déployer Ghost avec Traefik, et initialiser le blog via l'API Ghost Admin — avec des remarques honnêtes sur ce qui nécessite encore une intervention humaine.
Vous avez un domaine. Vous avez un compte Hetzner. Vous voulez Ghost sur votre propre serveur avec HTTPS, Cloudflare en façade et une base de données MySQL derrière. Le chemin manuel prend deux heures : créer le serveur, se connecter en SSH, configurer Docker Compose, se battre avec Let's Encrypt, déboguer Traefik, initialiser Ghost via un formulaire dans le navigateur.
Il existe un autre chemin. Confiez le travail à Claude Code. Donnez-lui vos identifiants et une description de la tâche : il configurera le DNS Cloudflare, déploiera le stack via SSH et initialisera Ghost via l'Admin API sans que vous touchiez un terminal. C'est ainsi que clawstack.run a été mis en place.
Cet article documente précisément ce que Claude peut faire seul, ce qui nécessite encore un clic humain, et comment structurer la passation pour que tout fonctionne du premier coup.
Ce que Claude Code peut et ne peut pas faire
Claude Code a accès à votre système de fichiers, un terminal et toute API vers laquelle vous le dirigez. Cela couvre l'essentiel de ce déploiement. Mais certaines opérations restent derrière des interfaces navigateur sans équivalent API.
Claude gère de manière autonome : - Création des enregistrements DNS A Cloudflare via l'API - Génération des fichiers .env et des configs Docker Compose - Connexion SSH au serveur et exécution de commandes - Téléversement des fichiers de déploiement - Démarrage des conteneurs Docker - Initialisation de Ghost via l'Admin API (création du compte administrateur, premier article, titre du site) - Diagnostic des erreurs par lecture des logs et application des corrections
Vous devez faire manuellement (clics ponctuels) : - Créer le serveur Hetzner (pas de clé API Hetzner dans le périmètre — ou vous pouvez en ajouter une et Claude s'en charge aussi) - Définir le mode SSL/TLS de Cloudflare sur Full (Strict) dans le tableau de bord - Récupérer la clé Admin API Ghost depuis l'interface d'administration Ghost après la première connexion
Tout le reste est automatisable. Les deux étapes manuelles prennent moins de cinq minutes au total.
Ce dont vous avez besoin avant de commencer
- Un domaine dont le DNS est géré chez Cloudflare
- Un token API Cloudflare avec la permission Zone / DNS / Edit, limité à votre domaine
- Un compte Hetzner (ou tout autre fournisseur VPS — adaptez l'IP ci-dessous)
- Un mot de passe ou une clé SSH pour le serveur
- Claude Code en local avec accès au système de fichiers et à Bash
La méthode d'authentification SSH n'a pas d'importance. Claude Code utilisera ce que vous avez — fichier de clé ou mot de passe via sshpass. Si vous utilisez un mot de passe, installez d'abord sshpass :
sudo apt install sshpass
Étape 1 — Créer le serveur
Rendez-vous dans la Hetzner Cloud Console et créez un nouveau serveur : - Type : CX22 (2 vCPU, 4 Go RAM) — suffisant pour Ghost + MySQL + Traefik - Image : Ubuntu 24.04 - Région : la plus proche de vous - Clé SSH ou mot de passe : à votre choix
Dans le champ « Cloud config », collez votre cloud-init.yaml. Celui-ci installe Docker, crée l'utilisateur de déploiement, configure UFW et met en place fail2ban en une seule passe. Vous pouvez utiliser celui de clawstack-configs sur GitHub comme point de départ.
Notez l'adresse IP du serveur. C'est la dernière action manuelle requise.
Étape 2 — Donner le contexte à Claude Code
Créez un fichier CLAUDE.md dans votre répertoire de projet. C'est le brief que Claude lit au début de chaque session. Incluez :
# Deployment Context
## Server
- IP: 203.0.113.42
- SSH user: deploy
- SSH auth: password via sshpass / key at ~/.ssh/mykey
## Domain
- Domain: yourdomain.com
- DNS: Cloudflare (token in .env as CLOUDFLARE_TOKEN)
## Stack
- Ghost 5 + MySQL 8 + Traefik (Docker Compose)
- Compose file: deploy/docker-compose.yml
- Deploy directory on server: /opt/ghost
## Credentials
- All secrets in deploy/.env (never commit)
Créez ensuite deploy/.env avec vos valeurs réelles :
DOMAIN=yourdomain.com
ACME_EMAIL=you@yourdomain.com
CLOUDFLARE_TOKEN=your_cloudflare_dns_token
DB_NAME=ghost
DB_USER=ghost
DB_PASSWORD=generate_with_openssl_rand_base64_32
DB_ROOT_PASSWORD=generate_with_openssl_rand_base64_32
MAIL_HOST=smtp.fastmail.com
MAIL_PORT=587
MAIL_USER=you@fastmail.com
MAIL_PASS=your_app_password
MAIL_FROM=noreply@yourdomain.com
Générez les mots de passe de la base de données en local :
openssl rand -base64 32
Étape 3 — Configurer le DNS
Donnez ce prompt à Claude Code :
Using the Cloudflare API token in deploy/.env, create the following DNS records
for the domain in .env:
- A record: @ → the server IP in CLAUDE.md
- A record: www → the server IP in CLAUDE.md
- A record: * → the server IP in CLAUDE.md
Use the Cloudflare API at https://api.cloudflare.com/client/v4.
First get the zone ID for the domain, then create each record.
Check for existing records and skip or update as needed.
Claude appellera l'API Cloudflare, récupérera l'ID de zone, créera les enregistrements et confirmera chacun d'entre eux. L'ensemble prend environ trente secondes.
Si vous avez des enregistrements email (MX, DKIM, SPF) d'un fournisseur comme FastMail, indiquez-les aussi à Claude. Il peut les créer dans la même passe.
Après la propagation DNS (généralement moins de cinq minutes avec Cloudflare), définissez le mode SSL/TLS manuellement :
Tableau de bord Cloudflare → yourdomain.com → SSL/TLS → Vue d'ensemble → Full (Strict)
C'est le seul clic qui ne peut pas être automatisé avec un token DNS limité.
Étape 4 — Déployer le stack
Une fois le DNS actif et le serveur en marche, donnez à Claude le prompt de déploiement :
Deploy the Ghost stack to the server documented in CLAUDE.md.
1. Upload deploy/docker-compose.yml and deploy/.env to /opt/ghost on the server
2. SSH in and create the traefik/ directory with an empty acme.json (chmod 600)
3. Run: docker compose up -d
4. Wait 30 seconds, then check: docker compose ps
5. Check Ghost logs for any startup errors: docker compose logs --tail=50 ghost
6. If everything looks healthy, report the container statuses
Claude se connectera en SSH, téléversera les fichiers, démarrera les conteneurs et lira les logs. Si quelque chose ne va pas — et le premier déploiement a souvent un petit problème — Claude diagnostiquera et appliquera le correctif. Les cinq erreurs les plus courantes sont documentées dans Ghost derrière Cloudflare et Traefik : la configuration complète fonctionnelle.
Les plus probables : suffixe @docker manquant sur les références de middleware Traefik, nom de variable du token Cloudflare incorrect, ou préfixe du nom de réseau Docker ne correspondant pas au nom du répertoire du projet Compose.
Étape 5 — Initialiser Ghost via l'Admin API
Ghost est livré avec un endpoint de configuration unique. Tant que vous ne l'avez pas appelé, le blog est en état « non initialisé » — aucun compte administrateur n'existe. Vous pouvez le faire via le navigateur à /ghost, ou laisser Claude le faire via l'API.
Donnez ce prompt à Claude :
Initialise Ghost at https://yourdomain.com using the Admin API setup endpoint.
Create an admin account with:
- name: Admin
- email: you@yourdomain.com
- password: (generate a strong one and tell me what it is)
- blogTitle: Your Blog Title
POST to: https://yourdomain.com/ghost/api/admin/authentication/setup
Check the response for success and report the result.
Claude appellera l'endpoint et renverra la confirmation. La réponse inclut un objet utilisateur — le compte administrateur est actif.
# Ce que Claude exécute en coulisses :
curl -s -X POST https://yourdomain.com/ghost/api/admin/authentication/setup \
-H "Content-Type: application/json" \
-d '{
"setup": [{
"name": "Admin",
"email": "you@yourdomain.com",
"password": "YourPassword123!",
"blogTitle": "Your Blog Title"
}]
}'
Si l'endpoint renvoie un 403, Ghost est déjà initialisé (quelqu'un est passé avant — peut-être vous en testant l'URL dans un navigateur). S'il renvoie une erreur de connexion, les conteneurs ne sont pas encore démarrés.
Étape 6 — Récupérer la clé Admin API
Connectez-vous à l'administration Ghost à https://yourdomain.com/ghost avec les identifiants que Claude vient de créer.
Allez dans : Paramètres → Intégrations → Ajouter une intégration personnalisée
Nommez-la comme vous voulez — « Automation » convient. Ghost vous affichera une clé Admin API au format id:hexsecret. Enregistrez-la dans deploy/.env sous le nom GHOST_ADMIN_KEY.
À partir de ce moment, Claude peut créer des articles, téléverser des images, gérer les tags et publier des brouillons entièrement via l'API — sans navigateur.
Vérification de la configuration
Une fois tout déployé, demandez à Claude d'exécuter la liste de vérification :
Run the following checks and report the HTTP status code for each:
1. curl -s https://yourdomain.com/ -o /dev/null -w "%{http_code}" → should be 200
2. curl -s https://www.yourdomain.com/ -o /dev/null -w "%{http_code}" → should be 301
3. curl -s http://yourdomain.com/ -o /dev/null -w "%{http_code}" → should be 301
4. curl -sv https://yourdomain.com/ 2>&1 | grep issuer → should say Let's Encrypt
Also check:
5. docker compose ps → all containers should be Up
6. docker compose logs traefik | grep -i error → should be empty
Si l'étape 1 renvoie 000 ou reste en attente, il y a un problème de routage Traefik. Si elle renvoie 301, la boucle de redirection Ghost est active — consultez l'article Traefik pour le correctif. Si l'étape 4 affiche un certificat Cloudflare au lieu de Let's Encrypt, le challenge DNS-01 n'est pas encore terminé ou la variable CLOUDFLARE_TOKEN est mal nommée.
Le prompt complet pour un serveur vierge
Si vous voulez confier l'intégralité du travail à Claude en une seule fois — DNS, déploiement et initialisation Ghost — voici le prompt. Suppose que CLAUDE.md est rédigé et que .env est prêt :
Deploy Ghost to the server documented in CLAUDE.md. Do the following in order:
1. Use the Cloudflare API to create A records for @, www, and * pointing to the server IP.
Check for existing records first; update if present, create if not.
2. Upload deploy/docker-compose.yml and deploy/.env to /opt/ghost on the server.
Create /opt/ghost/traefik/acme.json with chmod 600.
3. SSH in and run: docker compose up -d
Wait 45 seconds, then check docker compose ps and docker compose logs ghost.
Fix any startup errors before continuing.
4. Once all containers are healthy, initialise Ghost via POST to
/ghost/api/admin/authentication/setup with the credentials below.
Tell me the password you generate.
5. Confirm the site returns HTTP 200 at https://[DOMAIN]/.
Report any failures with the relevant log output.
Admin credentials to create:
- email: you@yourdomain.com
- blogTitle: Your Blog Title
Claude traitera la liste étape par étape, rendra compte du statut après chacune et s'arrêtera pour vous consulter si une décision est nécessaire. Sur un serveur vierge avec des identifiants corrects, l'ensemble du déploiement prend environ quatre minutes.
Utiliser une IA pour déboguer le déploiement
Si quelque chose casse pendant un déploiement que Claude exécute, le chemin le plus rapide est de coller cet article et l'article sur les bugs Ghost + Traefik + Cloudflare dans la conversation. Ensemble, ils couvrent chaque mode d'échec que nous avons rencontré. Claude croisera l'erreur dans les logs avec les patterns documentés et vous dira exactement quel label est incorrect ou quelle variable d'environnement manque.
Où exécuter cela
Hetzner CX22 est la machine sur laquelle cela tourne. 4,85 €/mois, deux vCPUs, 4 Go de RAM. L'utilisateur de déploiement n'a pas de mot de passe par défaut — cloud-init le verrouille — Claude s'authentifie donc par clé ou via le mot de passe temporaire défini lors de la création du serveur.
Si l'objectif est un assistant IA capable de gérer le serveur de manière autonome après la configuration — redémarrer des conteneurs, créer des articles, surveiller les logs — xCloud héberge OpenClaw en mode géré. Vous bénéficiez des mêmes opérations autonomes sans maintenir le serveur vous-même. Le déploiement décrit dans cet article est ce que xCloud exécute sous le capot.
(Liens d'affiliation — nous percevons une petite commission si vous vous inscrivez, sans frais supplémentaires pour vous.)
Ressources
- Endpoint de configuration de l'Admin API Ghost : ghost.org/docs/admin-api
- API Cloudflare (enregistrements DNS) : developers.cloudflare.com
- Référence cloud-init : cloudinit.readthedocs.io
- Cinq bugs Traefik/Cloudflare que vous rencontrerez : Ghost derrière Cloudflare et Traefik
Version allemande (Deutsch)
Metadaten
- Titel: Ghost mit Claude Code deployen: DNS, VPS und Ghost API automatisiert
- Slug: claude-code-ghost-deployment-de
- Beschreibung: Schritt-für-Schritt-Anleitung, um Claude Code Cloudflare DNS konfigurieren, einen Hetzner VPS per SSH einrichten, Ghost mit Traefik deployen und den Blog über die Ghost Admin API initialisieren zu lassen — mit ehrlichen Hinweisen, was noch ein Mensch tun muss.
- Tags: claude-code, ghost, cloudflare, hetzner, docker, automation, selbst-gehostet, infra
- Pillar: /openclaw/
- Language: de
- Reading Time: 10 min
Inhalt
Du hast eine Domain. Du hast einen Hetzner-Account. Du willst Ghost auf deinem eigenen Server mit HTTPS, Cloudflare davor und einer MySQL-Datenbank dahinter. Der manuelle Weg dauert zwei Stunden: Server erstellen, per SSH einloggen, Docker Compose konfigurieren, mit Let's Encrypt kämpfen, Traefik debuggen, Ghost durch ein Browser-Formular initialisieren.
Es gibt einen anderen Weg. Übergib den Job an Claude Code. Gib ihm deine Zugangsdaten und eine Aufgabenbeschreibung — es konfiguriert Cloudflare DNS, deployt den Stack per SSH und initialisiert Ghost über die Admin API, ohne dass du ein Terminal anfassen musst. So wurde clawstack.run aufgesetzt.
Dieser Post dokumentiert genau, was Claude eigenständig tun kann, was noch einen menschlichen Klick erfordert, und wie du die Übergabe strukturierst, damit es beim ersten Versuch funktioniert.
Was Claude Code kann und was nicht
Claude Code hat Zugriff auf dein Dateisystem, ein Terminal und jede API, auf die du es hinweist. Das deckt den Großteil dieses Deployments ab. Einige Dinge befinden sich aber noch hinter Browser-UIs ohne API-Äquivalent.
Claude erledigt selbstständig: - Cloudflare DNS A-Records per API anlegen - .env-Dateien und Docker Compose Configs erstellen - Per SSH auf den Server zugreifen und Befehle ausführen - Deployment-Dateien hochladen - Docker Container starten - Ghost per Admin API initialisieren (Admin-Account, erster Post, Seitentitel) - Fehler durch Log-Analyse diagnostizieren und beheben
Manuelle Schritte (einmalige Klicks): - Hetzner Server erstellen (oder Hetzner API Key bereitstellen, dann kann Claude das auch) - Cloudflare SSL/TLS-Modus auf Full (Strict) setzen im Dashboard - Ghost Admin API Key aus dem Ghost Admin UI auslesen nach dem ersten Login
Alles andere ist automatisierbar. Die zwei manuellen Schritte dauern zusammen unter fünf Minuten.
Voraussetzungen
- Eine Domain mit DNS bei Cloudflare
- Ein Cloudflare API Token mit Zone / DNS / Edit-Berechtigung, auf deine Domain beschränkt
- Ein Hetzner-Account (oder anderer VPS-Anbieter — IP unten anpassen)
- SSH-Passwort oder Key für den Server
- Claude Code lokal mit Dateisystem- und Bash-Zugriff
Die SSH-Authentifizierungsmethode spielt keine Rolle. Claude Code verwendet was du hast — Key-Datei oder Passwort via sshpass. Bei Passwort-Authentifizierung zuerst installieren:
sudo apt install sshpass
Schritt 1 — Server erstellen
In der Hetzner Cloud Console einen neuen Server anlegen: - Typ: CX22 (2 vCPU, 4 GB RAM) — reicht für Ghost + MySQL + Traefik - Image: Ubuntu 24.04 - Region: nächstgelegene - SSH Key oder Passwort: nach Wahl
Im Feld "Cloud config" das cloud-init.yaml einfügen. Das installiert Docker, legt den Deploy-User an, konfiguriert UFW und richtet fail2ban ein. Als Ausgangspunkt eignet sich die Datei aus clawstack-configs auf GitHub.
Die IP-Adresse des Servers notieren. Das ist die letzte manuelle Aktion.
Schritt 2 — Claude Code den Kontext geben
Eine CLAUDE.md-Datei im Projektverzeichnis anlegen. Das ist das Briefing, das Claude zu Beginn jeder Session liest:
# Deployment Context
## Server
- IP: 203.0.113.42
- SSH-User: deploy
- SSH-Auth: Passwort via sshpass / Key unter ~/.ssh/mykey
## Domain
- Domain: yourdomain.com
- DNS: Cloudflare (Token in .env als CLOUDFLARE_TOKEN)
## Stack
- Ghost 5 + MySQL 8 + Traefik (Docker Compose)
- Compose-Datei: deploy/docker-compose.yml
- Deploy-Verzeichnis auf Server: /opt/ghost
## Zugangsdaten
- Alle Secrets in deploy/.env (nie committen)
Dann deploy/.env mit den echten Werten anlegen:
DOMAIN=yourdomain.com
ACME_EMAIL=du@yourdomain.com
CLOUDFLARE_TOKEN=dein_cloudflare_dns_token
DB_NAME=ghost
DB_USER=ghost
DB_PASSWORD=mit_openssl_rand_base64_32_generieren
DB_ROOT_PASSWORD=mit_openssl_rand_base64_32_generieren
MAIL_HOST=smtp.fastmail.com
MAIL_PORT=587
MAIL_USER=du@fastmail.com
MAIL_PASS=dein_app_passwort
MAIL_FROM=noreply@yourdomain.com
DB-Passwörter lokal generieren:
openssl rand -base64 32
Schritt 3 — DNS konfigurieren
Claude Code diesen Prompt geben:
Lege mit dem Cloudflare API Token aus deploy/.env folgende DNS-Records
für die Domain in .env an:
- A-Record: @ → Server-IP aus CLAUDE.md
- A-Record: www → Server-IP aus CLAUDE.md
- A-Record: * → Server-IP aus CLAUDE.md
Cloudflare API: https://api.cloudflare.com/client/v4
Zuerst die Zone-ID für die Domain abrufen, dann jeden Record anlegen.
Vorhandene Records prüfen und ggf. aktualisieren statt doppelt anlegen.
Claude ruft die Cloudflare API auf, ermittelt die Zone-ID, legt die Records an und bestätigt jeden einzelnen. Das dauert etwa dreißig Sekunden.
Nach DNS-Propagation (mit Cloudflare meist unter fünf Minuten) den SSL-Modus manuell setzen:
Cloudflare Dashboard → yourdomain.com → SSL/TLS → Übersicht → Full (Strict)
Das ist der eine Klick, der mit einem beschränkten DNS-Token nicht automatisierbar ist.
Schritt 4 — Stack deployen
Wenn DNS aktiv und der Server bereit ist:
Deploye den Ghost-Stack auf den in CLAUDE.md dokumentierten Server.
1. deploy/docker-compose.yml und deploy/.env nach /opt/ghost hochladen
2. Per SSH einloggen und /opt/ghost/traefik/acme.json anlegen (chmod 600)
3. docker compose up -d ausführen
4. 30 Sekunden warten, dann docker compose ps prüfen
5. Ghost-Logs auf Startfehler prüfen: docker compose logs --tail=50 ghost
6. Bei gesundem Status alle Container-Zustände melden
Claude loggt per SSH ein, lädt die Dateien hoch, startet die Container und liest die Logs. Wenn etwas schiefläuft — beim ersten Deploy oft eine Kleinigkeit — diagnostiziert Claude es und behebt es. Die fünf häufigsten Fehler sind in Ghost hinter Cloudflare und Traefik dokumentiert.
Schritt 5 — Ghost per Admin API initialisieren
Ghost hat einen einmaligen Setup-Endpoint. Bis er aufgerufen wird, existiert kein Admin-Account. Das geht über den Browser unter /ghost oder per API:
Initialisiere Ghost unter https://yourdomain.com über den Admin API Setup-Endpoint.
Admin-Account erstellen:
- name: Admin
- email: du@yourdomain.com
- password: (generiere ein starkes Passwort und teile es mir mit)
- blogTitle: Dein Blog-Titel
POST an: https://yourdomain.com/ghost/api/admin/authentication/setup
Antwort auf Erfolg prüfen und melden.
# Was Claude im Hintergrund ausführt:
curl -s -X POST https://yourdomain.com/ghost/api/admin/authentication/setup \
-H "Content-Type: application/json" \
-d '{
"setup": [{
"name": "Admin",
"email": "du@yourdomain.com",
"password": "DeinPasswort123!",
"blogTitle": "Dein Blog-Titel"
}]
}'
Bei 403: Ghost ist bereits initialisiert. Bei Connection Error: Container laufen noch nicht.
Schritt 6 — Admin API Key auslesen
Im Ghost Admin unter https://yourdomain.com/ghost einloggen.
Einstellungen → Integrationen → Eigene Integration hinzufügen
Den Admin API Key im Format id:hexsecret in deploy/.env als GHOST_ADMIN_KEY speichern.
Ab jetzt kann Claude Beiträge erstellen, Bilder hochladen, Tags verwalten und Entwürfe veröffentlichen — ohne Browser.
Setup verifizieren
Folgende Checks ausführen und HTTP-Statuscodes melden:
1. curl -s https