Nach einigen Tagen Basteln mit Let’s Encrypt hier ein Beitrag für alle, die daran interessiert sind, mehrere Foren zu betreiben.
1 Ziel
Angenommen, Sie haben eine Domain wie diese und möchten 3 Foren betreiben:
bbs.antivte.com
cp.antivte.com
ytb.antivte.com
2 Discourse-Container
2.1 Vorbereitung
Sie sollten 3 app.yml-Dateien für Ihre verschiedenen Foren haben, benannt nach Belieben als bbs.yml, cp.yml, ytb.yml.
Der Inhalt sollte wie folgt aussehen:
Bitte beachten Sie: Wir verwenden einen Unix-Socket, um sich von außen mit dem Nginx-Server und dem Backend-Discourse-Container zu verbinden, anstatt auf Port 80 oder 443 zu lauschen. Die SSL-Konfiguration für den Backend-Container wurde ebenfalls entfernt.
Bitte beachten Sie auch: Hier haben wir nur einen Container pro Forum, nicht separate Daten- und Web-Container für jedes Forum.
## Dies ist die All-in-One, eigenständige 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 EXTREM 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"
## Entfernen Sie den Kommentar bei diesen zwei Zeilen, wenn Sie Let's Encrypt (https) hinzufügen möchten
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- "templates/web.socketed.template.yml" # <--- Hinzugefügt
## 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,
## siehe https://meta.discourse.org/t/17247 für Details
**#expose:**
**# - "8080:80" # http**
**# - "8443:443" # https**
params:
db_default_text_search_config: "pg_catalog.english"
## Setzen Sie db_shared_buffers auf maximal 25% des gesamten Arbeitsspeichers.
## Wird automatisch vom Bootstrap basierend auf dem erkannten RAM festgelegt, 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:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt von Arbeitsspeicher und CPU-Kernen ab.
## Wird automatisch vom Bootstrap basierend auf den erkannten CPUs festgelegt, oder Sie können es überschreiben
UNICORN_WORKERS: 4
## TODO: Der Domainname, auf den diese Discourse-Instanz antworten soll
## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Adresse.
DISCOURSE_HOSTNAME: bbs.antivte.com
## Kommentar entfernen, wenn der Container mit demselben
## Hostnamen (-h-Option) wie oben angegeben gestartet werden soll (Standard "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Liste der durch Komma getrennten E-Mail-Adressen, die bei der ersten Registrierung zu Administratoren und Entwicklern werden
## Beispiel 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'techempower@163.com'
## TODO: Der SMTP-Mailserver zur Validierung neuer Konten und zum Senden von Benachrichtigungen
## SMTP-Adresse, Benutzername und Passwort sind erforderlich
## WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: postmaster@mail.antivte.com
DISCOURSE_SMTP_PASSWORD: "67c9458eb7a6ff11b4db70f097b1b5c3-f7910792-0e7dbcc9"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, Standard true)
## Wenn Sie die Let's Encrypt-Vorlage hinzugefügt haben, entfernen Sie unten den Kommentar, um ein kostenloses SSL-Zertifikat zu erhalten
LETSENCRYPT_ACCOUNT_EMAIL: techempower@163.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 Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
- volume:
**host: /var/discourse/shared/bbs**
guest: /shared
- volume:
**host: /var/discourse/shared/bbs/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
- git clone https://github.com/procourse/procourse-installer
## Beliebige benutzerdefinierte Befehle nach dem Erstellen ausführen
run:
- exec: echo "Beginn der benutzerdefinierten Befehle"
## Wenn Sie die 'Von'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, entfernen Sie den Kommentar und ändern Sie:
## Nach Erhalt der ersten Registrierungs-E-Mail den Kommentar bei dieser Zeile wieder hinzufügen. Sie muss nur einmal ausgeführt werden.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Ende der benutzerdefinierten Befehle"
2.2 Einrichtung
Erstellen Sie ein Setup-Skript wie folgt:
#!/usr/bin/env bash
./launcher bootstrap bbs
./launcher bootstrap test
./launcher bootstrap cp
./launcher bootstrap ytb
./launcher start bbs
./launcher start test
./launcher start cp
./launcher start ytb
Wenn Sie dieses Skript bereits verwendet haben und jeden Container einmal gestartet haben, müssen Sie nach Änderungen am Inhalt von app.yml den Container neu erstellen, damit die Änderungen wirksam werden:
./launcher rebuild bbs
2.3 Überprüfung
Sie werden sehen, dass 3 Container erfolgreich laufen. Überprüfen Sie auch den Unix-Socket, ob alles in Ordnung ist:
root@docker-s-1vcpu-2gb-sgp1-01:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9702f94ea9b4 local_discourse/bbs "/sbin/boot" 9 hours ago Up 9 hours bbs
dc13c303c38e local_discourse/cp "/sbin/boot" 9 hours ago Up 9 hours cp
dafa592ee16f local_discourse/ytb "/sbin/boot" 9 hours ago Up 9 hours ytb
root@docker-s-1vcpu-2gb-sgp1-01:~# curl --unix-socket /var/discourse/shared/bbs/nginx.http.sock http:/images/json
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>血栓之家</title>
3 Externer Nginx
Installieren Sie Nginx/OpenResty auf Ihrem Server und erstellen Sie eine nginx.conf in einem beliebigen Verzeichnis. Das Verzeichnis beeinflusst nur Ihren Nginx-Startbefehl. Der Inhalt von nginx.conf sieht wie folgt aus:
Hier habe ich ein Cloudflare-Zertifikat und einen Schlüssel und habe sie im Host-Verzeichnis wie folgt abgelegt:
3.1 nginx.conf
ssl_certificate /var/discourse/shared/ssl/antivte.com.cert.pem;
ssl_certificate_key /var/discourse/shared/ssl/antivte.com.key.pem;
In Zukunft werde ich Ihnen erklären, wie Sie automatisierte Let’s Encrypt-Zertifikate und Schlüssel im externen Nginx verwenden können.
events {
worker_connections 1024;
}
http {
# Das „auto_ssl“ geteilte Wörterbuch sollte mit genügend Speicherplatz definiert werden,
# um Ihre Zertifikatsdaten zu speichern. 1 MB Speicherplatz reicht für Zertifikate von
# etwa 100 separaten Domains.
lua_shared_dict auto_ssl 1m;
# Das „auto_ssl_settings“ geteilte Wörterbuch wird verwendet, um vorübergehend verschiedene Einstellungen
# wie den geheimen Schlüssel des Hook-Servers auf Port 8999 zu speichern. Ändern oder entfernen Sie dies nicht.
lua_shared_dict auto_ssl_settings 64k;
# Ein DNS-Resolver muss für OCSP-Stapling definiert werden.
#
# Dieses Beispiel verwendet den DNS-Server von Google. Sie möchten möglicherweise Ihre System-Standard-DNS-Server verwenden,
# die in /etc/resolv.conf zu finden sind. Wenn Ihr Netzwerk nicht IPv6-kompatibel ist, können Sie IPv6-Ergebnisse
# durch Verwendung des Flags „ipv6=off“ deaktivieren (z. B. „resolver 8.8.8.8 ipv6=off“).
resolver 8.8.8.8;
server {
listen 80; listen [::]:80;
server_name bbs.antivte.com; # <--- ändern Sie dies
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name bbs.antivte.com; # <--- ändern Sie dies
ssl_certificate /var/discourse/shared/ssl/antivte.com.cert.pem;
ssl_certificate_key /var/discourse/shared/ssl/antivte.com.key.pem;
# ssl_dhparam /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
http2_idle_timeout 5m; # erhöht von der Standardzeit von 3m
location / {
proxy_pass http://unix:/var/discourse/shared/bbs/nginx.http.sock;
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;
}
}
server {
listen 80; listen [::]:80;
server_name cp.antivte.com; # <--- ändern Sie dies
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name cp.antivte.com; # <--- ändern Sie dies
ssl_certificate /var/discourse/shared/ssl/antivte.com.cert.pem;
ssl_certificate_key /var/discourse/shared/ssl/antivte.com.key.pem;
# ssl_dhparam /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
http2_idle_timeout 5m; # erhöht von der Standardzeit von 3m
location / {
proxy_pass http://unix:/var/discourse/shared/cp/nginx.http.sock;
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;
}
}
server {
listen 80; listen [::]:80;
server_name ytb.antivte.com; # <--- ändern Sie dies
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name ytb.antivte.com; # <--- ändern Sie dies
ssl_certificate /var/discourse/shared/ssl/antivte.com.cert.pem;
ssl_certificate_key /var/discourse/shared/ssl/antivte.com.key.pem;
# ssl_dhparam /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
http2_idle_timeout 5m; # erhöht von der Standardzeit von 3m
location / {
proxy_pass http://unix:/var/discourse/shared/ytb/nginx.http.sock;
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;
}
}
}
3.2 Nginx starten
Wechseln Sie in das Verzeichnis, in dem Sie Ihre nginx.conf abgelegt haben, und führen Sie folgenden Befehl aus:
nginx -p `pwd`/ -c nginx.conf
4. Dann erhalten Sie, was Sie wollen
Woo-hoo!