ghost.io

Ghost Blog - Sicherungskonzept

Von peter portmann,

Veröffentlicht am 9. Nov. 2025   —   5 min Lesezeit

dokumentationselfhostedcode
Bild erzeugt mit KI (Gemini Nano Banana)

Ghost lokal gehostet auf einem UNRAID Server

Der supportnet.ch Blog läuft nun seit gut einem Jahr lokal gehostet auf der Ghost‑Plattform. Kürzlich habe ich das Sicherungskonzept verifiziert. Grund war ein Downgrade der Datenbank auf MySQL 8, da dies aktuell die einzige unterstützte Version ist. Ich hatte die Versionierung bei der ursprünglichen nicht auf eine Version beschränkt, sondern in der Konfiguration :latest verwendet. Eine schlechte Idee, da der verwendete Docker‑Container die Version auf MySQL angehoben hatte, Ghost aber leider nicht. Negative Effekte habe ich keine festgestellt. Da ich aber sowieso das Sicherungskonzept überprüfen wollte, habe ich auch gleich die Version der Datenbank angepasst.
Also, in produktiven Umgebungen immer eine Version festlegen und sich nicht auf :latest verlassen.

Unter [UNRAID] werden die Daten ausserhalb der Docker‑Container im Verzeichnis /mnt/user/appdata gesichert. Diese werden automatisiert von einem SSD‑Raid auf ein internes HD‑Raid gesichert und auch in eine Kaskade auf einer externen SSD und weiter zu einem Synology NAS mit anschliessender externer Versionierung bei Hetzner übergeben.

⚠️
Das hier erläuterte Konzept beschreibt die Wiederherstellung der Daten in einen MySQL‑Datencontainer. Dokumente und Bilder sind ausserhalb des Containers abgelegt und werden nicht verändert. Die Inhalte könnten auch mit einem Dump der MySQL‑Datenbank gesichert und wiederhergestellt werden. Hier verwende ich aber die Bordmittel der Ghost‑Plattform.

Quellen

Links:

Ghost: The best open source blog & newsletter platform
Beautiful, modern publishing with email newsletters and paid subscriptions built-in. Used by Platformer, 404Media, Lever News, Tangle, The Browser, and thousands more.
How To Install Ghost With Docker (preview) - Ghost Developer Docs
Preview our new batteries-included tools for self-hosting Ghost using Docker Compose.
What Databases Are Supported In Production? - Ghost Developer Docs
MySQL 8 is the only supported database in production.

MySQL 8 is the only supported database in production.

ghost.io - supportnet.ch

Ghost Docker-Container

UNRAID Dockercontainer ghost:6

docker run  
  -d  
  --name='mysql8GHOSTsupportnet'  
  --net='bridge'  
  --pids-limit 2048  
  -e TZ="Europe/Berlin"  
  -e HOST_OS="Unraid"  
  -e HOST_HOSTNAME="ASRockMini"  
  -e HOST_CONTAINERNAME="mysql8GHOSTsupportnet"  
  -e 'MYSQL_RANDOM_ROOT_PASSWORD'='yes'  
  -e 'MYSQL_DATABASE'='ghost'  
  -e 'MYSQL_USER'='ghost'  
  -e 'MYSQL_PASSWORD'='pw'  
  -e 'MYSQL_ROOT_PASSWORD'=''  
  -l net.unraid.docker.managed=dockerman  
  -l net.unraid.docker.icon='https://raw.githubusercontent.com/UNRA1DUser/unraid-docker-templates/main/templates/img/mysql.png'  
  -p '3301:3306/tcp'  
  -v '/mnt/user/appdata/mysql8GHOSTsupportnet/data':'/var/lib/mysql':'rw'  
  -v '/mnt/user/appdata/mysql8GHOSTsupportnet/logs':'/var/log/mysql':'rw'  
  -v '/mnt/user/appdata/mysql8GHOSTsupportnet/conf.d':'/etc/mysql/conf.d':'rw' 
  -v '/mnt/user/appdata/mysql8GHOSTsupportnet/initdb':'/docker-entrypoint-initdb.d':'rw'  
  --user=99:100  
  --memory=2G  
  --restart=unless-stopped 'mysql:8' mysqld  
  --log-error=/var/log/mysql/error.log  

