In diesem Beitrag gehe ich auf das Konfiguration von Ghost mithilfe von Docker-Compose ein. Die Applikation wird sich hinter einem Nginx Reverse Proxy befinden.

Erstellen der Docker-Compose Konfiguration

Als Docker-Image für Ghost werde ich das offizielle Docker-Image von Ghost verwenden. Ebenso wird das in der Dokumentation beschriebene MySQL-Image in der Version 5.7 als MySQL-Datenbank verwendet.

Ghost Konfigurieren

Ghost kann mithilfe von Umgebungsvariablen konfiguriert werden.
Mit Umgebungsvariablen kann die Struktur der üblichen Konfiguration im .json Format abgebildet werden.

Die Umgebungsvariablen müssen klein geschrieben werden und es wird ein doppelter Unterstrich verwendet um Verschachtelung abzudecken.

Beispiel (json-Konfiguration):

"database": {
  "client": "mysql",
  "connection": {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "your_database_user",
    "password": "your_database_password",
    "database": "your_database_name"
  }
}

Beispiel (Umgebungsvariablen):

database__client=mysql
database__connection__host=127.0.0.1
database__connection__port=3306
database__connection__user=your_database_user
database__connection__password=your_database_password
database__connection__database=your_database_name

Daten Persistieren

Damit die Daten auch beim Löschen der Container bestehen bleiben müssen volumes angelegt werden.

Daten wie z.B. Bilder werden von Ghost im Verzeichnis /var/lib/ghost/content gespeichert. Alle MySQL Daten werden vom MySQL-Container im Ordner /var/lib/mysql gespeichert.
Für diese Pfade müssen in der Docker-Compose Konfiguration volumes definiert werden und im jeweiligen Container an den Pfad gebunden werden.

Finale Docker-Compose Konfiguration

version: '3.1'

services:
  ghost:
    image: ghost:3-alpine
    ports:
      - 127.0.0.1:2368:2368
    environment:
      # Datenbankverbindung
      database__client: mysql
      database__connection__host: ghost_db
      database__connection__user: root
      database__connection__password: ersetzenDurchEinSicheresPasswort
      database__connection__database: ghost
      # Email Konfiguration
      mail__transport: 'SMTP'
      mail__from: 'Mein Blog <mail@mail.mail>'
      mail__options__service: 'SMTP'
      mail__options__host: 'smtp.mail.server'
      mail__options__port: '587'
      mail__options__auth__user: 'mail@mail.mail'
      mail__options__auth__pass: 'dasMailPasswort'
      url: https://blog.example.com
    volumes:
      - ghost_content:/var/lib/ghost/content
    restart: always
    depends_on:
      - ghost_db

  ghost_db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ersetzenDurchEinSicheresPasswort
    volumes:
      - ghost_data:/var/lib/mysql

volumes:
  ghost_data:
  ghost_content:

Starten der Docker-Compose Konfiguration

Nun kann die Docker-Compose Konfiguration schon gestartet werden:

docker-compose pull
docker-compose up -d

Die Anwendung läuft nun Lokal auf dem Host-Gerät und kann unter Port 2368 erreicht werden (nur auf dem ausführenden Gerät).

Nginx Reverse Proxy Konfigurieren

Nginx Installieren (Debian / Ubuntu)

sudo apt update
sudo apt install nginx

Sollte eine Firewall auf dem Host aktiviert sein, so kann nun der Port 80 sowie 443 freigegeben werden.

Nginx Reverse Proxy Konfigurieren

In der folgenden Konfiguration wird die Domain festgelegt unter welcher Ghost später erreichbar sein wird. Außerdem wird festgelegt auf welchen Host sowie Port "weitergeleitet" werden soll.

Hierfür muss zunächst eine neue Konfiguration für Nginx angelegt werden. Erstelle hierfür eine neue Datei unter /etc/nginx/sites-available/ welche am besten nach der Domain welche verwendet werden soll benannt ist (zur Übersicht).

sudo nano /etc/nginx/sites-available/blog.example.com

Erstelle nun folgende Konfiguration:

server {
        # Port für den Zugriff von Außen
        listen 80;
        listen [::]:80;

		# Auflistung von Domains (Leerzeichen getrennt)
        # auf welche diese Konfiguration 
        # zutreffen soll
        server_name blog.example.com;

        location / {
                # Lokaler Ghost Host (http)
                proxy_pass http://localhost:2368;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Anschließend muss die Konfiguration Nginx zugänglich gemacht werden. Hierfür kann ein Symbolischer Link zum sites-enabled Ordner erstellt werden.

sudo ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled

Anschließend kann die Nginx-Konfiguration mithilfe von sudo nginx -t überprüft werden. Sind keine Fehler vorhanden kann nun der Nginx-Dienst neu gestartet werden und somit die Konfiguration übernommen werden.

sudo service nginx restart

Konfiguration von TLS mit Let's Encrypt

Installieren von Certbot

Solltest du noch nicht Certbot auf dem Host installiert haben, kannst du dies einfach mit der Anleitung von Certbot machen: https://certbot.eff.org/
Wähle auf der Seite einfach Nginx als Software und das Betriebssystem des Servers aus. Anschließend steht eine Anleitung zur Installation bereit.

Zertifikat generieren

Wie auch in der Anleitung des Certbot beschrieben kann nun ein Zertifikat automatisch generiert und eingebunden werden. Führe dafür folgenden Befehl aus:

sudo certbot --nginx

Wähle anschließend die Domain aus für welche das Zertifikat erstellt werden soll.

Fertig! Du solltest nun auf deinen Ghost Blog zugreifen können.

Unter /ghost kannst du dir nun einen Admin Account anlegen und loslegen.