Ghost 2026 selbst hosten: MySQL, Newsletter und Content-Backups
Eine praxisnahe Anleitung zum Self-Hosting von Ghost mit Docker, Ports, persistenten Daten, TLS, Sicherheit, Backups und den Fehlern, die den Produktiveinsatz verhindern. Schritt für Schritt.
Ein fehlgeschlagenes Ghost-Deployment stürzt nicht immer ab. Es kann eine Login-Seite ausliefern, während die url-Einstellung auf HTTP zeigt oder das Content-Volume ersetzt wurde. Beginne stattdessen mit einem End-to-End-Check: Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden.
Dieser Check entspricht dem dokumentierten Zweck von Ghost: einer Publishing-Plattform mit Memberships und Newslettern. Außerdem macht er fehlende Abhängigkeiten, falsche Annahmen über den Proxy und flüchtige Daten früher sichtbar als ein einfacher Uptime-Check.
Die Laufzeitgrenzen von Ghost abstecken
Ziehe drei Grenzen um Ghost: den Ingress bis Port 2368, den persistenten Zustand und die unterstützenden Anforderungen. Der Container kann ersetzt werden, für die beiden anderen Bereiche braucht es jedoch klare Zuständigkeiten. Der Netzwerkvertrag für Ghost umfasst MySQL 8, SMTP und optional Object Storage für medienintensive Websites. Halte private Endpunkte im internen DNS, erlaube nur erforderliche ausgehende Verbindungen und gib Ghost ein Service-Credential mit begrenztem Berechtigungsumfang.
Das Diagramm ist vollständig, wenn ein sauberer Client die Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden kann. Erfasse Zeit- und Ressourcendaten für MySQL-Abfragen, Bildspeicher, Theme-Rendering, die Anzahl der Mitglieder und die Limits des Bulk-Mail-Providers. Schlägt die Transaktion fehl, zeigt die erste Grenze, die sich nicht wie dokumentiert verhält, ob Routing, lokale Kapazität oder ein unterstützender Dienst untersucht werden muss.
Nachweisen, dass Ghost einen Austausch übersteht
Ein Container-Image kann erneut heruntergeladen werden; die MySQL-Datenbank sowie Themes, Bilder und Content-Dateien können das nicht. Binde /var/lib/ghost/content vor dem Bootstrap ein, schreibe harmlose Beispieldaten und ersetze den Container, um nachzuweisen, dass dieser Pfad tatsächlich persistent ist. Prüfe das effektive Mount statt dich auf einen Compose-Dateinamen zu verlassen, und stelle sicher, dass der Runtime-User dort schreiben kann, wo Ghost es erwartet.
Lege die Aufbewahrungsdauer und ein externes Ziel fest und übe die Wiederherstellung, ohne die Produktion zu berühren. Der Drill ist nur dann erfolgreich, wenn Beiträge, Mitglieder, Newsletter, Themes und Bilder wiederhergestellt sind und ein Testmitglied die restaurierte Publikation öffnen kann. Bei datenbankgestützten Zuständen solltest du Storage-Snapshots mit anwendungskonsistenten Exporten kombinieren, wie unter Point-in-Time-Recovery im Vergleich zu Snapshots beschrieben.
Zugangsdaten, Rollen und exponierte Angriffsflächen
Das anwendungsspezifische Sicherheitsrisiko besteht darin, SQLite in einer nicht unterstützten Produktionsarchitektur zu verwenden oder Zugangsdaten für den Mailversand offenzulegen. Operativ bedeutet das: Ghost Admin schützen, Mail- und Datenbank-Zugangsdaten serverseitig halten und die endgültige HTTPS-URL vor dem Veröffentlichen festlegen. Schließe den Bootstrap über eine eingeschränkte Route ab und entferne den temporären Setup-Zugriff unmittelbar danach.
url ist eine Konfiguration und kein Secret. Halte den Wert explizit, während du die separaten Zugangsdaten für Ghost schützt. Gib dem Ghost-Prozess nur die dokumentierten Mounts und Dependency-Routen; vermeide Zugriff auf das Host-Root-Verzeichnis und den Docker-Socket. Protokolliere fehlgeschlagene Authentifizierungen und Konfigurationsfehler, schwärze aber Tokens, Connection-Strings und Benutzerinhalte.
Das Ghost-Deployment End-to-End verifizieren
Der Release-Nachweis für Ghost braucht Fakten, kein „sieht gut aus“. Speichere den ausgewählten Image-Digest, die Konfigurations-Checksumme, den öffentlichen Hostnamen und ein Ergebnis mit Zeitstempel für Folgendes: Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden. Verwende Nicht-Produktions-Beispieldaten, damit der Check nach jedem Deployment ausgeführt werden kann.
Überprüfe zwei Lifecycle-Ereignisse getrennt voneinander. Ein Austausch des Containers muss den normalen Betrieb erhalten; eine saubere Wiederherstellung muss zeigen, dass Beiträge, Mitglieder, Newsletter, Themes und Bilder zurückkehren und ein Testmitglied die restaurierte Publikation öffnen kann. Messe während der Checks MySQL-Abfragen, Bildspeicher, Theme-Rendering, die Anzahl der Mitglieder und die Limits des Bulk-Mail-Providers und bewahre das Ergebnis als erwarteten Rahmen für diese Version auf.
Teste außerdem eine verweigerte oder ungültige Bedingung: Entziehe der Testidentität vorübergehend den Zugriff auf MySQL 8, SMTP und optionales Object Storage für medienintensive Websites. Ghost sollte auf nachvollziehbare Weise fehlschlagen und keinen intakten Zustand überschreiben. Stelle die gültige Bedingung wieder her, führe das Beispiel erneut aus und hänge die relevanten, bereinigten Logs an. Diese Artefakte liefern für eine spätere Rollback-Entscheidung konkrete Belege.
Eine Docker-Baseline für Ghost
Halte den initialen Ghost-Aufruf so reproduzierbar, dass er in einem Pull Request geprüft werden kann.
docker run -d \
--name ghost \
--restart unless-stopped \
-p 127.0.0.1:2368:2368 \
-v ghost-data:/var/lib/ghost/content \
-e url=https://app.example.com \
-e database__client=mysql \
-e database__connection__host=mysql.internal \
-e database__connection__user=ghost \
-e database__connection__password=replace-with-a-strong-database-password \
-e database__connection__database=ghost \
ghost:latest
Verlasse dich nicht auf latest, sobald echte Daten vorhanden sind. Halte den funktionierenden Digest, den Container-User und die Besitzverhältnisse der Mounts fest. Verfolge das Anwendungslog durch einen vollständigen Test — Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden — und notiere alle Migrationen, bevor du die Route für Produktions-Traffic freigibst.
TLS ist einfach – generierte URLs sind es nicht
Setze url vor dem Veröffentlichen auf die endgültige HTTPS-Domain. Leite den gewählten Hostnamen an Container-Port 2368 weiter, reiche den ursprünglichen Host und das HTTPS-Schema durch und veröffentliche keinen zweiten direkten Origin.
Teste Ghost von einem sauberen externen Client aus. Trenne einen Ingress-Fehler von der bekannten Anwendungsgrenze — die url-Einstellung zeigt auf HTTP oder das Content-Volume wurde ersetzt. Ein Zertifikats-, DNS- oder 502-Fehler gehört zum Routing; eine Anfrage, die Ghost erreicht und erst danach fehlschlägt, gehört zum Anwendungszustand, zur Kapazität oder zu einer unterstützenden Anforderung. Der Leitfaden zu TLS mit eigener Domain behandelt die erste Gruppe.
Kapazitäts- und Upgrade-Checks
Kapazitätstests sollten MySQL-Abfragen, Bildspeicher, Theme-Rendering, die Anzahl der Mitglieder und die Limits des Bulk-Mail-Providers ausführen, nicht wiederholt eine Anfrage an /. Führe das Szenario „Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden“ bei realistischer Parallelität aus und erfasse Latenz, Fehlerrate und das Wachstum des Speicherbedarfs.
Die Upgrade-Planung muss dieses Risiko berücksichtigen: Ghost-Migrationen, Erwartungen an die Node-Laufzeitumgebung und Custom Themes sollten auf einer geklonten Website getestet werden. Teste das neue Release mit repräsentativen Eingaben, führe anschließend die Akzeptanztransaktion erneut aus und vergleiche das Ergebnis. Wenn die url-Einstellung auf HTTP zeigt oder das Content-Volume ersetzt wurde, erfasse die fehlschlagende Transaktion und untersuche die zuerst betroffene Grenze, statt automatisch den Ingress verantwortlich zu machen.
Wiederholbare Infrastrukturarbeit zu Dockup verlagern
Routing, Zertifikate, der Austausch von Services und angebundener Storage sind sinnvolle Ziele für Automatisierung. Dockup übernimmt diese Aufgaben für Ghost und kann die zugehörige Managed Database bereitstellen oder Verbindungen zu Services auf dem eigenen Server eines Kunden herstellen.
Was Dockup nicht selbst erfinden sollte, ist die Trust Policy von Ghost. Setze nach dem Deployment url vor dem Veröffentlichen auf die endgültige HTTPS-Domain, setze diese Grenze durch — Ghost Admin schützen, Mail- und Datenbank-Zugangsdaten serverseitig halten und die endgültige HTTPS-URL vor dem Veröffentlichen festlegen — und überprüfe das Ergebnis dieses Szenarios: Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden. Das Ergebnis ist eine One-Click-Infrastruktur mit einem anwendungsspezifischen Akzeptanztest.
Häufig gestellte Fragen
Was benötigt Ghost für ein Produktions-Deployment?
Leite den Ghost-Container über einen einzigen HTTPS-Origin an Port 2368 weiter. Die unterstützenden Netzwerkanforderungen sind MySQL 8, SMTP und optionales Object Storage für medienintensive Websites. Betrachte Ghost erst dann als bereit, wenn du die Owner-Einrichtung abschließen, einen Beitrag mit Bild veröffentlichen, ein Mitglied abonnieren lassen und einen Test-Newsletter über die konfigurierte E-Mail-Infrastruktur versenden kannst.
Welche Ghost-Daten gehören in ein Backup?
Mache /var/lib/ghost/content persistent und nimm die MySQL-Datenbank sowie Themes, Bilder und Content-Dateien in dasselbe Wiederherstellungsmanifest auf. Eine saubere Ghost-Wiederherstellung ist nur dann erfolgreich, wenn Beiträge, Mitglieder, Newsletter, Themes und Bilder zurückkehren und ein Testmitglied die restaurierte Publikation öffnen kann.
Benötigt Ghost hinter einem Reverse Proxy HTTPS?
Verwende HTTPS für den öffentlichen Ghost-Origin und halte Port 2368 auf der internen Route. Setze die Ghost-Einstellung korrekt: url vor dem Veröffentlichen auf die endgültige HTTPS-Domain setzen. Bei Ghost schützt HTTPS Zugangsdaten oder Benutzerinhalte während der Übertragung und sorgt für konsistentes, vom Origin abhängiges Client-Verhalten.
Wie sollte ein Ghost-Upgrade getestet werden?
Stelle den aktuellen Ghost-Zustand in einem isolierten Deployment wieder her, installiere die geplante Version und führe die Akzeptanztransaktion erneut aus. Gehe dabei besonders sorgfältig vor, da Ghost-Migrationen, Erwartungen an die Node-Laufzeitumgebung und Custom Themes auf einer geklonten Website getestet werden sollten. Bewahre das vorherige Ghost-Image auf, bis die Grenzen der Datenmigration und des Rollbacks geklärt sind.