UNRAID Dockercontainer mysql:8

docker run  
  -d  
  --name='GHOSTsupportnet'  
  --net='bridge'  
  --pids-limit 2048  
  -e TZ="Europe/Berlin"  
  -e HOST_OS="Unraid"  
  -e HOST_HOSTNAME="ASRockMini"  
  -e HOST_CONTAINERNAME="GHOSTsupportnet"  
  -e 'database__connection__host'='192.168.16.44'  
  -e 'database__connection__user'='ghost'  
  -e 'database__connection__password'='pw'  
  -e 'database__connection__database'='ghost'  
  -e 'url'='https://supportnet.ch'  
  -e 'mail__transport'='SMTP'  
  -e 'mail__options__service'='Mailgun'  
  -e 'mail__options__auth__user'='[email protected]'  
  -e 'mail__options__auth__pass'='pass'  
  -e 'database__connection__port'='3301'  
  -e 'mail__options__host'='smtp.eu.mailgun.org'  
  -e 'mail__options__port'='465'  
  -e 'mail__options__secure'='true'  
  -e 'database__client'='mysql'  
  -e 'NODE_ENV'='production'  
  -l net.unraid.docker.managed=dockerman  
  -l net.unraid.docker.icon='https://raw.githubusercontent.com/cheesemarathon/docker-templates/master/images/Ghost.png'  
  -p '2368:2368/tcp'  
  -v '/mnt/user/appdata/GHOSTsupportnet':'/var/lib/ghost/content':'rw' 'ghost:6'

Ghost Inhalte

Inhalt Methode Inhalt
Konto 'Owner' .jpg Avatar, Hintergrundbild
Theme .zip Ghost Theme (Bold)
Daten .json Pages, Posts, Einstellungen
Code injection css Anpassung des Themes
für Header und Footer
Redirects, Routes .yaml Dynamisches Routing
Einstellungen notieren Footnote text override, Header Farben,
Header und Post Layout
Mitglieder .csv Alle Mitglieder
about notieren Default Seite löschen,
Page URL auf 'about' setzen

Ghost Daten in eine neue, leere MySQL Datenbank wiederherstellen

Die Konfiguration erfolgt via Ghost Web-App.

  • Login 'Owner' erstellen:
    Das Konto 'Owner' muss beim ersten Login erstellt werden. Avatar und Hintergrundbild sichern.
  • Einstellungen / Theme / Change Theme:
    Bold Theme importiert.
  • Einstellungen / Migration tools / Universal import:
    Hier wird die vorher exportierte .json Datei hochgeladen. In dieser Datei sind die Inhalte und die meisten Einstellungen gesichert. Nach erfolgreichem Import erfolgte eine Bestätigung per E‑Mail.
  • Einstellungen / Code injection für Site header und Site footer:
    Überprüfen, ob die Inhalte mit der .json Datei importiert wurden. Das dauert manchmal etwas, grundsätzlich wird der Code zurückgesichert. Sicherheitshalber hatte ich ein separates Backup erstellt.
  • Einstellungen / Labs / Redirects, Routes:
    Überprüfen, ob die Inhalte mit der .json Datei importiert wurden. Eventuell separat sichern.
  • Einstellungen / Site / Design & branding / Customize / Brand:
    Accent color, Icon, Logo und Cover werden mit dem .json wiederhergestellt.
  • Einstellungen / Site / Design & branding / Customize / Theme:
    Footnote text override, Header foreground und background color sowie Header und Post Layout müssten manuell erfasst werden, da diese nicht gesichert werden.
    Achtung: 'Portal for membership experience' im 'Bold Theme' das ich hier verwende, muss aktiviert werden, sonst funktioniert die Anmeldung der Mitglieder nicht.
  • Seiten wie 'about':
    Standardseite löschen und mit eigener Seite ersetzen, indem die Page URL auf 'about' gesetzt wird.
  • Mitglieder:
    Hier können die Mitglieder als .csv exportiert und importiert werden.
    Achtung: Diese Daten sind nicht in der .json Datensicherung enthalten!

Auf Facebook teilen Auf Linkedin teilen Auf Twitter teilen Per E-Mail senden

Newsletter abonnieren

Abonnieren Sie den Newsletter für die neusten Nachrichten direkt in Ihrem Postfach.

einschreiben