Verwenden Sie Nginx Proxy Manager, um mehrere Websites mit Discourse zu verwalten

EDIT: @pfaffman hat dies basierend auf dem, was @tophee zuvor geschrieben hatte, als eigenständiges Thema neu verfasst. Es wurde von mir noch nicht getestet, und ich habe Chris’ Worte umgestellt, sodass etwaige Fehler wahrscheinlich auf @pfaffman zurückzuführen sind.

Gibt es Gründe, nicht stattdessen NGINX Proxy Manager zu verwenden, anstatt dies manuell wie in Run other websites on the same machine as Discourse beschrieben durchzuführen?

Ich verwende ihn bereits. Ich habe ihn seit geraumer Zeit auf meinem Heimserver und als ich meine Discourse-Instanz auf einen neuen Cloud-Server migriert habe, fiel mir auf, dass ich die meisten der NGINX-Reverse-Proxy-Einstellungen vergessen hatte, die ich vor 4 Jahren auf dem alten Server vorgenommen hatte. Also dachte ich: Warum nicht NGINX Proxy Manager dafür verwenden? Zu meiner Überraschung stellte ich fest, dass er hier auf Meta nur selten erwähnt wurde, und ich begann zu überlegen, ob es Nachteile gibt, die ich übersehen habe …

Tatsächlich erforderte dies ein wenig Versuch und Irrtum, aber ich habe es wie folgt zum Laufen gebracht (keine Garantie, dass dies der beste Weg ist – tatsächlich weiß ich, dass es einen besseren geben muss – daher sind Korrekturen und Verbesserungen sehr willkommen):

Zu Beginn gibt es zwei Möglichkeiten, auf Ihre Discourse-Instanz zuzugreifen: 1. durch Freigabe eines Ports, 2. über WebSocket. Ich glaube, ich habe irgendwo in diesem Forum gelernt, dass WebSocket schneller/effizienter ist, daher verwende ich das, aber das Freigeben eines Ports sollte viel einfacher sein. Wenn Sie also den Socket nicht zum Laufen bekommen, versuchen Sie es mit einem freigegebenen Port. Um Verwirrung zu vermeiden: Um über einen Port auf Discourse zuzugreifen, befolgen Sie die Schritte 0, 1, 2, 3, 4 und 8 unten. Wenn Sie einen WebSocket verwenden möchten, befolgen Sie die Schritte 0, 1, 5, 6, 7, 8 und 9.

0. Ausgangspunkt

Gehen wir also davon aus, dass Sie die 30-minütige Standardinstallation abgeschlossen haben, und nehmen wir an, Sie haben Discourse noch kein Lets-Encrypt-Zertifikat erteilen lassen – denn bei Verwendung eines Reverse-Proxy wird es nicht benötigt. NGINX Proxy Manager übernimmt das. Es spielt jedoch keine Rolle, ob Sie bereits ein Zertifikat haben. NGINX Proxy Manager wird einfach ein neues erhalten.

1. NGINX Proxy Manager installieren

Der nächste Schritt ist die Installation von NGINX Proxy Manager, sodass Sie zwei weitere Docker-Container ausgeführt haben (NGINX Proxy Manager und dessen Datenbank-Container).

Als Nächstes kommt der knifflige Teil, den Sie angesprochen haben.

Das erste Hindernis ist, dass Discourse im Standard-Docker-bridge-Netzwerk läuft, während NGINX Proxy Manager standardmäßig in einem standardmäßig erstellten „benutzerdefinierten Netzwerk" läuft (in meinem Fall npm_default genannt), was bedeutet, dass NGINX Proxy Manager Discourse nicht sehen kann. :cry:

2. Alle Container in das Standard-bridge-Netzwerk bringen

Solange ich nicht weiß, ob und wie Discourse in ein benutzerdefiniertes Netzwerk verschoben werden kann, müssen wir NGINX Proxy Manager in das Standard-bridge-Netzwerk verschieben. Dies können wir tun, indem wir network_mode: bridge zu beiden NGINX Proxy Manager-Containern in unserer docker-compose-Datei hinzufügen.

3. IP-Adresse anstelle des Dienstnamens verwenden

