Installation von Ghost CMS mit Docker-Compose und externem Nginx

In diesem Artikel werde ich Schritt für Schritt erklären, wie man Ghost CMS mithilfe von Docker-Compose und einem externen Nginx-Proxy unter der Domain Domain.tld einrichtet.

Installation von Ghost CMS mit Docker-Compose, externem Nginx Proxy und der Domain Domain.tld

Die Installation und Konfiguration eines Content Management Systems (CMS) wie Ghost kann manchmal etwas knifflig sein, besonders wenn man Docker und Nginx als Proxy verwenden möchte. In diesem Artikel werde ich Schritt für Schritt erklären, wie man Ghost CMS mithilfe von Docker-Compose und einem externen Nginx-Proxy unter der Domain Domain.tld einrichtet.

Voraussetzungen

Bevor wir beginnen, stellen wir sicher, dass wir die folgenden Tools auf unserem Server installiert haben:

  • Docker
  • Docker-Compose
  • Nginx
  • Ein registrierter Domainname (Domain.tld in unserem Fall)
  • Zugriff auf die DNS-Einstellungen deiner Domain
  • Certbot

Schritt 1: Einrichtung der DNS-Einstellungen

Zunächst müssen wir sicherstellen, dass unsere Domain auf den Server zeigt, auf dem wir Ghost installieren möchten. Dazu fügen wir in den DNS-Einstellungen unserer Domain einen A-Record hinzu, der auf die IP-Adresse unseres Servers zeigt.

Schritt 2: Einrichtung der Docker-Compose Datei

Erstelle ein neues Verzeichnis für dein Ghost-Projekt und wechsle in dieses Verzeichnis: mkdir ghost-project cd ghost-project

Erstelle dann eine docker-compose.yml Datei mit folgendem Inhalt:

version: '3.1'

services:

  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 2368:2368
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      database__client: mysql
      database__connection__host: db
      database__connection__user: ghost
      database__connection__password: password
      database__connection__database: ghost
      mail__transport: SMTP
      mail__options__host: 'smtp.mailgun.com'
      mail__options__port: '465'
      mail__options__secureConnection: 'true'
      mail__options__service: 'mailgun'
      mail__options__auth__user: 'postmaster@domain.tld'
      mail__options__auth__pass: 'email password '
      # this url value is just an example, and is likely wrong for your environment!
      url: https://domain.tld
      # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
      #NODE_ENV: development
    volumes:
      - ./ghost:/var/lib/ghost/content

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: superSecretPassword
      MYSQL_USER: ghost
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: ghost
    volumes:
      - ./db:/var/lib/mysql

volumes:
  ghost:
  db:

Schritt 3: Einrichtung des externen Nginx-Proxies

Nun richten wir den externen Nginx-Proxy ein. Dazu verwenden wir einen bestehenden Nginx-Proxy oder richten einen neuen ein. Hier ist ein Beispiel für eine nginx.conf Datei:

server {
    listen 80;
    listen [::]:80;
    server_name www.domain.tld domain.tld;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/certbot;
    } 

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.domain.tld domain.tld;

    ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://0.0.0.0: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;
    }
}

Speichere diese Konfiguration in der Nginx-Konfigurationsdatei und starte Nginx neu: bash sudo systemctl restart nginx

Schritt 4: Starten der Ghost-Instanz

Jetzt sind wir bereit, unsere Ghost-Instanz zu starten. Navigiere in das Verzeichnis, in dem sich deine docker-compose.yml Datei befindet, und führe folgenden Befehl aus: bash docker-compose up -d

Dieser Befehl startet die Ghost-Instanz im Hintergrund. Du kannst den Status der laufenden Container überprüfen mit: bash docker-compose ps

Schritt 5: SSL-Zertifikat einrichten

Um die Sicherheit unserer Webseite zu gewährleisten, sollten wir ein SSL-Zertifikat hinzufügen. Wir können Let’s Encrypt zusammen mit Certbot verwenden, um ein kostenloses SSL-Zertifikat zu erhalten.

Installiere zunächst Certbot: bash sudo apt-get install certbot python3-certbot-nginx

Führe dann den Certbot-Befehl aus, um ein Zertifikat für unsere Domain zu erhalten und die Nginx-Konfiguration zu aktualisieren: bash sudo certbot --nginx -d www.domain.tld -d domain.tld

Folge den Anweisungen auf dem Bildschirm, um den Prozess abzuschließen. Nach erfolgreicher Installation und Konfiguration sollte deine Webseite nun über HTTPS erreichbar sein.

Fazit

Mit diesen Schritten haben wir erfolgreich Ghost CMS auf einem Server mithilfe von Docker-Compose und einem externen Nginx-Proxy eingerichtet. Die Verwendung von Docker erleichtert die Verwaltung und Wartung der Ghost-Instanz erheblich, während Nginx als Reverse-Proxy und Let’s Encrypt für die Sicherheit der Webseite sorgt. Mit dieser Konfiguration ist deine Webseite bereit, Inhalte zu veröffentlichen und sicher im Internet verfügbar zu sein.

Für weitere Informationen und detailliertere Konfigurationsmöglichkeiten empfehle ich die offiziellen Dokumentationen von Ghost und Docker. Viel Erfolg bei der Einrichtung deiner Ghost-Webseite!