Installation von Discourse hinter Reverse Proxy mit empfohlener (unterstützter) Installation

In diesem Beitrag zeige ich Ihnen genau, wie Sie Discourse hinter einem Nginx Reverse Proxy ausführen. Und das unter Verwendung der unterstützten Installationsmethoden.

Voraussetzungen:

  1. Gültiger Domainname.
  2. Gültiges SSL-Zertifikat.
  3. Gültige DNS-Einträge, die auf den Domainnamen zeigen.
  4. Gültiger, funktionierender E-Mail-Server oder SMTP-Anbieter.
  5. Funktionierender Nginx Reverse Proxy und die Möglichkeit, auf die Instanz zuzugreifen und das SSL-Zertifikat für die spätere Verwendung zu erstellen.
  6. VM oder LxC-Container, auf dem Docker ausgeführt werden kann.

Für diese Anleitung verwende ich meine eigene Instanz als Beispiel, mit allen funktionierenden Features, Backups, Upgrades usw. Getestet für ca. 2 Wochen.

Meine Discourse VM-Spezifikationen:

  • CPU: 4 Kerne
  • RAM: 6 GB
  • Swap: 8 GB (SSD Swapfile)
  • Speicher: 50 GB (SSD)
  • Betriebssystem: Ubuntu 22.04.3

Sie können das Minimum verwenden, aber beim Testen. Discourse nutzt leicht 2 GB. Inaktive Nutzung beträgt ca. 1,48 GB von 6 GB.

HINWEIS: Diese Installation verwendet den Reverse Proxy, um die SSL-Zertifikate zu erstellen. Certbot kann stattdessen verwendet werden.

SCHRITT 1:

Laden Sie den neuesten Ubuntu Server von Get Ubuntu Server | Download | Ubuntu herunter.

SCHRITT 2:

  1. Installieren Sie Ubuntu Server auf der VM/LxC-Vorlage.
    1.1 Stellen Sie sicher, dass Ubuntu mit allen Serverpaketen auf dem neuesten Stand ist.
  2. Verwenden Sie die folgenden Befehle, um alle erforderlichen Pakete zu installieren:
apt update -y && apt upgrade -y && apt wget curl zip git docker.io nginx -y && reboot

SCHRITT 3:
Installation von Discourse. Folgen Sie dem Anfängerleitfaden discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

Stellen Sie eine SSH-Verbindung zu Ihrem Server her und geben Sie einfach Folgendes ein:

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

Nachdem Sie das obige erledigt haben, können Sie ./discourse-setup ausführen.

Befolgen Sie alle Schritte und geben Sie sie korrekt ein, da dies für eine erfolgreiche Installation entscheidend ist.
Die Schritte fragen nach Folgendem; Beispiel aus dem Setup-Leitfaden:

Lassen Sie die Installation laufen, sie kann je nach Ihrer Internetverbindung und Ihren Server-Spezifikationen eine Weile dauern. Die vollständige Installation mit meiner VM-Einrichtung dauerte etwa 5-8 Minuten.

SCHRITT 4:

Sobald die Installation abgeschlossen ist, sehen Sie den Startbefehl, den der Docker-Container verwendet, und die generierte Container-ID (Hash).

HINWEIS: Da Sie sich über das WAN hinter einem Proxy befinden, wird eine 502-Fehlermeldung angezeigt, und da der Container das Netzwerk von Docker verwendet, ist er über WAN oder LAN nicht erreichbar, es sei denn, Sie verbinden sich mit dem Netzwerk 172.17.0.1/16, was wir nicht benötigen werden.

Überprüfen Sie doppelt, ob die Installation abgeschlossen ist und der Docker-Container läuft, indem Sie Folgendes verwenden:

docker ps

Sie sollten die folgende Ausgabe erhalten.

CONTAINER ID   IMAGE                 COMMAND        CREATED      STATUS       PORTS     NAMES
XXXXXX   local_discourse/app   “/sbin/boot”   6 days ago   Up 7 hours             app

SCHRITT 5:
Aktualisieren der Datei app.yml, um sie an die Reverse-Proxy-Konfiguration anzupassen.