Das nächste Problem ist, dass die Standard-docker-compose-Datei nicht mehr funktioniert, wenn Sie sie einfach in das bridge-Netzwerk verschieben. NGINX Proxy Manager kann seinen Datenbank-Container nicht mehr finden. Dies liegt daran, dass die interne DNS-Auflösung für Dienstnamen (auf die sich die docker-compose-Datei verlässt) nur in benutzerdefinierten Netzwerken verfügbar ist, nicht jedoch in den Standard-Docker-Netzwerken. Wir müssen uns also auf hart kodierte IP-Adressen zurückziehen (was bedeutet, dass dies definitiv nicht die optimale Lösung ist, da sie fehlschlägt, wenn sich die Container-IPs ändern). Sie müssen also den Container starten, auch wenn Sie wissen, dass er nicht funktionieren wird, notieren Sie sich die IP des NGINX Proxy Manager-Datenbank-Containers und ersetzen Sie DB_MYSQL_HOST: "db" in Ihrer docker-compose-Datei durch DB_MYSQL_HOST: "<db_container_IP>".

Jetzt sollten sich alle Container im Standard-bridge-Netzwerk befinden, damit NGINX Proxy Manager sowohl Discourse als auch dessen Datenbank sehen kann.

4. Discourse zugänglich machen

Aber Discourse „sehen" und darauf zugreifen können, ist nicht dasselbe. Sie müssen also sicherstellen, dass Discourse den gesamten Verkehr akzeptiert, den NGINX Proxy Manager weiterleitet. Wenn Ihnen die Verwendung des WebSockets egal ist, können Sie NGINX Proxy Manager einfach auf Port 80 (nicht 443) der Discourse-Container-IP zeigen, wie hier:

Das habe ich jedoch nicht getestet. Wie erwähnt, verwende ich das WebSocket-Setup, das weitere Schritte erfordert. Beachten Sie, dass der oben genannte Hostname/IP und Port ignoriert werden, wenn Sie den WebSocket verwenden.

5. app.yml konfigurieren, um WebSocket zu verwenden

Dies wird im Originalbeitrag (OP) erklärt, daher gehe ich nicht weiter darauf ein.

6. WebSocket im NGINX Proxy Manager-Container einbinden

Wir müssen NGINX Proxy Manager Zugriff auf den WebSocket gewähren, indem wir ihn als Volume einbinden: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Dies ist die letzte Änderung an der Standard-docker-compose-Datei von NGINX Proxy Manager, also hier die finale Version, die bei mir funktioniert:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. NGINX Proxy Manager konfigurieren, um den WebSocket zu verwenden

Letzter Schritt: Weisen Sie NGINX Proxy Manager an, den WebSocket zu verwenden. Soweit ich mich erinnere, reichte es nicht aus, einfach „WebSocket-Unterstützung" einzuschalten, also habe ich den NGINX-Location-Eintrag aus dem OP in den Reiter „Erweitert" kopiert, wie hier:

Ich habe dies nicht unter dem Reiter „Benutzerdefinierte Standorte" zum Laufen gebracht.

8. SSL nicht vergessen zu aktivieren

Ich habe die SSL-Konfiguration in NGINX Proxy Manager nicht erwähnt, da sie ziemlich offensichtlich erscheint und ich nicht denke, dass es wichtig ist, zu welchem Zeitpunkt im Prozess Sie sie aktivieren. Wenn Sie es also noch nicht getan haben, sieht meine Konfiguration so aus:


9. Wichtiger Hinweis

tl;dr: Wann immer Sie den Discourse-Container neu starten, müssen Sie auch den Haupt-NGINX Proxy Manager-Container neu starten (die Datenbank muss nicht neu gestartet werden).
Wenn Sie über den WebSocket auf Discourse zugreifen, müssen Sie beachten, dass beim Neuaufbau Ihres Discourse-Containers (was alle paar Monate erforderlich ist, um das Basis-Image zu aktualisieren), der vorherige WebSocket gelöscht und ein neuer erstellt wird. Infolgedessen verliert NGINX Proxy Manager die Verbindung zu Ihrer Discourse-Instanz und wirft einen 502-Fehler. Vielleicht wird ein zukünftiges Update von NGINX Proxy Manager in der Lage sein, den neuen WebSocket automatisch zu finden, aber derzeit (Januar 2022) findet NGINX Proxy Manager Ihren neu aufgebauten Discourse-Container nicht, es sei denn, Sie starten NGINX Proxy Manager neu.

Erklärung

Wenn Sie sich fragen, warum die obigen Anweisungen den WebSocket mit Ports kombinieren, ist der einfache Grund, dass mir beim Schreiben dieses Beitrags plötzlich klar wurde, dass NGINX Proxy Manager und Discourse wahrscheinlich nicht einmal im selben Docker-Netzwerk sein müssen, wenn wir den WebSocket verwenden. Und als dies bestätigt wurde, hatte niemand Lust, die Anweisungen komplett neu zu schreiben.

