Wie du Claude Code deine Ghost Blog bereitstellen lässt (DNS, VPS und Ghost API)
Eine Schritt-für-Schritt-Anleitung, um Claude Code autonomy Cloudflare DNS konfigurieren zu lassen, einen Hetzner VPS über SSH einzurichten, Ghost mit Traefik bereitzustellen und den Blog über die Ghost Admin API zu initialisieren – mit ehrlichen Notizen, was noch manuell gemacht werden muss.
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
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 generieren - 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 (kein Hetzner API Key im Scope — oder du fügst einen hinzu, 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 vorher sshpass 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" dein cloud-init.yaml einfügen. Das installiert Docker, legt den Deploy-User an, konfiguriert UFW und richtet fail2ban ein — alles in einem Durchlauf. 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: 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)
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 Ganze dauert etwa dreißig Sekunden.
Falls du E-Mail-Records (MX, DKIM, SPF) von einem Anbieter wie FastMail hast, gib Claude die gleich mit. Er kann sie im selben Durchlauf anlegen.
Nach DNS-Propagation (mit Cloudflare meist unter fünf Minuten) den SSL/TLS-Modus manuell setzen:
Cloudflare Dashboard → yourdomain.com → SSL/TLS → Übersicht → Full (Strict)
Das ist der eine Klick, der sich mit einem beschränkten DNS-Token nicht automatisieren lässt.
Schritt 4 — Stack deployen
Wenn DNS aktiv und der Server bereit ist, Claude diesen Prompt geben:
Deploye den Ghost-Stack auf den in CLAUDE.md dokumentierten Server.
1. deploy/docker-compose.yml und deploy/.env nach /opt/ghost auf dem Server hochladen
2. Per SSH einloggen und traefik/-Verzeichnis mit leerer acme.json anlegen (chmod 600)
3. Ausführen: docker compose up -d
4. 30 Sekunden warten, dann prüfen: docker compose ps
5. Ghost-Logs auf Startfehler prüfen: docker compose logs --tail=50 ghost
6. Wenn alles gesund aussieht: Container-Status melden
Claude loggt sich per SSH ein, lädt die Dateien hoch, startet die Container und liest die Logs. Wenn etwas schiefläuft — und beim ersten Deploy gibt es oft eine Kleinigkeit — diagnostiziert Claude das Problem und behebt es. Die fünf häufigsten Fehler sind in Ghost hinter Cloudflare und Traefik: Das komplette funktionierende Setup dokumentiert.
Die wahrscheinlichsten Probleme: fehlendes @docker-Suffix bei Traefik-Middleware-Referenzen, falscher Name der Cloudflare-Token-Variable oder Docker-Netzwerkname-Präfix, das nicht zum Compose-Projektverzeichnis passt.
Schritt 5 — Ghost per Admin API initialisieren
Ghost hat einen einmaligen Setup-Endpoint. Bis er aufgerufen wird, befindet sich der Blog im Status „nicht initialisiert" — es existiert kein Admin-Account. Das geht über den Browser unter /ghost oder per API durch Claude.
Claude diesen Prompt geben:
Initialisiere Ghost unter https://yourdomain.com über den Admin API Setup-Endpoint.
Admin-Account erstellen mit:
- 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 Ergebnis melden.
Claude ruft den Endpoint auf und liefert die Bestätigung. Die Antwort enthält ein User-Objekt — der Admin-Account ist live.
# 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"
}]
}'
Falls der Endpoint 403 zurückgibt: Ghost ist bereits initialisiert (jemand war schneller — möglicherweise du beim Testen der URL im Browser). Bei einem Connection Error laufen die Container noch nicht.
Schritt 6 — Admin API Key auslesen
Im Ghost Admin unter https://yourdomain.com/ghost einloggen — mit den Zugangsdaten, die Claude gerade erstellt hat.
Navigiere zu: Einstellungen → Integrationen → Eigene Integration hinzufügen
Name ist egal — „Automation" funktioniert. Ghost zeigt dir einen Admin API Key im Format id:hexsecret. Speichere ihn in deploy/.env als GHOST_ADMIN_KEY.
Ab diesem Punkt kann Claude Beiträge erstellen, Bilder hochladen, Tags verwalten und Entwürfe veröffentlichen — komplett über die API, ohne Browser.
Setup verifizieren
Wenn alles deployt ist, Claude die Verifikations-Checkliste durchlaufen lassen:
Folgende Checks ausführen und HTTP-Statuscode für jeden melden:
1. curl -s https://yourdomain.com/ -o /dev/null -w "%{http_code}" → sollte 200 sein
2. curl -s https://www.yourdomain.com/ -o /dev/null -w "%{http_code}" → sollte 301 sein
3. curl -s http://yourdomain.com/ -o /dev/null -w "%{http_code}" → sollte 301 sein
4. curl -sv https://yourdomain.com/ 2>&1 | grep issuer → sollte Let's Encrypt zeigen
Außerdem:
5. docker compose ps → alle Container sollten Up sein
6. docker compose logs traefik | grep -i error → sollte leer sein
Falls Schritt 1 000 zurückgibt oder hängt: Traefik-Routing-Problem. Falls er 301 zurückgibt: der Ghost Redirect Loop ist aktiv — siehe den Traefik-Post für die Lösung. Falls Schritt 4 ein Cloudflare-Zertifikat statt Let's Encrypt zeigt: die DNS-01 Challenge ist noch nicht abgeschlossen, oder die CLOUDFLARE_TOKEN-Variable heißt falsch.
Der vollständige Prompt für einen sauberen Server
Wenn du den gesamten Job auf einmal an Claude übergeben willst — DNS, Deployment und Ghost-Initialisierung — hier der Prompt. Voraussetzung: CLAUDE.md geschrieben und .env fertig:
Deploye Ghost auf den in CLAUDE.md dokumentierten Server. In dieser Reihenfolge:
1. Cloudflare API: A-Records für @, www und * auf die Server-IP setzen.
Vorhandene Records zuerst prüfen; aktualisieren wenn vorhanden, anlegen wenn nicht.
2. deploy/docker-compose.yml und deploy/.env nach /opt/ghost auf dem Server hochladen.
/opt/ghost/traefik/acme.json anlegen mit chmod 600.
3. Per SSH: docker compose up -d
45 Sekunden warten, dann docker compose ps und docker compose logs ghost prüfen.
Startfehler beheben bevor weiter.
4. Wenn alle Container gesund sind, Ghost per POST an
/ghost/api/admin/authentication/setup initialisieren.
Generiertes Passwort mitteilen.
5. Bestätigen, dass https://[DOMAIN]/ HTTP 200 zurückgibt.
Bei Fehlern: relevante Log-Ausgabe melden.
Admin-Zugangsdaten:
- email: du@yourdomain.com
- blogTitle: Dein Blog-Titel
Claude arbeitet die Liste ab, meldet den Status nach jedem Schritt und fragt nach, wenn eine Entscheidung nötig ist. Auf einem sauberen Server mit korrekten Zugangsdaten dauert das gesamte Deployment etwa vier Minuten.
KI zum Debuggen des Deployments einsetzen
Wenn während eines Deployments etwas schiefläuft, füge diesen Post und den Ghost + Traefik + Cloudflare Bugs Post in die Konversation ein. Zusammen decken sie jeden Fehler ab, auf den ich gestoßen bin. Claude gleicht den Fehler in den Logs mit den dokumentierten Mustern ab und sagt dir genau, welches Label falsch ist oder welche Umgebungsvariable fehlt.
Wo das läuft
Hetzner CX22 ist die Maschine, auf der das läuft. 4,85 €/Monat, zwei vCPUs, 4 GB RAM. Der Deploy-User hat standardmäßig kein Passwort — cloud-init sperrt es — Claude authentifiziert sich per Key oder dem temporären Passwort, das du bei der Server-Erstellung vergeben hast.
Wer einen KI-Assistenten will, der den Server nach dem Setup eigenständig verwaltet — Container neu starten, Beiträge erstellen, Logs überwachen — xCloud hostet OpenClaw managed. Du bekommst dieselben autonomen Operationen, ohne den Server selbst zu warten. Was in diesem Post beschrieben wird, läuft bei xCloud unter der Haube.
(Affiliate-Links — ich bekomme eine kleine Provision, wenn du dich anmeldest, ohne Mehrkosten für dich.)
Ressourcen
- Ghost Admin API Setup-Endpoint: ghost.org/docs/admin-api
- Cloudflare API (DNS Records): developers.cloudflare.com
- cloud-init Referenz: cloudinit.readthedocs.io
- Fünf Traefik/Cloudflare-Bugs, auf die du stoßen wirst: Ghost hinter Cloudflare und Traefik