Öffnen Sie mit Ihrem bevorzugten Texteditor /var/discourse/container/app.yml.
Ersetzen/Kommentieren Sie die folgenden Zeilen aus: (dies wird vom lokalen Nginx gehandhabt)

  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Fügen Sie unmittelbar nach #- "templates/web.letsencrypt.ssl.template.yml" Folgendes hinzu:

- "templates/web.socketed.template.yml"

Kommentieren Sie dann den Expose-Bereich aus, da Discourse nun einen Websocket verwendet. Schließlich kann Nginx starten, da es die erforderlichen Ports 80 und 443 lokal freigibt.

#expose:
# - "80:80" # http
# - "443:443" # https

Um Discourse nun dazu zu zwingen, nur Links mit HTTPS bereitzustellen, fügen Sie im Abschnitt env Folgendes hinzu:

# FORCE SSL
DISCOURSE_FORCE_HTTPS: true

Um die Dinge endlich in Gang zu bringen, müssen Sie die App neu erstellen. Verwenden Sie dazu Folgendes:

cd /var/discourse
./launcher rebuild app

Lassen Sie dies laufen und abschließen. Um zu überprüfen, ob es erfolgreich war, stellen Sie sicher, dass der Docker-Ausführungsbefehl angezeigt wird, oder führen Sie einfach docker ps aus, und Sie sehen den laufenden Container.

SCHRITT 6:

Aktivieren von Nginx und Konfigurieren der Standardseite, um auf den Docker-Container zu verweisen. Ermöglicht dem Reverse Proxy den Zugriff auf den Container über das lokale Nginx.

Führen Sie Folgendes aus:

systemctl enable nginx && systemctl start nginx

Um zu überprüfen, ob es läuft. Versuchen Sie, die Standard-Landingpage für Nginx über Ihren Browser und Ihre lokale IP aufzurufen.
Z.B.:

http://10.10.0.4

Sie sollten eine Glückwunschseite von Nginx erhalten.

SCHRITT 7:
Aktualisieren der Standardkonfiguration auf Folgendes:
Leeren Sie zuerst die Konfigurationsdatei:

echo "" > /etc/nginx/sites-available/default

Öffnen Sie die Konfigurationsdatei mit Ihrem Texteditor und fügen Sie Folgendes hinzu:
HINWEIS: Aktualisieren Sie server_name mit Ihrer Domain und ssl_certificate, ssl_certificate_key mit dem Speicherort Ihres SSL-Zertifikats und Schlüssels.
Certbot kann verwendet werden, aber ich synchronisiere mein Zertifikat und meinen Schlüssel einfach von meinem Reverse Proxy.

server {
    listen 80; listen [::]:80;
    server_name add.yourdomain.com;
    server_tokens off;
    return 301 https://$host$request_uri;
}
# Default server configuration
#
server {
	# SSL configuration
	#
	server_tokens off;
	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;

    server_name add.yourdomain.com;
	ssl_certificate /etc/ssl/certs/your_ssl_cert.bundle;
	ssl_certificate_key /etc/ssl/private/your_ssl_cert.key;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
	ssl_prefer_server_ciphers on;
	location / {
		proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Real-IP $remote_addr;
	}
}

Speichern Sie die neue Standarddatei und führen Sie systemctl restart nginx aus.

SCHRITT 8:

Öffnen Sie Ihren Browser und rufen Sie die Domain Ihres Forums auf: https://somedomain.com. Sie werden mit der folgenden Seite begrüßt.

Das ist alles, fertig. Sie können dann die Schritte befolgen, um sich zu registrieren und Ihr Forum/Ihre Community zu starten :).

ZUSÄTZLICHER SCHRITT:

Wartung nach der Installation
Wir empfehlen dringend, automatische Sicherheitsupdates für Ihr Betriebssystem zu aktivieren. Verwenden Sie unter Ubuntu dpkg-reconfigure -plow unattended-upgrades.

Für Unterstützung können Sie einfach diese Community nutzen. Für das lokale Nginx können Sie gerne um Hilfe in diesem Beitrag bitten.

10 „Gefällt mir“

Das ist großartig. Vielen Dank.