Dies ist der faszinierendste Aspekt von Support-Foren: Eine gute Beschreibung Ihres Problems führt Sie oft zur Lösung, ohne dass Sie Ihre Frage überhaupt posten müssen. Und in diesem Fall habe ich die Frage eines anderen beantwortet, aber möglicherweise auch die Antwort auf meine eigene gefunden. :smiley:

9 „Gefällt mir“

Die Diskussion darüber, welchen Reverse-Proxy man verwenden sollte, liegt eindeutig außerhalb des Unterstützungsbereichs. :wink: Aber nachdem ich mir NGINX Proxy Manager für 12 Sekunden oder länger angesehen habe, würde ich sagen, dass er gut funktionieren wird. Es gibt noch eine andere „automagische" NGINX-Proxy-Lösung, über die ich bereits zuvor gelesen habe, aber aufgrund meines umfassenden Wissens über NGINX Proxy Manager denke ich, dass diese möglicherweise besser ist. Ich werde mir das vielleicht genauer ansehen, da ich zunehmend an Traefik desillusioniert bin.

EDIT: Jetzt habe ich mir das Ganze für 3 Minuten angesehen. Ich bevorzuge Tools, die die Automatisierung erleichtern. Daher sind Traefik und jwilder/nginx-proxy - Docker Image (ich habe es gefunden) eher das, was ich suche, da man dort Labels oder Umgebungsvariablen an den Docker-Container anhängen kann, sodass kein Klicken in einer Weboberfläche erforderlich ist. Es sieht jedoch so aus, als müsste man für die Einrichtung dieses Tools entweder die Weboberfläche nutzen oder die Datenbank manuell mit den gewünschten Hosts aktualisieren. Wenn du jedoch bereit bist, wie ein „normaler" Mensch (und nicht wie ein Systemadministrator) in einer Weboberfläche herumzuklicken und zu tippen, dann könnte dieses Tool genau das Richtige für dich sein.

4 „Gefällt mir“

Ich habe versucht, Nginx Proxy Manager zu installieren, verstehe aber nicht, wie man den Discourse-Container „verknüpft" (proxyme? Entschuldigung, ich bin noch recht neu im Systemmanagement), damit ich Discourse über den Webzugriff sehen kann.
Könntest du mir einige Hinweise geben? Soll der Discourse-Container die Ports 80 und 443 freigegeben werden oder nicht, wie in diesem Forumsthema vorgeschlagen?

1 „Gefällt mir“

Tatsächlich benötigte dies etwas Probieren, aber ich habe es wie folgt zum Laufen gebracht (keine Garantie, dass dies der beste Weg ist – tatsächlich weiß ich, dass es einen besseren geben muss – daher sind Korrekturen und Verbesserungen sehr willkommen):

Anweisungen, die @pfaffman in den OP verschoben hat

Zunächst gibt es zwei Möglichkeiten, auf Ihre Discourse-Instanz zuzugreifen: 1. durch Freigabe eines Ports, 2. über WebSocket. Ich glaube, ich habe irgendwo in diesem Forum gelesen, dass WebSocket schneller/effizienter ist, daher verwende ich dies. Das Freigeben eines Ports sollte jedoch viel einfacher sein. Wenn Sie also den Socket nicht zum Laufen bekommen, versuchen Sie es mit dem Freigeben eines Ports (mehr dazu weiter unten).

Nehmen wir also an, Sie haben die 30-minütige Standardinstallation abgeschlossen und nehmen wir an, Sie haben Discourse noch kein Let’s Encrypt-Zertifikat erteilen lassen – denn Sie benötigen keines, wenn Sie einen Reverse-Proxy verwenden. NPM kümmert sich darum. Es ist jedoch egal, ob Sie bereits ein Zertifikat haben. NPM wird einfach ein neues beantragen.

1. NPM installieren

Der nächste Schritt ist die Installation von NPM, damit zwei weitere Docker-Container laufen (NPM und sein Datenbank-Container).

Nun kommt der knifflige Teil, den Sie angesprochen haben.

Das erste Hindernis ist, dass Discourse im standardmäßigen Docker-bridge-Netzwerk läuft, während NPM standardmäßig in einem benutzerdefinierten Netzwerk (in meinem Fall npm_default genannt) läuft. Das bedeutet, dass NPM Discourse nicht sehen kann. :cry:

