Wenn du auf demselben Server, auf dem Discourse läuft, weitere Websites betreiben möchtest, musst du einen zusätzlichen NGINX- oder HAProxy-Proxy vor dem Docker-Container einrichten.
HINWEIS: Dies ist für fortgeschrittene Administratoren
Diese Anleitung geht davon aus, dass Discourse bereits funktioniert – falls dem nicht so ist, kann es schwierig sein zu erkennen, ob die Konfiguration korrekt ist.
Du kannst ./discourse-setup nicht verwenden, um Discourse einzurichten, wenn ein anderer Server bereits Port 80 oder 443 nutzt. Stattdessen musst du samples/standalone.yml mit deinem bevorzugten Texteditor kopieren und bearbeiten.
Nginx außerhalb des Containers installieren
Stelle zunächst sicher, dass der Container nicht läuft:
cd /var/discourse
./launcher stop app
Installiere anschließend nginx und certbot:
sudo apt-get update && sudo apt-get install nginx certbot python3-certbot-nginx
Die Container-Definition ändern
Hier ändern wir, wie Discourse tatsächlich eingerichtet wird. Der Container soll nicht auf Ports hören – stattdessen weisen wir ihn an, auf einer speziellen Datei zu lauschen.
Du musst /var/discourse/containers/app.yml bearbeiten, um SSL zu deaktivieren und eine Vorlage zum Erstellen der nginx-Socket-Datei hinzuzufügen. Die Datei sollte wie folgt aussehen:
# Verwendete Basisvorlagen; du kannst die Anzahl der Vorlagen reduzieren, um weniger Funktionen pro Container einzubinden:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
# - "templates/web.ssl.template.yml" # entfernen – HTTPS wird vom äußeren nginx verarbeitet
# - "templates/web.letsencrypt.ssl.template.yml" # entfernen – HTTPS wird vom äußeren nginx verarbeitet
- "templates/web.socketed.template.yml" # <-- Hinzugefügt
Achte darauf, die freigegebenen Ports zu entfernen oder zu kommentieren, indem du ein # davor setzt.
# Welche Ports sollen freigegeben werden?
# expose: Kommentiere den gesamten Abschnitt aus, indem du vor jede Zeile ein # setzt
# - "80:80" # http
# - "443:443" # https
Nun kannst du
/var/discourse/launcher rebuild app
ausführen, um Discourse neu aufzubauen und seine Daten über den Socket verfügbar zu machen.
Falls du einen anderen Reverse-Proxy verwendest, der keine WebSockets unterstützt, kannst du stattdessen einen anderen Port im obigen Abschnitt freigeben, z. B. - 8080:80.
Eine NGINX-„Site“ für den äußeren nginx erstellen
Erstelle eine Site-Datei für Discourse:
cd /etc/nginx/sites-available
cp default discourse.example.com
cd ../sites-enabled
ln -s ../sites-available/discourse.example.com
Bearbeite anschließend diese Datei, indem du die folgenden Zeilen kommentierst:
#listen 80 default_server;
#listen [::]:80 default_server;
und den server_name- und location-Block wie folgt anpasst:
server_name discourse.example.com; # <-- dies ändern
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 $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
Bei einer Installation mit zwei Containern lautet die Socket-Zeile:
proxy_pass http://unix:/var/discourse/shared/web-only/nginx.http.sock:;
Führe anschließend in einem Terminal aus:
certbot --nginx
und folge den Anweisungen. Falls du die Prompts nicht verstehst, solltest du dies wahrscheinlich nicht tun – du kannst jedoch zur Hilfe die certbot-Dokumentation konsultieren.
@pfaffman ist der Ansicht, dass certbot dies automatisch für dich erledigt. Falls du jedoch Änderungen an der nginx-Konfiguration vornimmst, musst du
sudo service nginx reload
ausführen.
Deine weiteren Sites erstellen
Der Discourse-Abschnitt ist damit abgeschlossen!
Erstelle weitere NGINX-„Sites“, verknüpfe und aktiviere sie wie im letzten Schritt oben beschrieben.
Tipps
sudo netstat -tulpn: Zeigt an, welche Ports belegt sind/var/log/nginx/error.log: Pfad zur nginx-Logdatei unter Ubuntu. Hier findest du Informationen, falls du einen 502 Bad Gateway-Fehler erhältst.