GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So installieren Sie mehrere Discourse-Container auf demselben Server

Die Installation von Discourse ist wirklich einfach, wenn es nur eine Discourse-Instanz auf dem Server ist. Die Dinge werden kompliziert, wenn Sie mehrere Discourse-Instanzen auf demselben Server installieren möchten, um die Kosten zu senken.

Die offizielle Discourse-Installation folgt nicht den regulären Docker-Praktiken. Das Discourse-Installationsprogramm führt zunächst etwas aus, das als Bootstrapping bezeichnet wird und Ihnen als Host-Installationsprozedur erscheint. Nachdem der Bootstrap-Prozess beendet ist, startet der Launcher einen Container mit dem Namen „app“, basierend auf dem Feedback, das er von Ihnen während der Erstinstallation erhalten hat.

Ein solches hybrides Installationsverfahren unterscheidet sich von der Einrichtung mit anderen Webdiensten und Anwendungen wie WordPress.

In diesem Tutorial zeige ich Ihnen, wie Sie mehrere Discourse-Installationen zusammen mit anderen Docker-basierten Apps auf einem einzelnen Linux-Server installieren. Es ist überhaupt nicht schwierig, wenn Sie mit den Grundlagen von Docker und der Linux-Befehlszeile vertraut sind.

Installation mehrerer Discourse-Foren auf demselben Server

Im Allgemeinen wird eine Konfiguration mit mehreren Diskursen als Konfiguration mit mehreren Standorten verstanden, und der Prozess wurde hier veranschaulicht.

Offiziell bietet Discourse keine Dokumentation für mehrere Discourse-Installationen auf einem einzelnen Server. Aber ärgere dich nicht. Ich zeige Ihnen den Installationsprozess für 3-5 eigenständige Einzelcontainer, die unter Nginx ausgeführt werden, wobei jeder eigenständige Container seiner eigenen jeweiligen Domäne entspricht.

Ich verwende Ubuntu 18.04 in diesem Tutorial. Bitte stellen Sie sicher, dass Sie Docker auf Ubuntu oder der von Ihnen verwendeten Linux-Distribution installiert haben.

Ich schlage vor, einen Cloud-Server-Anbieter wie Linode zu verwenden, um schnell einen Linux-Server in der Cloud bereitzustellen.

Ich habe domain.com als Beispiel-Domainnamen im Tutorial verwendet. Bitte stellen Sie sicher, dass Sie es entsprechend Ihren eigenen Domains oder Subdomains ändern.

1. Ändern Sie die DNS-Einträge Ihrer Domain

Stellen Sie im DNS-Eintragsfenster Ihres Domainnamenanbieters sicher, dass sowohl die Domain als auch die Subdomains (einschließlich www) auf die IP-Adresse Ihres Servers verweisen.

Lassen Sie beispielsweise für die Root-Domain das Hostnamen-Feld leer (oder @) und verwenden Sie für Subdomains einen Platzhalter „*“, während Sie die Server-IP festlegen.

2. Leerzeichen tauschen

Um sicherzustellen, dass sich alle Ihre Container-Apps wohlfühlen und ihnen nach der Bereitstellung nie der Arbeitsspeicher ausgeht, ist es wichtig, dass Sie über den erforderlichen Auslagerungsspeicher auf Ihrem System verfügen.

Sie können den Swap jederzeit entsprechend dem verfügbaren RAM auf Ihrem System anpassen. Sie können den Auslagerungsbereich basierend auf dem Bündel von App-Containern auf dem einzelnen Server festlegen und deren kumulierte RAM-Nutzung schätzen. Discourse prüft und konfiguriert auch den Swap für Sie.

3. Erstellen Sie ein Docker-Netzwerk

Über dieses Docker-Netzwerk können Container nach Bedarf miteinander kommunizieren. Nennen wir es Kette zum leichteren Verständnis.

Sie verwenden dieses Netzwerk, wenn Sie alle Ihre Container konfigurieren.

docker network create chain

4. Nginx-Reverse-Proxy einrichten

Fahren Sie nun mit der Einrichtung von Nginx Reverse Proxy fort. Beachten Sie, dass dies als Schnittstelle fungiert, die alle verschiedenen Containerports auf sich selbst abbildet, sodass Sie über URLs darauf zugreifen können. Sie können es auch als „Muttercontainer“ bezeichnen.

docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy

5. Richten Sie Let’s Encrypt Nginx Proxy Companion

ein

Beachten Sie, dass wir Docker anweisen, Volumes zu verwenden, die bereits im ersten nginx-proxy-Container deklariert sind. Es verwendet dasselbe „Ketten“-Netzwerk, das Sie in Schritt 3 erstellt haben.

docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion

Dieser Begleitcontainer für nginx-proxy kümmert sich um die Einrichtung von SSL-Zertifikaten mit Let’s Encrypt. Sie werden das sehen, während Sie Ihre Discourse-Container endgültig einrichten.