2. Alle Container in das Standard-Bridge-Netzwerk bringen

Solange ich nicht weiß, ob und wie Discourse in ein benutzerdefiniertes Netzwerk verschoben werden kann, müssen wir NPM in das Standard-bridge-Netzwerk verschieben. Dies können wir erreichen, indem wir network_mode: bridge zu beiden NPM-Containern in unserer Docker-Compose-Datei hinzufügen.

3. IP-Adresse anstelle des Dienstnamens verwenden

Das nächste Problem ist, dass die Standard-Docker-Compose-Datei nicht mehr funktioniert, wenn Sie sie einfach in das bridge-Netzwerk verschieben. NPM kann seinen Datenbank-Container nicht mehr finden. Dies liegt daran, dass die interne DNS-Auflösung für Dienstnamen (auf die sich die Docker-Compose-Datei verlässt) nur in benutzerdefinierten Netzwerken verfügbar ist, nicht jedoch in den Standard-Docker-Netzwerken. Wir müssen uns also auf hartkodierte IP-Adressen verlassen (was bedeutet, dass dies definitiv keine optimale Lösung ist, da sie fehlschlägt, wenn sich die IP-Adressen Ihrer Container ändern). Sie müssen den Container also starten, auch wenn Sie wissen, dass er nicht funktionieren wird, notieren Sie sich die IP des NPM-Datenbank-Containers und ersetzen Sie DB_MYSQL_HOST: "db" in Ihrer Docker-Compose-Datei durch DB_MYSQL_HOST: "<db_container_IP>".

Jetzt sollten sich alle Container im Standard-bridge-Netzwerk befinden, sodass NPM sowohl Discourse als auch dessen Datenbank sehen kann.

4. Discourse erreichbar machen

Aber Discourse „sehen" und darauf zugreifen können, ist nicht dasselbe. Sie müssen also sicherstellen, dass Discourse den gesamten Verkehr akzeptiert, den NPM an ihn weiterleitet. Wenn es Ihnen egal ist, WebSocket zu verwenden, können Sie NPM einfach auf Port 80 (nicht 443) der Discourse-Container-IP zeigen, wie folgt:

Ich habe dies jedoch nicht getestet. Wie erwähnt, verwende ich das WebSocket-Setup, was weitere Schritte erfordert. Beachten Sie, dass der oben genannte Hostname/IP und Port ignoriert werden, wenn Sie WebSocket verwenden.

5. app.yml so konfigurieren, dass WebSocket verwendet wird

Dies ist im OP erklärt, daher gehe ich nicht näher darauf ein.

6. WebSocket im NPM-Container mounten

Wir müssen NPM Zugriff auf den WebSocket gewähren, indem wir ihn als Volume mounten: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Dies ist die letzte Änderung an der Standard-NPM-Docker-Compose-Datei. Hier ist also die finale Version, die bei mir funktioniert:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. NPM so konfigurieren, dass es den WebSocket verwendet

Letzter Schritt: Weisen Sie NPM an, den WebSocket zu verwenden. Soweit ich mich erinnere, reichte es nicht aus, nur „WebSocket-Unterstützung" einzuschalten. Daher habe ich den NGINX-Standort aus dem OP in den Reiter „Erweitert" kopiert, wie folgt:

Ich habe dies im Reiter „Benutzerdefinierte Standorte" nicht zum Laufen gebracht.

8. Vergessen Sie nicht, SSL zu aktivieren

Ich habe die SSL-Konfiguration in NPM nicht erwähnt, da sie ziemlich selbsterklärend erscheint und ich nicht denke, dass es wichtig ist, zu welchem Zeitpunkt im Prozess Sie sie aktivieren. Wenn Sie es also noch nicht getan haben, sieht meine Konfiguration so aus:


9. Abschließender Hinweis

Als ich diesen Beitrag schrieb, fiel mir plötzlich ein, dass NPM und Discourse wahrscheinlich gar nicht im selben Docker-Netzwerk sein müssen, wenn wir den WebSocket verwenden. Ich habe derzeit keine Zeit, dies zu überprüfen, aber wenn dies zutrifft, können Sie einfach die Schritte 2, 3 und 4 oben vergessen, und es sollte funktionieren.

Das ist der faszinierendste Aspekt von Support-Foren: Wenn man seine Probleme gut beschreibt, führt das oft zur Lösung, ohne dass man die Frage überhaupt gestellt hat. In diesem Fall habe ich die Frage einer anderen Person beantwortet, aber möglicherweise auch die Antwort auf meine eigene gefunden. :smiley:

4 „Gefällt mir“

Vielen Dank für die großartige und gut formulierte Antwort! Ich werde deine Hinweise so schnell wie möglich ausprobieren. Übrigens: Welche IPs sollen in NPM eingetragen werden – die des Servers (also die externe IP zum Erreichen des Servers) oder die Docker-internen IPs (ich habe bemerkt, dass Docker für Container 172… verwendet)?
Entschuldige, falls meine Fragen trivial wirken; ich kenne mich mit Netzwerkthemen noch nicht gut aus.

1 „Gefällt mir“

Ich empfehle dir, das WebSocket-Protokoll zu verwenden. Dann kannst du bei der IP-Adresse beliebige Werte eingeben, da diese ohnehin nicht genutzt wird. Andernfalls ist es die interne IP des Containers, nicht die öffentliche IP des Hosts.

BTW: Es sieht so aus, als wäre deine Antwort per E-Mail nicht korrekt gerendert worden. Vielleicht möchtest du deinen Beitrag oben bearbeiten (kürzen)?

2 „Gefällt mir“

Ja, das habe ich gesehen. Ich habe die „Antworten"-Funktion in der E-Mail verwendet, und es hat versucht, die gesamte ursprüngliche Nachricht einzufügen. Ich kann jedoch keinen Weg finden, dies zu ändern. Ist das möglich? Ich bin selbst als Nutzer noch neu bei Discourse… :pensive:

1 „Gefällt mir“

Du kannst deine Beiträge mit dem Bleistift-Symbol am unteren Rand deiner Nachricht bearbeiten. Allerdings erhalten Benutzer mit Vertrauensstufe 1 und darunter nur 24 Stunden (Standard), während Benutzer mit Vertrauensstufe 2 und höher 30 Tage (Standard) haben.

Es sieht so aus, als wärst du derzeit auf TL1 Basic. Weitere Informationen darüber, was du tun musst, um aufzusteigen, findest du unter Vertrauensstufen. :+1:

2 „Gefällt mir“

Entschuldige bitte, wenn schon eine Weile seit deiner letzten Frage vergangen ist, aber ich habe viel Zeit damit verbracht, das zu versuchen, was du vorgeschlagen hast – leider ohne Erfolg. Als ich die app.yml änderte und die App mit deinen Änderungen neu erstellte, tauchte in den Logs die Meldung „config/unicorn_launcher: line 71: kill: (898) - No such process" auf. Egal was ich versuchte, dieses Verhalten ließ sich nicht stoppen. Ich habe auch versucht, die App in ihrem ursprünglichen Zustand neu zu erstellen (mit freigegebenen Ports, ohne WebSocket), npm gestoppt, aber es hat überhaupt nichts gebracht – „unicorn" läuft nicht.

Ich habe auch alles versucht, was Google dazu findet (es scheint ein weit verbreitetes Problem zu sein), aber ich konnte nicht herausfinden, wie man einen funktionierenden Discourse-Container neu erstellt. Das aktuelle Problem ist (und eines der größten, ich bin kurz davor, Discourse aufzugeben), dass der interne PostgreSQL-Server aus irgendeinem unklaren und chaotischen Grund ständig neu startet.

Ich weiß nicht warum. Ich habe einfach deine Änderungen vorgenommen, die App neu erstellt, und seitdem ist „unicorn" :roll_eyes: tot.
Gibt es eine Möglichkeit, dieses PostgreSQL-Problem zu beheben? Warum ist das passiert? Besteht eine Chance (ich fürchte, überhaupt keine!), alle Änderungen an Discourse zu behalten, als es noch funktionierte?

Übrigens: Ist es normal, dass jede kleine Änderung oder jeder Versuch, etwas zu reparieren, dazu führt, dass etwas anderes nicht mehr funktioniert? :rage:
Ich bin nicht wütend auf dich – es geht hier um Discourse, nicht um deine Vorschläge. Ich habe viel Zeit damit verbracht, dieses „angeblich" schöne Forum zum Laufen zu bringen, aber jedes Mal geht etwas anderes schief. Mein Gefühl, dass Discourse sehr wenig zuverlässig ist, wird immer stärker.

1 „Gefällt mir“

Wenn du eine funktionierende Standardinstallation hattest, solltest du alles so wiederherstellen können, dass es weiterhin funktioniert.

Das PostgreSQL-Problem könnte mit dem PostgreSQL 13-Update zusammenhängen?

