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
-
CMD / Terminal öffnen
-
SSH-Verbindung zur AWS EC2-Instanz herstellen
Beispielbildschirm nach erfolgreicher Verbindung zur EC2-Instanz
SYSTEMUPDATE DURCHFÜHREN
- Führen Sie Systemupdates durch, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo yum update
DOCKER INSTALLIEREN
- Suchen Sie nach dem AWS-Docker-Paket, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo yum search docker
- Rufen Sie Versionsinformationen ab, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo yum info docker
- Installieren Sie Docker, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo yum install docker
- 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
- 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
- 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
- Starten Sie den Docker-Dienst, indem Sie den folgenden Befehl in der Konsole / im Terminal ausführen
$ sudo systemctl start docker.service
- Ü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
- Discourse-Ordner erstellen
$ sudo mkdir /var/discourse
- Klone das Discourse-Docker-Image in das neu erstellte Verzeichnis
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
- Kopieren Sie die Datei standalone.yml in den Ordner containers
$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml
- 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"
- 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.
- 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
- 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>
- 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.