Eine Sache, die ich als Verbesserung für diese Anleitung sehen würde, ist die Möglichkeit, statische Assets über nginx bereitzustellen.

Derzeit gehen alle statischen Anfragen an den Worker in der obigen Konfiguration. Ich versuche immer noch herauszufinden, wie ich dies umgehen kann, und werde ein Update posten, wenn ich es herausfinde.

Können Sie näher erläutern, welche statischen Dateien gemeint sind?

Sprechen Sie vielleicht über die statischen Seiten für 404, 302, 500 von nginx oder statische Seiten von Discourse?

Ich habe es mir kurz angesehen und festgestellt, dass die Umleitung für die 404-Seiten funktioniert. Die einzige Seite, die ich anscheinend nicht einrichten kann, ist die Seite für den 500-Fehler.

Können Sie etwas genauer sein, damit ich genau weiß, worum es geht. :slight_smile:

Dieser Leitfaden ist ausgezeichnet. Ich konnte ihm komplett folgen, bis ich die Webseite geladen habe. Ich erhalte die Fehlermeldung „zu viele Weiterleitungen“. Wenn ich die IP-Adresse verwende, funktioniert Discourse einwandfrei, aber ich kann das Problem mit den Weiterleitungen nicht lösen. So knapp davor.

Jede Hilfe wäre willkommen.

Danke.

Weiß jemand, wie ich dieses Problem lösen kann? Die Website funktioniert, aber ich bemerke diese Fehler in der Nginx-Fehlerprotokolldatei des Containers. Ich habe einen Reverse-Proxy gemäß den obigen Anweisungen eingerichtet.

Wenn ich mir /etc/nginx/conf.d/discourse.conf im Container ansehe, sehe ich:

upstream discourse { server 127.0.0.1:3000; }

Sollte das so aussehen?:

upstream discourse { http://unix:/var/discourse/shared/standalone/nginx.http.sock; }

Wenn ich in /var/log/nginx im Container nachsehe, sehe ich Fehler wie:

2025/02/09 21:00:21 [error] 69#69: *1 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.xxx.xxx, server: _, request: "POST /message-bus/b39980c2387e4750bc1e320cb6195424/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/b39980c2387e4750bc1e320cb6195424/poll?dlp=t", host: "discourse.xxxx.com"

2025/02/09 21:00:23 [error] 67#67: *3 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.xx.xxx, server: _, request: "GET /chat/api/me/channels HTTP/1.1", upstream: "http://127.0.0.1:3000/chat/api/me/channels", host: "discourse.xxxx.com"

2025/02/09 21:00:23 [error] 70#70: *5 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.xx.xxx, server: _, request: "POST /message-bus/d95b6999d26242f28f4875732b195440/poll HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/d95b6999d26242f28f4875732b195440/poll", host: "discourse.xxxx.com"

Vielen Dank!

Haben Sie Schritt 5 richtig befolgt? Es scheint, dass Sie keinen Socket verwenden.

Ja, ich benutze einen Socket am lokalen Reverse-Proxy außerhalb des Containers und habe Schritt 5 in app.yml befolgt.

/var/discourse/containers# grep web.socketed.template.yml app.yml
  - "templates/web.socketed.template.yml"

/var/discourse/containers# grep templates/web.ssl.template.yml app.yml
  #  - "templates/web.ssl.template.yml"

/var/discourse/containers# grep templates/web.letsencrypt.ssl.template.yml app.yml
  #  - "templates/web.letsencrypt.ssl.template.yml"

/var/discourse/containers# grep http app.yml

#  - "80:80"   # http
#  - "443:443" # https

/var/discourse/containers# grep DISCOURSE_FORCE_HTTPS app.yml
DISCOURSE_FORCE_HTTPS: true
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Uncomment the next line to enable the IPv6 listener
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Uncomment these two lines if you wish to add Lets Encrypt (https)
  #  - "templates/web.ssl.template.yml"
  #  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/web.socketed.template.yml"
## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
#expose:
#  - "80:80"   # http
#  - "443:443" # https

Ich habe das hier überprüft: Discourse working with jwilder /nginx proxy & acme-companion

aber ich kann es in Bezug auf mein Problem nicht wirklich verstehen…