Wenn du vor dem Start ein Backup erstellt hast, kannst du es auf einem neuen Server installieren und dieses Backup wiederherstellen. Das sollte der Worst-Case-Szenario sein.

2 „Gefällt mir“

Wie kann ich feststellen, ob das PostgreSQL-Problem mit dem Update auf Version 13 zusammenhängt? Ich habe nicht bewusst ein Update durchgeführt, sondern einfach „./launcher rebuild app" eingegeben, und dann sind alle … Dinge passiert.
Ja, es ist Version 13. Nach stundenlangem Lesen im Internet über andere Nutzer mit demselben Problem habe ich herausgefunden, dass dies das Problem sein könnte, aber ich habe keinen Weg gefunden, Discourse wieder zum Laufen zu bringen.

1 „Gefällt mir“

Dann liegt das Problem nicht daran. Entschuldigung.

1 „Gefällt mir“

Es tut mir leid, von deinen Problemen zu hören. Ich kenne das frustrierende Gefühl, stundenlang zu versuchen, etwas zu reparieren. Aber man lernt dabei jedes Mal etwas, auch wenn der Weg zur Lösung selten eine gerade Linie ist …

Es tut mir leid, aber ich bin nicht die richtige Person, um dir dabei zu helfen. Ich habe keine Erfahrung mit Postgres oder Unicorns. Es gibt drei Wege, wie ich solche „nichts funktioniert"-Szenarien überstehe: 1. Sicherung, damit ich immer zum ursprünglichen Zustand zurückkehren kann. 2. Versuche/ändere nur eine Sache auf einmal und teste sie zunächst auf einer Nicht-Produktions-Maschine (oder einem weniger wichtigen Forum). 3. Investiere noch mehr Stunden, um die Dinge herauszufinden.

Übrigens: Das detaillierte Beschreiben von Problemen oder das Erstellen von Support-Tickets hat mir mehr als einmal geholfen, das Problem zu lösen. Ich musste das Ticket oft nicht einmal absenden. Das Aufschreiben ließ mich die Lösung erkennen.

In deinem Fall würde ich versuchen zu verstehen: Unter welchen Umständen kann das Ändern der app.yml und das anschließende Zurücksetzen auf den ursprünglichen Zustand zu einem anderen Ergebnis führen als das ursprüngliche Ergebnis? Wenn du das untersuchst, wirst du entweder feststellen, dass du den exakten Originalzustand nicht wirklich wiederhergestellt hast, oder du verstehst, was du sonst noch „zurücksetzen" musst, damit es funktioniert.

5 „Gefällt mir“

Es tut mir wirklich leid, aber ich verstehe nicht ganz: Zuerst hast du gefragt, ob das Postgres-Problem mit dem PostgreSQL-13-Update zusammenhängen könnte, und als ich mit „Ja, es ist Version 13" geantwortet habe (ich schwöre, ich wusste vorher nicht, welche Version da war – ich habe die App lange nicht neu aufgebaut), sagst du nun, das sei nicht das Problem… Also warum startet Postgres ständig und Discourse kommt nicht weiter?

1 „Gefällt mir“

Hey @Wanderer. Ich kann nicht sagen, was dein Problem sein könnte, daher war das PostgreSQL-Upgrade nur eine Vermutung. Ich bin mir ziemlich sicher, dass, wenn du PostgreSQL 13 ausführst, das Problem nicht darin besteht, dass du beim Upgrade von Version 10 oder 12 hängen geblieben bist. Zwar könnte es ein Problem mit PostgreSQL geben, aber es hat wahrscheinlich nichts mit dem Upgrade auf PostgreSQL 13 zu tun.

Meine beste Empfehlung für jemanden, der sich mit diesen Dingen nicht auskennt, ist eine saubere Neuinstallation und die Wiederherstellung deines neuesten Backups.

Wenn du spezifischere Hilfe zu deinem Problem möchtest und ein Budget hast, kannst du mich kontaktieren oder im Kanal Marketplace posten.

Ich werde daran arbeiten, die Anweisungen für Nginx Proxy Manager zu verbessern, aber ich vermute, dass dein Problem, obwohl es durch den Versuch entstanden ist, zu diesen komplexen Setups zu wechseln, wahrscheinlich nicht darauf zurückzuführen ist, dass diese Anweisungen fehlerhaft sind. (Ich weiß es nicht, aber das ist meine beste Vermutung.)

2 „Gefällt mir“

