Wie denn? Was denn? Schon wieder CMS?
Meine Freundin möchte schon länger eine eigene Seite haben. Da ich mich in letzter Zeit recht viel damit befasst habe, übernehme ich gerne diese Aufgabe. Nachdem sie kaum mit Markdown-Notizen herumhantieren möchte, um damit, so wie ich, eine statische HTML Seite zu basteln, dann braucht sie ein CMS (Content Management System). Das bekannteste ist dabei Wordpress; eben jenes Wordpress, dem ich gerade den Rücken gekehrt habe. Aber bevor ich mich hinsetze und erst recht wieder Wordpress aufsetze, habe ich eine kleine Recherche gestartet und dabei bin ich auf Ghost gestoßen. Diese sog. Blogging Plattform kostet in der gehosteten Variante zwar auch schnell knapp zehn Euro im Monat, aber nachdem es Open Source ist, kann man die Software auch auf einem eigenen Server installieren. Das probieren wir gleich einmal aus!
Ghost als Docker Compose Container installieren
Hier findet sich die Anleitung für das Installieren von Ghost via Docker. Das Beispielsfile findet sich hier.
Ich lege meine Docker Container, samt Containerdaten, immer gerne unter /opt
+ entsprechende Unterordner ab, daher passe ich die Anleitung etwas an. So schaut die angepasste docker-compose.yml Datei aus:
version: '3.8'
services:
ghost:
image: ghost:5-alpine
restart: always
ports:
- "8081:2368"
environment:
database__client: ${DATABASE_CLIENT}
database__connection__host: ${DATABASE_HOST}
database__connection__user: ${DATABASE_USER}
database__connection__password: ${DATABASE_PASSWORD}
database__connection__database: ${DATABASE_NAME}
url: ${URL}
volumes:
- ./data/ghost:/var/lib/ghost/content
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- ./data/db:/var/lib/mysql
Für diese Dinge verwende ich zurzeit gerne GPT-4, da ich dort flott die relevanten Komponenten erklärt bekomme, die ich nicht ganz verstehe, und wenn ich Änderungswünsche habe, dann kann ich die in natürlicher Sprache formulieren und bekomme meist auch gleich etwas Funktionales raus. Hier sind die Volumes-Pfade auch relativ gesetzt, das heißt die Unterordner gehen immer vom Speicherort des docker-compose.yml aus. Also packen’s wir an.
Im gewünschten Ordner erstellt man zuerst mit mkdir ghost
den Projektordner, dann mit nano docker-compose.yml
die YAML-Konfigdatei und kopiert sogleich den obigen Inhalt, schließt und speichert die Datei ab. Anschließend braucht es aber auch noch eine .env
Datei, wo die sensiblen Daten gespeichert werden. Wieder mit nano .env
die Datei erstellen und folgendes reinkopieren:
MYSQL_ROOT_PASSWORD=example
DATABASE_CLIENT=mysql
DATABASE_HOST=db
DATABASE_USER=root
DATABASE_PASSWORD=example
DATABASE_NAME=ghost
URL=http://0.0.0.0:8081
Achtung, der DATABASE_USER
darf nicht geändert werden und die beiden Passwörter müssen gleich sein, sonst funktioniert es nicht, siehe unten.
Anschließend muss man noch die entsprechenden Ordner manuell erstellen, denn wenn man das vergisst, werden die zwar erstellt, aber mit reinem root-Zugriff. Das heißt der Container selbst kann dann nicht auf die Daten zugreifen.
Jetzt kann der Container mit docker compose up -d
gestartet werden und die Images werden runtergeladen…
… und gestartet:
Probleme mit der Datenbank
Der Erststart hat gleich einmal nicht funktioniert. Um In den Logs nachzuschauen schreibt man docker compose logs ghost
bzw. docker compose logs db
. Für Ersteres habe ich das hier bekommen:
Erst nachdem ich die .env
angepasst habe und die beiden Passwörter angeglichen habe, sowie die bestehende Datenbank mit…
sudo rm -rf /path/to/your/ghost/data/*
sudo rm -rf /path/to/your/mysql/data/*
… etwas unelegant gelöscht habe hat es funktioniert.
Und dann wird man schon von der generischen Geisterseite begrüßt:
Um in den Adminbereich zu kommen, muss man noch /ghost
and die URL hängen und schon kann man dem Installation Wizard folgen.