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.
Quellen
Links:

MySQL 8 is the only supported database in production.

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!