Hier ist meine Version davon. Ich habe fast aufgegeben, aber @tophee hat auf einen Beitrag verlinkt, den ich (!?) geschrieben habe und der die nötige Magie lieferte! Dies ist nun eine unkomplizierte Möglichkeit, Nginx Proxy Manager für Discourse zu konfigurieren. Ich denke, das macht dies ähnlich wie Run other websites on the same machine as Discourse - #396.

Installieren Sie Nginx Proxy Manager gemäß deren Anleitung unter

Entfernen Sie SSL- und Let’s Encrypt-Vorlagen:

Stellen Sie sicher, dass diese Zeilen in Ihrer yml-Datei auskommentiert oder gelöscht sind:

## Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Veranlassen Sie Discourse, das Netzwerk npm-default zu verwenden.

Wenn Sie die Installationsanweisungen für Nginx Proxy Manager blind befolgen, wird ein Docker-Netzwerk namens npm_default erstellt.

Fügen Sie diesen Abschnitt zu Ihrer(n) yml-Datei(en) hinzu. Wenn Sie separate web_only- und data-Container haben, müssen Sie dies für jeden von ihnen hinzufügen (ich habe den mail-receiver-Container nicht getestet). docker_args ist nicht eingerückt.

docker_args: |
  --network npm_default

Keine Notwendigkeit, Ports freizugeben

Kommentieren Sie diese Zeilen in Ihrer yml-Datei aus oder entfernen Sie sie:

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

Anschließend können Sie Ihre Container neu erstellen und Nginx Proxy Manager wie folgt konfigurieren:

image

Eine einfache (aber nicht unbedingt empfohlene) Möglichkeit, eine zweite Discourse-Site hochzufahren, wäre folgende:

cd /var/discourse/containers
cp app.yml othersite.yml
# editieren Sie auf irgendeine Weise mindestens den Hostnamen in othersite.yml
./launcher rebuild othersite

Fügen Sie es dann wie oben zu NPM hinzu, wobei Sie othersite statt app verwenden.

Ich habe dies mit einem app.yml plus zwei web_only-artigen Containern und einem einzelnen data-Container sowie einem separaten othersite-redis-Container getestet, der eine Kopie des data-Containers ist und nur die Redis-Vorlagen enthält. (Eine einfachere Lösung wäre jedoch, das zusätzliche Redis im web_only-Container unterzubringen).

2 „Gefällt mir“

Also, nach etwas Mühe habe ich es geschafft, alles zum Laufen zu bringen.

Ich muss vorab sagen: Obwohl ich ein Entwickler der „alten Schule" (geboren Anfang der 80er) bin, habe ich mich stets nach den besten und modernsten Methoden zur Entwicklung und Verwaltung umgesehen. Deshalb hasse ich es im Jahr 2021, seltsame Befehle voller kryptischer Optionen zu schreiben, wie es früher bei CP/M und DOS üblich war. Ich suche immer nach einer Schnittstelle, die mein Leben einfacher und übersichtlicher macht.

Deshalb nutze ich beispielsweise Portainer, um Container zu verwalten. Damit kann ich alle Container jederzeit starten, stoppen, bearbeiten oder duplizieren, ohne das Dateisystem nach einer „ein-zu-einer-Million"-Datei durchwühlen zu müssen. Um beispielsweise das Container-Netzwerk zu ändern, wählt man einfach eines aus einer Liste aus und klickt darauf. Gleiches gilt für das Hinzufügen von Parametern oder Volumes, wie im Beispiel von @tophee beschrieben. Aus diesem Grund habe ich NPM ausprobiert, da ich meinen Nginx-Proxy lieber „containern" möchte und weil es anscheinend mit nur wenigen Klicks funktioniert – man versteht dabei genau, was man tut, muss sich aber keine neuen Sets seltsamer Befehle und Optionen merken.

Zurück zu meinem Discourse-Container: Ich musste ihn erneut mit „discourse-setup" einrichten. Alles verlief reibungslos, das „böse" Postgres wurde in Version 13 installiert, und es gab keinen „betrunkenen Einhorn"-Prozess (Entschuldigung, aber die Vorstellung eines Einhorns, das auf meinem Server rumrennt, bringt mich zum Lachen! :laughing:). Kurz gesagt, alles lief wie geplant. Anschließend habe ich die Änderungen vorgenommen, damit Discourse mit Websockets funktioniert – auch diesmal lief alles problemlos. Glücklicherweise hatte die vorherige Discourse-Installation automatische Backups erstellt, sodass ich mit nur wenigen Klicks alles wiederherstellen konnte (je mehr ich Discourse nutze, desto mehr liebe ich es!).