6. WWW-Umleitung durch Nginx (CNAME nicht erforderlich, optionaler Schritt zur Verwendung von Subdomains)

Um die Weiterleitung von domain.com-Anfragen an www.domain.com wie jede andere Website sicherzustellen, müssen Sie einen zusätzlichen Schritt ausführen.

Geben Sie den nginx-proxy-Container ein:

docker exec -ti nginx-proxy /bin/bash

Sie würden jetzt einen Root-Prompt wie diesen sehen:

[email protected]:/app#

Erinnern Sie sich an den Speicherort /etc/nginx/vhost.d, den ich in Schritt 4 erwähnt habe? Erstellen Sie hier eine neue Datei, die mit Ihrem Stammdomänennamen identisch ist. Sie haben kein vim oder nano hier. Anstatt Vim oder Nano zu installieren, verwenden Sie cat Befehl.

cat >> /etc/nginx/vhost.d/domain.com

Bei der nächsten Eingabeaufforderung bearbeitet alles, was Sie schreiben, die Datei. Stellen Sie also sicher, dass Sie www.domain.com durch Ihre eigene Domain ersetzen in der nächsten Zeile:

rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Drücken Sie die Eingabetaste und dann Strg + D, um es zu speichern. Geben Sie exit ein, um den Container zu verlassen.

[email protected]:/app# exit

Stoppen wir alle oben genannten Container (in der angegebenen Reihenfolge), die Sie bisher erstellt haben. Sie werden keinen Neustart verwenden, starten Sie sie einfach erneut, da Sie nicht möchten, dass andere Container beim Neustart jeden von ihnen abhören.

docker stop nginx-proxy
docker stop letsencrypt-nginx-proxy-companion
docker start nginx-proxy
docker start letsencrypt-nginx-proxy-companion

7. Klonen Sie das offizielle Discourse Docker-Image

Klonen Sie gemäß der offiziellen Anleitung das offizielle Diskurs-Docker-Image in das Verzeichnis /var/discourse. Hier kann Discourse nach der Einrichtung alle Docker-Volumes speichern, die zu den jeweiligen Containern gehören.

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

8. Kopieren Sie die Standalone-Konfiguration

Als nächstes müssen Sie sicherstellen, dass Sie die Datei /var/discourse/standalone.yml als app.yml nach /var/discourse/containers/ kopieren, bevor Sie sie Ihren Anforderungen entsprechend bearbeiten.

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

Eine typische standalone.yml sieht so aus.

9. Bereiten Sie die Standalone-Konfiguration vor

Sie müssen diese Datei jetzt bearbeiten, da Ihre Konfiguration auf nginx basieren wird.

Die Ports 80 und 443 sind bereits von diesem belegt. Sie haben auch bereits unseren letsencrypt-Container und müssen Discourse Ihr vorhandenes Docker-Netzwerk zeigen, in das Sie ihn einfügen möchten.

Während Sie hier Ihre Domain festlegen, benötigen Sie auch einen Mailserver, um Ihre Forumsbenachrichtigungs-E-Mails zu konfigurieren (ich habe hier Sendgrid verwendet).

Beachten Sie, dass LETSENCRYPT_EMAIL (zum Benachrichtigen von SSL-Updates) und DISCOURSE_DEVELOPER_EMAILS (für den Administrator) bei Bedarf unterschiedlich sein können.

nano /var/discourse/containers/app.yml

10. Passen Sie die Standalone-Konfiguration an

Das Folgende ist meine bearbeitete Datei, die zu Demonstrationszwecken in app.yml umbenannt wurde. Es wird empfohlen, Ihre eigene yml-Datei zu bearbeiten, um Ausrichtungsprobleme zu vermeiden.

