Discourse mit WordPress (Docker) auf einem einzigen VPS mit Nginx Reverse Proxy betreiben

Einleitung

Standardmäßig bindet eine „Standalone“-Installation von Discourse an die Ports 80 und 443. Um eine andere Anwendung wie WordPress auf demselben Server zu hosten, müssen Sie Discourse so neu konfigurieren, dass es auf einem internen Port lauscht, und einen Nginx auf Host-Ebene als Reverse-Proxy verwenden, um den Datenverkehr und die SSL-Zertifikate zu verwalten.


1. Architekturübersicht

  • Host Nginx: Das primäre Gateway, das auf den Ports 80 und 443 lauscht. Es übernimmt die SSL-Terminierung und leitet Anfragen basierend auf dem server_name an den entsprechenden Container weiter.

  • Discourse Container: Neu konfiguriert, um auf localhost:8080 zu lauschen.

  • WordPress Container: Wird über Docker Compose verwaltet und lauscht auf localhost:8081.


2. Phase A: Neukonfiguration von Discourse

Ändern Sie Ihre /var/discourse/containers/app.yml, um die öffentlichen Ports freizugeben:

  1. Port-Mapping ändern:

    YAML

    expose:
      - "8080:80"   # Ordnet Host-Port 8080 dem Container-Port 80 zu
    
    
  2. Internes SSL deaktivieren: Kommentieren Sie die SSL- und Let’s Encrypt-Vorlagen aus:

    YAML

    templates:
      - "templates/postgres.template.yml"
      - "templates/redis.template.yml"
      - "templates/web.template.yml"
      # - "templates/web.ssl.template.yml"
      # - "templates/web.letsencrypt.ssl.template.yml"
    
    
  3. Neu erstellen: Führen Sie ./launcher rebuild app aus.


3. Phase B: Bereitstellung von WordPress über Docker Compose

Organisieren Sie Ihre WordPress-Site in einem dedizierten Verzeichnis. Stellen Sie sicher, dass das Datenbank-Volume persistent ist, um Datenverlust zu vermeiden.

YAML

services:
  db:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: 'your_secure_password'
    volumes:
      - ./mysql_data:/var/lib/mysql
  wordpress:
    image: wordpress:latest
    ports:
      - "8081:80"
    volumes:
      - .:/var/www/html


4. Phase C: Finale Nginx-Konfiguration (SSL & Port 443)

Ein professionelles Setup im Jahr 2025 erfordert vollständige HTTPS- und HTTP/2-Unterstützung. Nachdem Sie Nginx auf Ihrem Host installiert haben (sudo apt install nginx), erstellen Sie eine Konfiguration für Ihre Domains.

Profi-Tipp: Führen Sie sudo certbot --nginx aus, um die SSL-Blöcke automatisch zu generieren, stellen Sie jedoch sicher, dass diese die folgenden Proxy-Header enthalten, damit Discourse korrekt funktioniert.

Nginx

server {
    listen 443 ssl http2;
    server_name discourse.com;

    # SSL-Zertifikate von Certbot
    ssl_certificate /etc/letsencrypt/live/discourse.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/discourse.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        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; # Entscheidend für die HTTPS-Erkennung von Discourse
    }
}


5. Mühsam erworbene Lektionen & Best Practices

  • Datenbank-Anmeldeinformationen: Wenn Ihre Passwörter Sonderzeichen wie & oder ? enthalten, fassen Sie diese in Konfigurationsdateien und Terminalbefehlen immer in einfache Anführungszeichen ' ' ein, um Fehler bei der Shell-Interpretation zu vermeiden.

  • Dateiberechtigungen: WordPress-Container laufen als www-data (UID 33). Wenn Sie Dateien als root hochladen oder entpacken, müssen Sie chown -R 33:33 . ausführen, um 500 Internal Server Errors zu vermeiden.

  • Cloudflare-Einstellungen: Wenn Sie ein SSL-Zertifikat auf dem Server verwenden (Let’s Encrypt), stellen Sie SSL/TLS von Cloudflare auf Full (Strict) ein. Dies verhindert die Schleife „Zu viele Weiterleitungen“, die häufig durch den Modus „Flexible“ verursacht wird.

  • Persistente Volumes: Führen Sie niemals docker compose down oder rebuild aus, ohne zu überprüfen, ob Ihre Datenbankdateien in einem persistenten Volume (z. B. ./mysql_data) gespeichert sind.


Fazit: Das Entkoppeln Ihrer Anwendungen von den Ports 80/443 mithilfe eines Reverse-Proxys ist der skalierbarste Weg zur Verwaltung eines Multi-Site-VPS. Es ermöglicht eine zentralisierte SSL-Verwaltung und einfache Fehlerbehebung über die Nginx-Protokolle auf Host-Ebene.

2 „Gefällt mir“