Ghost Blog in Docker an bestehenden Nginx (Host) anbinden – So geht’s ohne Port-Konflikte


Du hast bereits einen funktionierenden Nginx-Webserver auf deinem Linux-Server laufen, möchtest aber ein modernes Ghost CMS komplett isoliert in Docker betreiben? Wer hier einfach standardmäßig Port 80 freigibt, läuft sofort in einen Port-Konflikt. In dieser Anleitung zeige ich dir Schritt für Schritt, wie du Ghost und MariaDB in Docker aufsetzt, einen hohen Port nutzt und deinen nativen Nginx als Reverse Proxy vorschaltest.

1. Die Architektur: Warum dieses Setup?

Der native Nginx auf dem Host bleibt der Boss für Port 80 und 443 (SSL). Er nimmt die Anfragen für die Domain an und leitet sie intern an den Docker-Container weiter, der sicher auf einem hohen Port lauscht.

2. Das Docker-Compose Setup

version: '3.8'

services:
  db:
    image: mariadb:10.11
    container_name: "conatiner_name"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: DeinSicheresPasswort
      MYSQL_DATABASE: ghost_prod
      MYSQL_USER: ghost_user
      MYSQL_PASSWORD: DeinSicheresPasswort
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - blog_network

  ghost:
    image: ghost:5-alpine
    container_name: "container_name"
    restart: always
    depends_on:
      - db
    ports:
      - "127.0.0.1:58080:2368" # Lokal an den Host gebunden
    environment:
      url: https://DeineDomain.de
      database__client: mysql
      database__connection__host: db
      database__connection__user: ghost_user
      database__connection__password: DeinSicheresPasswort
      database__connection__database: ghost_prod
    volumes:
      - ghost_content:/var/lib/ghost/content
    networks:
      - blog_network

networks:
  blog_network:
    driver: bridge

volumes:
  db_data:
  ghost_content:

3. Die Nginx-Konfiguration auf dem Host

server {
    listen 80;
    server_name deinedomain.de www.deinedomain.de;

    location / {
        proxy_pass http://127.0.0.1:58080;
        proxy_set_header Host $http_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;
        proxy_buffering off;
    }
}

4. SSL-Verschlüsselung (Der finale Schritt)

Da Ghost in der Konfiguration zwingend eine https://-URL voraussetzt, ist die SSL-Verschlüsselung kein optionales Feature, sondern absolut essenziell. Ohne ein gültiges SSL-Zertifikat blockiert Ghost die Weiterleitung, und dein Nginx-Server quittiert den Dienst mit einem frustrierenden 502 Bad Gateway.

Je nachdem, wie du deinen nativen Nginx auf dem Host verwaltest, hast du zwei einfache Möglichkeiten, das kostenlose Let's Encrypt Zertifikat zu installieren:

Variante A: Über eine Nginx-Weboberfläche (Plesk, Webmin etc.)

Wenn du ein Web-Panel nutzt, musst du keine Befehle in die Konsole eintippen:

  1. Öffne die SSL/TLS-Einstellungen deiner Domain innerhalb der Oberfläche.
  2. Wähle Zertifikat anfordern via Let's Encrypt.
  3. Achte unbedingt darauf, den Haken bei "Inklusive www-Subdomain" (www.decastro.ai) zu setzen.
  4. Der wichtigste Klick: Aktiviere die Option "HTTPS-Redirect erzwingen". Dadurch wird jeder unverschlüsselte HTTP-Aufruf automatisch auf die sichere HTTPS-Variante umgeleitet, was Ghost zwingend benötigt.

Variante B: Manuell über die Konsole mit Certbot

Falls du deinen Nginx klassisch über Konfigurationsdateien im Terminal steuerst, übernimmt Certbot die Arbeit für dich. Führe einfach folgenden Befehl aus:

sudo certbot --nginx -d deinedomain.de -d www.deinedomain.de

Certbot erkennt deine bestehende Nginx-Konfiguration automatisch, fordert das Zertifikat an und bettet die SSL-Zertifikatspfade direkt in deine Config-Datei ein. Wähle bei der abschließenden Abfrage die Option Redirect (meistens Option 2), um den automatischen HTTPS-Zwang zu aktivieren. Starte danach Nginx einmal neu (systemctl restart nginx), und dein Blog läuft fehlerfrei.

5. Fazit

Mit diesem Setup schlägst du zwei Fliegen mit einer Klappe: Dein Ghost-Blog inklusive der MariaDB läuft komplett isoliert, sicher und updatesicher in seiner eigenen Docker-Umgebung. Gleichzeitig behältst du deinen bestehenden Nginx-Webserver auf dem Host als zentralen Einstiegspunkt, ohne wertvolle IP-Adressen oder Ports zu verschwenden.

Das System ist extrem ressourcensparend, belastet den Server kaum und sorgt dafür, dass dein Debian-Host-System absolut sauber und frei von unbemerktem Konfigurationsmüll bleibt. Das perfekte Fundament für ein stabiles, performantes und wartungsarmes Self-Hosting-Projekt!