Ich musste die Einstellungen für NPM mehrmals ausprobieren; am Anfang hatte ich Probleme mit den Zertifikaten, aber am Ende lief auch das einwandfrei.

Ich habe einen zweiten Proxy hinzugefügt, der auf meinen WordPress-Container zeigt (ja, ich „containere" wirklich alles; ich mag die Idee eines möglichst sauberen Servers, bei dem alle wichtigen Pakete an einem verwalteten Ort untergebracht sind), und auch das läuft problemlos.

Am Ende habe ich also meinen Server (ein VPS) mit eigenem Mailserver (ich habe versucht, auch diesen zu „containern", aber nach wochenlangem harten Kampf habe ich es aufgegeben), Discourse, das darauf zeigt, WordPress in einem weiteren Container und NPM, das beides verwaltet – alles auf meinem Server, ohne Abhängigkeit von anderen (und viel, viel teureren) Diensten für Deployment, E-Mail-Versand usw.

Nächster Schritt: Import von einigen hunderttausend Beiträgen aus dem „alten, guten Phpbb". Macht euch bereit auf weitere Beiträge von mir! :grinning_face_with_smiling_eyes:

Ein großes Dankeschön an @tophee und @pfaffman für die Hilfe. Ich kann gut verstehen, wie schwierig es sein kann, Leuten zu helfen, die wie ich auf nicht-standardisierte Weise arbeiten.

3 „Gefällt mir“

Schön, dass du es mit Websocket zum Laufen gebracht hast. Für alle anderen, die damit Schwierigkeiten haben, empfehle ich die Anleitung von @pfaffman, wie man es ohne Websocket macht weiter oben.

Ich weiß nicht, was dein Problem verursacht hat, aber es fällt mir auf, dass dies ein Punkt ist, den man für jeden, der mit der Discourse-Administration noch relativ neu ist, klarstellen sollte: Du musst verstehen, wie das Let’s Encrypt-Zertifikat bei der Standardinstallation (ohne externen Proxy) funktioniert und wie es mit NPM funktioniert (und wenn du dich fragst, warum es externer Proxy heißt, musst du das auch herausfinden).

Da ich meinen externen Proxy ursprünglich manuell eingerichtet und Let’s Encrypt ebenfalls manuell konfiguriert habe, hatte ich ein Verständnis für all die Magie, die Discourse sowie NPM für dich erledigen, damit HTTPS einfach funktioniert. Daher konnte ich verschiedene Fallstricke vermeiden, als ich von von Discourse verwalteten Zertifikaten auf von NPM verwaltete Zertifikate umgestiegen bin.

Ich sehe wirklich nicht, warum du den Mailserver hinter NPM stellen möchtest.

1 „Gefällt mir“

Nein, Christoph, nicht hinter NPM, sondern nur in einem Container. Ich habe Zimbra ausprobiert, aber das war ein riesiges Chaos. Dann habe ich einen einfachen „containerten" Postfix versucht, aber auch das hatte keinen Erfolg. Damals stand ich noch am Anfang meiner Linux-Erfahrung (ich bin immer noch ein Anfänger, aber ich gewinne zumindest in Bezug auf einige Administrationskonzepte mehr und mehr an Selbstvertrauen), also habe ich es aufgegeben und es direkt auf dem Server versucht. Es startet ohne größere Probleme, also habe ich mich für diese Vorgehensweise entschieden, obwohl es ziemlich schwierig war, Discourse so einzurichten, dass es meinen Mailserver nutzt. Aber jetzt scheint alles zu funktionieren.

2 „Gefällt mir“

Klingt gut mit der Installation, bis ich bei npm stecken bleibe, um mit dem Discourse-Host zu kommunizieren. Sie erwähnen, dass ich die IP des Datencontainers in den mySQL-Host der npm-Compose-Datei einfügen soll

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

Aber wenn ich (DB_MYSQL_HOST) zum Datencontainer ändere, erhalte ich die Meldung “Verbindung verweigert”.

connect ECONNREFUSED 172.17.0.2:3306 <-- Fehler, wenn npm im Discourse-Netzwerk ist (network_mode: bridge).
getaddrinfo ENOTFOUND db <-- Fehler, wenn die mySQL-Datei in der npm-Compose-Datei als "db" definiert ist.

Irgendwelche Vorschläge, damit Schritt 3 bei mir funktioniert?

1 „Gefällt mir“