Discourse konfigurieren - Umgebung AWS Linux 2 AMI und Apache2 (httpd)

Hallo zusammen,

ich habe die Dokumentation durchgearbeitet, die vorgestellten Konfigurationsaufbauten und Empfehlungen gelesen und versucht, diese an meine einzigartige Situation anzupassen.

Für etwas, das relativ einfach zu sein scheint, ist es unglaublich frustrierend, dass keine der vorgeschlagenen Lösungen funktioniert hat.

Unsere Umgebung:

  • Wir betreiben eine AWS EC2-Instanz, genauer gesagt ein AWS Linux 2 AMI;
  • Wir haben Apache2 installiert und konfiguriert;
  • Die Instanz ist Teil einer AWS-Zielgruppe (Target Group), auf die sich unser AWS-Load-Balancer bezieht;
  • Unser SSL-/TLS-Zertifikat wird von AWS bereitgestellt und ist mit dem Load-Balancer verknüpft;
  • Unser Domain-Provider ist name.com;
  • Als Teil unserer Einrichtung haben wir mehrere Subdomains, die über CNAME-Einträge geleitet werden, die alle auf den AWS-Load-Balancer zeigen, welcher dann den Verkehr zur EC2-Instanz verwaltet;
  • Der gesamte Verkehr, der zum Load-Balancer geleitet und dem Webnutzer bereitgestellt wird, ist sicher;
  • Auf unserem Server betreiben wir drei separate Node-Express-Anwendungen;
  • Die Ports sind in Express als Teil des Express-Server-Aufbaus definiert, aktuell die Ports 3000, 4000 und 5000;
  • Der Verkehr wird von Apache basierend auf der Subdomain zur entsprechenden Web-App geleitet, zum Beispiel:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Obwohl nicht besonders relevant: Wir verwenden PM2, um unsere Express-Apps zu verwalten, sodass sie nach einem Server-Neustart automatisch gestartet werden.

  • Auf demselben Server haben wir Docker installiert;

  • Anschließend haben wir Discourse mit einer Kopie der app.yaml installiert (unter Verwendung von Run other websites on the same machine as Discourse - #182 by angus als Leitfaden).

Aktueller Status:

  • Docker läuft
  • Die Discourse-App (Container) läuft
  • Die Express-Apps laufen alle und werden ordnungsgemäß von Apache geleitet

Hinweise:

  • Ich habe versucht, die App zunächst ohne Freigabe der Ports gemäß der Dokumentation zu bauen. Als das nicht funktionierte, habe ich Port 8000 über HTTP-Port 80 freigegeben;
  • In meinem einfachen Verständnis ist Docker wie ein Haus und die verschiedenen Container sind die Räume. Docker bestimmt, wie auf die App zugegriffen wird, also welcher Raum accessed wird. Meine Idee beim Freigeben von Port 8000 war, dass ich dann Port 8000 referenzieren könnte, so wie ich es jetzt mit meinen anderen Express-Apps tue, da 8000 freigegeben war. Das funktioniert jedoch nicht. Unten ist ein Beispiel dafür, was ich in Apache versucht habe:
# FAQ (DISCOURSE ROUTES)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • Der einfache Test bestand darin, localhost:8000 im Browser auf dem Server einzugeben und zu testen. Der Server ist die AWS-Instanz mit installiertem Chromium. Die Tatsache, dass dies nicht sofort aufgelöst wird, sagt mir, dass es ein Problem gibt und mein Verständnis etwas Fundamentales vermisst. Meine Web-Apps laufen und sind auf den Ports verfügbar, die ich im Express-Setup angebe. Meine Erwartung war, dass es für den Docker-Container genauso ist.

Zusätzliche Hinweise:

  • Ich erkenne, dass es eine potenzielle Lösung gibt, indem man NGINX „vor“ Apache und Docker platziert, um den Verkehr von discourse.domain.io zu einem bestimmten Port 8000 auf dem lokalen Server zu leiten, also dem Port, der für den Docker-Container freigegeben ist, und gleichzeitig den gesamten anderen Verkehr von *.domain.io zu Apache auf einem anderen Port, sagen wir Port 9000, zu leiten. Anschließend würde ich meine VirtualHost-Konfiguration ändern, um den Verkehr von Port 9000 entsprechend zu leiten, also:
# EXPRESS APP ROUTING IN APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Für mich scheint dies völlig unnötig. Wenn die Domain discourse.domain.io zu Apache geleitet wird und Apache die Anfrage erhält und versucht, sie weiterzuleiten, sollte es so einfach sein, sie auf den freigegebenen Port des Docker-Containers zu zeigen.
  • Außerdem würde dies ohnehin nicht funktionieren, wenn localhost:8000 auf dem Server selbst nicht aufgelöst wird.

Derzeit erhalte ich in Chrome einen 502-Fehler, wenn ich versuche, zu meinem Discourse-Docker-Container zu navigieren. (Siehe Screenshot oben).

Auszug aus app.yml

## Dies ist die All-in-One, eigenständige Discourse Docker-Container-Vorlage
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu bauen
## /var/discourse/launcher rebuild app
##
## SEien Sie *SEHR* VORSICHTIG beim Bearbeiten!
## YAML-Dateien sind SUPER SUPER empfindlich gegenüber Fehlern in Leerzeichen oder Ausrichtung!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
## Deaktivieren Sie diese beiden Zeilen, wenn Sie Lets Encrypt (https) hinzufügen möchten
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Welche TCP/IP-Ports soll dieser Container freigeben?
## Wenn Sie Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilen möchten,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
  - "8000:80"   # http
  #- "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Setzen Sie db_shared_buffers auf maximal 25 % des gesamten Speichers.
  ## wird automatisch vom Bootstrap basierend auf dem erkannten RAM gesetzt, oder Sie können es überschreiben
  #db_shared_buffers: "256MB"

  ## kann die Sortierleistung verbessern, erhöht aber den Speicherverbrauch pro Verbindung
  #db_work_mem: "40MB"

  ## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt vom Speicher und den CPU-Kernen ab.
  ## wird automatisch vom Bootstrap basierend auf den erkannten CPUs gesetzt, oder Sie können es überschreiben
  #UNICORN_WORKERS: 3

  ## TODO: Der Domainname, auf den diese Discourse-Instanz antworten soll
  ## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Nummer.
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## Deaktivieren Sie dies, wenn Sie möchten, dass der Container mit demselben
  ## Hostnamen (-h-Option) wie oben angegeben gestartet wird (Standard "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der durch Komma getrennten E-Mail-Adressen, die bei der ersten Anmeldung zu Administratoren und Entwicklern werden
  ## Beispiel 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  ## SMTP-Adresse, Benutzername und Passwort sind erforderlich
  ## WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, Standard true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (von einigen Anbietern erforderlich)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (Adresse, von der Benachrichtigungen gesendet werden sollen)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, deaktivieren Sie unten, um ein kostenloses SSL-Zertifikat zu erhalten
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Die http- oder https-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Der MaxMind-Geolokalisierungs-IP-Schlüssel für die IP-Adresssuche
  ## siehe https://meta.discourse.org/t/-/137387/23 für Details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins gehen hier
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Beliebige benutzerdefinierte Befehle, die nach dem Build ausgeführt werden sollen
run:
  - exec: echo "Beginn der benutzerdefinierten Befehle"
  ## Wenn Sie die 'Von'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, deaktivieren Sie und ändern Sie:
  ## Nach Erhalt der ersten Anmelde-E-Mail den Kommentar wiederherstellen. Es muss nur einmal ausgeführt werden.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Ende der benutzerdefinierten Befehle"

Meine Domain, E-Mail-Adresse und E-Mail-Konfiguration sind korrekt. Wie erwähnt, benötige ich keine SSL/TLS-Konfiguration.

Anfrage:

  • Ist die NGINX-Lösung der einzige Weg, um diese Einrichtung zum Laufen zu bringen, und falls ja, gibt es eine klarere Erklärung bezüglich der Einrichtungsschritte? Ich bin nicht in der Lage, den Server von Grund auf neu zu starten, nur um Discourse zum Laufen zu bringen, und das ohne Garantien.
  • In Discourse behind reverse proxy and https - #2 by itsbhanusharma hat @Dark Matter folgende Apache2-Lösung bereitgestellt, aber ich glaube nicht, dass diese Lösung eine Node-Express-Umgebung im Sinn hat, und da mein localhost:8000 nicht aufgelöst wird, bin ich mir nicht sicher, ob dies funktionieren würde:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • Liegt das Problem hier in meiner Discourse-Konfiguration? Liegt das Problem vielleicht in meiner Apache-Routing-Konfiguration (ich vermute)? Oder fehlt mir etwas Fundamentales?
  • Ich denke, dass die Lösung dieses Problems vielen Nutzern in der Zukunft helfen wird.
  • Die erste Wahl wäre, Discourse lokal auf dem Server zu leiten.
  • Dann wäre die Weiterleitung über die URL die zweite Wahl.

Mit freundlichen Grüßen
Matthew Lucas

Das ist zu kompliziert für mich, um es vollständig zu verstehen, betrachten Sie dies also eher als eine wilde Vermutung denn als eine Lösung. Wenn das Problem darin besteht, dass Sie etwas nicht über localhost mit Ihrem laufenden Docker-Container verbinden können, könnten Sie versuchen, die Docker-IP zu verwenden. Es könnte auch möglich sein, die WebSocket-Vorlage zu verwenden und den Socket anstelle des Ports zu verwenden. Einige argumentieren, dass dies aus einer Reihe von Gründen vorzuziehen ist.

MKJ’s Opinionated Discourse Deployment Configuration könnte nützlich sein zu lesen.

@pfaffman@Matthew_Lucas verwendet bereits die Socket-Vorlage, aber…

Ich verwende definitiv localhost für meinen externen Proxy, und das sollte mit der Einstellung expose funktionieren. Ich würde nicht erwarten, dass er die Docker-IP verwenden muss. Und ich würde nicht erwarten, dass dies aus diesem Grund nur mit Apache vor dem Docker-Container fehlschlägt.
Sie benötigen möglicherweise eine Header-Konfiguration – siehe Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

Ich habe mein Bestes getan, um die Apache-Konfiguration zu vergessen, aber dieser Teil der Nginx-Konfiguration ist etwas, das Sie meiner Meinung nach mit Apache nachbilden möchten.

    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 https;
    proxy_set_header X-Real-IP $remote_addr;

Insbesondere glaube ich nicht, dass es ohne den Host-Header richtig funktioniert.
Da Sie kein HTTPS verwenden, sollten Sie mit tcpdump Paketspuren erfassen können, um genau zu sehen, was schief geht.

ABER warum überhaupt Apache dort einbauen? Es ist nur ein zusätzlicher Umweg. Wenn ich so etwas versuchen würde, würde ich den Amazon Load Balancer so einstellen, dass er direkt mit Port 8000 auf der EC2-Instanz spricht. Ich gehe davon aus, dass Sie HTTPS ohnehin am ELB beenden. Ich vermute, dass ihr Load Balancer die normalen Header kennt, die hinzugefügt werden müssen, ohne dass Sie sie angeben müssen, aber wenn nicht, geben Sie sie offensichtlich an. Stellen Sie einfach sicher, dass der Port über die Firewall zugänglich ist.

Ich bezweifle, dass ich hier noch viel Wertvolles beitragen kann, aber hoffentlich hilft Ihnen einiges davon bei Ihrer Konfiguration. Viel Glück.

INSTALLATION VON DOCKER UND DISCOURSE AUF AWS EC2 LINUX MIT BESTEHENDEM HTTPD-REVERSE-PROXY

Hallo zusammen,

ich habe es geschafft. Ich bin zurück an den Anfang gegangen und habe mit einer sauberen Docker- und Discourse-Installation von vorne begonnen. Mein Vorgehen ist im Folgenden detailliert beschrieben:

Annahmen

• Sie verfügen bereits über eine AWS EC2 Linux-Instanz
• Sie können über SSH auf Ihre EC2-Instanz zugreifen
• Apache 2 ist bereits konfiguriert und auf Ihrem Server aktiv

ZUGRIFF AUF IHRE EC2-INSTANZ ÜBER SSH

  1. CMD / Terminal öffnen

  2. SSH-Verbindung zur AWS EC2-Instanz herstellen

Beispielbildschirm nach erfolgreicher Verbindung zur EC2-Instanz

SYSTEMUPDATE DURCHFÜHREN

  1. Führen Sie Systemupdates durch, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo yum update

DOCKER INSTALLIEREN

  1. Suchen Sie nach dem AWS-Docker-Paket, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo yum search docker

  1. Rufen Sie Versionsinformationen ab, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo yum info docker

  1. Installieren Sie Docker, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo yum install docker

  1. Fügen Sie den ec2-user der Standardgruppe hinzu, damit Sie alle Docker-Befehle ohne sudo ausführen können, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Laden Sie die Gruppenzuordnungen eines Linux-Benutzers zu Docker neu, ohne sich abzumelden

$ newgrp docker
  1. Installieren Sie docker-compose, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
# 1. pip3 holen (Python-Installationspaket)
$ sudo yum install python3-pip
 
# 2. Führen Sie dann einen der folgenden Befehle aus
$ sudo pip3 install docker-compose # mit Root-Zugriff
 
# ODER
 
$ pip3 install --user docker-compose # ohne Root-Zugriff aus Sicherheitsgründen

# Berechtigungen prüfen
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Aktivieren Sie den Docker-Dienst, damit er beim Booten automatisch gestartet wird, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo systemctl enable docker.service

  1. Starten Sie den Docker-Dienst, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen

$ sudo systemctl start docker.service

  1. Überprüfen Sie, ob der Docker-Dienst läuft, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen. Die Ausgabe sieht ähnlich aus wie hier:

Grundlegende Docker-Befehle, die gut zu kennen sind:

# Docker-Version
$ docker version

# Docker-Compose-Version
$ docker-compose version

# Docker-Dienst starten
$ sudo systemctl start docker.service

# Docker-Dienst stoppen
$ sudo systemctl stop docker.service

# Docker-Dienst neu starten
$ sudo systemctl restart docker.service

# Status des Docker-Dienstes
$ sudo systemctl status docker.service

DISCOURSE INSTALLIEREN

  1. Discourse-Ordner erstellen

$ sudo mkdir /var/discourse

  1. Klone das Discourse-Docker-Image in das neu erstellte Verzeichnis

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Kopieren Sie die Datei standalone.yml in den Ordner containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Bearbeiten Sie die neue Datei discourse.yml wie folgt (die wichtigsten Punkte sind die exponierten Ports für HTTP und die E-Mail-Details für SMTP; ändern Sie diese im File, kopieren und einfügen Sie nicht)

Bearbeitungsoptionen:

1. Sie können nano verwenden und über die Befehlszeile / das Terminal bearbeiten.
2. Auf AWS können Sie, wenn Sie MATE mit PLUMA verwenden, PLUMA zum Bearbeiten der Datei nutzen.
3. Sie können WINSCP verwenden, um per SSH auf die Maschine zuzugreifen und die Datei über die Windows-GUI zu bearbeiten.

## Dies ist die All-in-One-Standalone-Discourse-Docker-Container-Vorlage
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu erstellen:
## /var/discourse/launcher rebuild app
##
## SEIEN SIE *SEHR* VORSICHTIG BEIM BEARBEITEN!
## YAML-DATEIEN SIND ÄUßERST EMPFINDLICH GEGENÜBER FEHLERN BEI LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Entfernen Sie das Kommentarzeichen vor der nächsten Zeile, um den IPv6-Listener zu aktivieren
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Entfernen Sie das Kommentarzeichen vor diesen beiden Zeilen, wenn Sie Lets Encrypt (https) hinzufügen möchten
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Welche TCP/IP-Ports sollen von diesem Container freigegeben werden?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilt,
## sehen Sie unter https://meta.discourse.org/t/17247 für Details
expose:
  - "8080:80"   # http (läuft auf lokalem Port 8080, Docker-Port 80)
  #- "443:443" # https (stellen Sie sicher, dass dies kommentiert ist)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Setzen Sie db_shared_buffers auf maximal 25 % des gesamten Arbeitsspeichers.
  ## Wird automatisch durch Bootstrap basierend auf dem erkannten RAM gesetzt, oder Sie können überschreiben
  #db_shared_buffers: "256MB"

  ## Kann die Sortierleistung verbessern, erhöht aber den Speicherverbrauch pro Verbindung
  #db_work_mem: "40MB"

  ## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt vom Arbeitsspeicher und den CPU-Kernen ab.
  ## Wird automatisch durch Bootstrap basierend auf den erkannten CPUs gesetzt, oder Sie können überschreiben
  #UNICORN_WORKERS: 3

  ## TODO: Der Domainname, auf den diese Discourse-Instanz antworten soll
  ## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Nummer.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## Entfernen Sie das Kommentarzeichen, wenn Sie möchten, dass der Container mit demselben
  ## Hostnamen (-h-Option) wie oben angegeben gestartet wird (Standard „$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der durch Kommas getrennten E-Mail-Adressen, die bei der ersten Registrierung zu Admin und Entwickler werden
  ## Beispiel: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: „E-Mail hier eingeben“

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-Adresse, Benutzername und Passwort sind erforderlich
  # WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  DISCOURSE_SMTP_ADDRESS: SMTP HIER EINGEBEN
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: BENUTZERNAME HIER EINGEBEN
  DISCOURSE_SMTP_PASSWORD: PASSWORT HIER EINGEBEN
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, Standard true, wir verwenden Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (von einigen Anbietern erforderlich)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (Adresse, von der aus Benachrichtigungen gesendet werden)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, entfernen Sie unten das Kommentarzeichen, um ein kostenloses SSL-Zertifikat zu erhalten
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Die HTTP- oder HTTPS-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Der MaxMind-Geolokalisierungs-IP-Schlüssel für die IP-Adresssuche
  ## siehe https://meta.discourse.org/t/-/137387/23 für Details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins gehen hier
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Beliebige benutzerdefinierte Befehle, die nach dem Build ausgeführt werden sollen
run:
  - exec: echo „Beginn der benutzerdefinierten Befehle"
  ## Wenn Sie die E-Mail-Adresse „Von“ für Ihre erste Registrierung festlegen möchten, entfernen Sie das Kommentarzeichen und ändern Sie:
  ## Nach Erhalt der ersten Anmelde-E-Mail das Kommentarzeichen wieder hinzufügen. Es muss nur einmal ausgeführt werden.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo „Ende der benutzerdefinierten Befehle"
  1. Sobald die Datei bearbeitet und gespeichert ist, erstellen Sie die Discourse-App mit dem folgenden Befehl im Terminal neu

$ /var/discourse/launcher rebuild discourse

Hinweis: Wenn Ihre YAML-Datei einen anderen Namen hat, ersetzen Sie discourse durch den Namen Ihrer YAML-Datei.

Hinweis: Der Neuaufbau dauert einige Zeit.

  1. Sobald Ihre App neu erstellt wurde, sollte sie auf Port 8080 laufen. Um dies zu überprüfen, führen Sie den folgenden Befehl im Terminal aus

$ sudo lsof -i -P -n | grep LISTEN

Beispielausgabe der Ports

Beachten Sie, dass Docker auf Port 8080 lauscht und httpd (Apache) auf Port 80.

In Bezug auf das Traffic-Routing empfängt Apache die Webanfrage und leitet sie gegebenenfalls an den Discourse-Container auf Port 8080 weiter.

Um sicherzustellen, dass das Routing funktioniert, müssen Sie den virtuellen Host in der Apache-Konfigurationsdatei konfigurieren.

KONFIGURATION DES APACHE-VIRTUELLEN HOSTS

  1. Die Apache-Konfigurationsdatei befindet sich unter /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 sind verschiedene Apache-Versionen. Ihre Dateien können sich an anderen Orten befinden, wenn Sie nicht den httpd-Dienst verwenden, aber die virtuelle Host-Konfiguration ist in diesem Fall dieselbe.

Bearbeitungsoptionen:

1. Sie können nano verwenden und über die Befehlszeile / das Terminal bearbeiten.
2. Auf AWS können Sie, wenn Sie MATE mit PLUMA verwenden, PLUMA zum Bearbeiten der Datei nutzen.
3. Sie können WINSCP verwenden, um per SSH auf die Maschine zuzugreifen und die Datei über die Windows-GUI zu bearbeiten.

Bearbeiten Sie die Datei /etc/httpd/conf.d/00-virtualhosts.conf, indem Sie Folgendes hinzufügen:

# FAQ (DISCOURSE-ROUTES)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Sie müssen den entsprechenden CNAME-DNS-Eintrag erstellen, sodass die Subdomain auf Ihren AWS-Server / Load Balancer zeigt.

Unsere Einrichtung ist etwas kompliziert, da wir einen Domain-Provider haben, der den gesamten Verkehr auf einen AWS-Load-Balancer leitet.

Der Load Balancer übernimmt unser SSL/TLS über ein von AWS bereitgestelltes Zertifikat.

Der Load Balancer leitet den Verkehr auch an die AWS-Instanz weiter.

Apache ist auf der AWS-Instanz installiert und leitet den Verkehr an unsere weiter:

  • Node-Express-Anwendungen
  • Docker-/Discourse-Anwendung.

FAZIT

Dies ist nur eine Lösung, aber es ist diejenige, die mit unserer bestehenden Einrichtung funktioniert hat.

Ein großes Dankeschön an:

@Kane York für seinen Artikel über Discourse,
@Axel Fernandes’ Artikel auf Medium, seine Notizen zum Herunterladen der erforderlichen Discourse-Dateien, und
@Vivek Gite von nixCraft und seinen Artikel auf cyberciti über die Installation von Docker auf AWS Linux 2.