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.