this is the all-in-one, standalone Discourse Docker container template
 #
 After making changes to this file, you MUST rebuild
 /var/discourse/launcher rebuild app
 #
 BE VERY CAREFUL WHEN EDITING!
 YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
 visit http://www.yamllint.com/ to validate this file as needed
 templates:
 "templates/postgres.template.yml"
 "templates/redis.template.yml"
 "templates/web.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"
 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:80"   # http
 #- "443:443" # https
 docker_args:
   - "--net chain" 
 params:
   db_default_text_search_config: "pg_catalog.english"
 ## Set db_shared_buffers to a max of 25% of the total memory.
   ## will be set automatically by bootstrap based on detected RAM, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #UNICORN_WORKERS: 3
 ## TODO: The domain name this Discourse instance will respond to
   ## Required. Discourse will not work with a bare IP number.
   DISCOURSE_HOSTNAME: 'domain.com'
   VIRTUAL_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_EMAIL: '[email protected]'
 ## Uncomment if you want the container to be started with the same
   ## hostname (-h option) as specified above (default "$hostname-$config")
   #DOCKER_USE_HOSTNAME: true
 ## TODO: List of comma delimited emails that will be made admin and developer
   ## on initial signup example '[email protected],[email protected]'
   DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
 ## TODO: The SMTP mail server used to validate new accounts and send notifications
   # SMTP ADDRESS, username, and password are required
   # WARNING the char '#' in SMTP password can cause problems!
   DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net
   DISCOURSE_SMTP_PORT: 587
   DISCOURSE_SMTP_USER_NAME: apikey
   DISCOURSE_SMTP_PASSWORD: yourpassword
   DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
 ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
   #LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
 ## The http or https CDN address for this Discourse instance (configured to pull)
   ## see https://meta.discourse.org/t/14857 for details
   #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
 The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone/log/var-log
   guest: /var/log 
 Plugins go here
 see https://meta.discourse.org/t/19157 for details
 hooks:
   after_code:
     - exec:
         cd: $home/plugins
         cmd:
           - git clone https://github.com/discourse/docker_manager.git
 Any custom commands to run after building
 run:
 exec: echo "Beginning of custom commands"
 ## If you want to set the 'From' email address for your first registration, uncomment and change:
 ## After getting the first signup email, re-comment the line. It only needs to run once.
 #- exec: rails r "SiteSetting.notification_email='[email protected]'"
 exec: echo "End of custom commands" 

Überprüfen Sie die folgenden Details noch einmal:

Portkonfiguration sollte sein:

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

Vorhandener Netzwerkname in der Datei richtig konfiguriert, wie oben gezeigt.

docker_args:
  - "--net chain"

Andernfalls sehen Sie eine leere Seite, wenn Sie Ihre Domain nach der Installation überprüfen.

12. Bootstrap und Start

Führen Sie nach dem Speichern der obigen Datei die folgenden Befehle aus:

cd /var/discourse
./launcher bootstrap app

Dies wird eine beträchtliche Zeit in Anspruch nehmen. Am Ende des Bootstrap-Prozesses werden Sie zu Folgendem aufgefordert:

./launcher start app

Beachten Sie, dass, wenn Sie die Datei xyz.yml genannt hätten, der Befehl entsprechend geändert worden wäre (./launcher start xyz).

Es ist der Name des laufenden Containers, den Sie mit „docker ps überprüfen können “. Wenn Sie nun die Domain in Ihrem Browser aufrufen, sehen Sie die folgende Seite:

13. SSL-Einstellungen

Ab diesem Zeitpunkt ist der Registrierungsprozess ganz einfach. Nachdem Sie die Registrierung abgeschlossen haben, gehen Sie im Docker-Admin-Dashbaird zu Einstellungen>Sicherheit und aktivieren Sie „https erzwingen“.

Stoppen Sie nach dem Speichern den Container und starten Sie ihn erneut:

./launcher stop app
./launcher start app

Nach einigen Augenblicken beginnt SSL mit der Arbeit in Ihrem Forum. Achten Sie auch auf die Abhängigkeiten für https.

14. Installieren Sie mehr Discourse-Instanzen in mehr eigenständigen Containern

Für weitere Discourse-Container müssen Sie denselben Vorgang ab Schritt 8 noch einmal wiederholen .

Anfangs haben Sie die App verwendet. Jetzt sollten Sie andere Namen wie app2, app3 usw. verwenden.

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

Außerdem wäre für jeden von ihnen ein zusätzlicher Schritt erforderlich, um einen neuen Speicherort (z. B. standalone2, standalone3 usw.) in ihren jeweiligen yml-Dateien für die Docker-Volumes anzugeben (überprüfen Sie Schritt 10). Natürlich müssen Sie auch den Domainnamen ändern.

## The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone2
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone2/log/var-log
   guest: /var/log

Folgen Sie damit den restlichen Schritten und Sie haben mehr Discourse auf demselben Server installiert.

Ich hoffe, Sie finden diesen Artikel nützlich, um mehr als ein Discourse-Forum mit den jeweiligen Docker-Containern einzurichten.

Wenn Sie Fragen oder Anregungen haben, hinterlassen Sie bitte unten einen Kommentar.


Linux
  1. Hosten Sie mehrere Websites in Docker-Containern

  2. Wie installiere ich R 3.3.1 im eigenen Verzeichnis?

  3. So installieren Sie Docker und führen Docker-Container in Ubuntu aus

  4. So installieren Sie den Apache-Webserver unter Ubuntu

  5. So installieren Sie Discourse unter Ubuntu 20.04

So installieren Sie Docker Portainer zum Verwalten von Containern

So hosten Sie mehrere WordPress-Sites auf demselben Server mit Docker

So installieren Sie OpenLDAP auf Ubuntu Server 22.04

So installieren Sie Lighttpd auf Ubuntu Server

Wie installiere ich einen FTP-Server auf Ubuntu?

So installieren Sie Docker unter Ubuntu 18.04