Discourse + Let's Encrypt mit mehreren Hostnamen

Beim Migrieren (via Backup) einer Discourse-Instanz von einem Hostnamen zu einem anderen möchte ein Administrator möglicherweise den alten Hostnamen beibehalten, aber den Webserver so konfigurieren, dass Anfragen auf den neuen kanonischen Namen umgeschrieben werden, z. B.:

https://old.example.org/t/my-great-topic/12345 :arrow_heading_down:
https://new.example.org/t/my-great-topic/12345

Leider ist dies nicht so einfach, wie nur den CNAME- oder A-Eintrag in DNS zu ändern; der Browser-Client wird einen Fehler/Warnung ausgeben, da der Hostname nicht mit dem Zertifikat übereinstimmt, das von der Discourse-Installation über Let’s Encrypt generiert wurde.

Bei einer manuellen Installation eines Webservers würde ich das certbot-Hilfsprogramm verwenden, um ein Zertifikat mit mehreren Namen zu generieren, die ihm zugewiesen sind. Die Discourse-Konfiguration übergibt jedoch nur den Discourse-Hostnamen an Let’s Encrypt, und ich kann in der Discourse-Konfiguration kein Konzept für Aliase erkennen.

Hat jemand eine solche Konfiguration eingerichtet oder eine Ahnung, wie man dies am besten erreicht? Ich vermute, es wird einige Änderungen an den SSL- und Let’s Encrypt-Vorlagen erfordern.

Nicht Discourse-spezifisch, aber wenn ich eine Weiterleitung über HTTPS benötige, leite ich einfach alles um. Das bedeutet, dass ein Server die Umleitung von der alten Adresse zur neuen übernimmt. Manche Hosting-Optionen kümmern sich im Hintergrund darum, manchmal als „Domain-Weiterleitung

Discourse antwortet nur auf einen Hostnamen. Wenn Sie mehr als einen Hostnamen benötigen – wobei Ihr Anwendungsfall, der den früheren Hostnamen unterstützt, der häufigste ist –, müssen Sie den einen auf den anderen umleiten.

Ich empfehle, dies außerhalb von Discourse zu erledigen. Erstellen Sie einfach eine Nginx-Konfiguration, die über ein eigenes Zertifikat verfügt, einen server_name für den alten Hostnamen hat und alles auf den neuen Hostnamen weiterleitet.

Tatsächlich funktioniert bei einer Docker-basierten Installation mit einer Instanz pro Server die Antwort auf eine beliebige Anzahl von DNS-Einträgen einwandfrei (nginx lauscht auf Port 80 und 443 für alle Hostnamen) und leitet die URL korrekt auf den kanonischen „neuen

Das ist nicht nötig. Du brauchst lediglich einen zusätzlichen server-Abschnitt in deiner Konfiguration.

Schauen Sie sich vielleicht Set up Let’s Encrypt with multiple domains / redirects an

Update: Sekundärer Domainname auf der Standalone-Installation erfolgreich konfiguriert und ein Let’s Encrypt-Zertifikat ausgestellt, um sowohl den alten als auch den neuen Namen zu verarbeiten.

Voraussetzung: Ich habe die DNS-Einträge noch nicht geändert, um den Traffic auf die neue Site umzuleiten; ich wollte sicherstellen, dass alles vorher funktioniert. Daher habe ich auf meinem Testrechner einen localhost-Eintrag verwendet. Das bedeutet, ich konnte keine normale Let’s Encrypt-Verifizierung durchführen und musste stattdessen die „DNS“-Methode von acme.sh verwenden, die generell nicht empfohlen wird, da sie kein automatisches Erneuern unterstützt. Für mich ist das in Ordnung, da ich innerhalb der 30-Tage-Laufzeit des „initialen“ (neu ausgestellten 2-Namen-)Zertifikats umstellen werde.

  1. In meiner web_only.yml-Datei (möglicherweise verwenden Sie app.yml) unter dem Abschnitt hooks: und vor den Plugins folgendes hinzugefügt:
  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d second-domain.com --keylength"
  1. In DNS einen vorübergehenden/ungültigen TXT-Eintrag für _acme-challenge.old.example.org mit einer TTL von 5 Minuten einrichten (Sie könnten diese auch kürzer setzen) und warten, bis er propagiert ist, um den Wechsel mit dem Verifikationsschlüssel von acme.sh (Let’s Encrypt) schnell durchführen zu können.

  2. Die Site stoppen und eine Debug- (Test-)Validierung durchführen, damit das System den kurzen TTL des neuen Eintrags erkennt:

./launcher enter app
sv stop nginx
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
LE_WORKING_DIR=/shared/letsencrypt DEBUG=1 /shared/letsencrypt/acme.sh --issue -d new.example.org -d old.example.org -k 4096 -w /var/www/discourse/public --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --force
  1. Den Vorgang diesmal ohne Debug-Einstellung tatsächlich ausführen. Dies führt zu einer Warnung mit dem Wert, den Sie für den in Schritt 2 erstellten Eintrag in DNS verwenden müssen:
LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/acme.sh --issue -d new.example.org -d old.example.org -k 4096 -w /var/www/discourse/public --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --force
  1. DNS aktualisieren und dann 5 Minuten warten. Ja, Sie sollten die ganze Zeit warten, um die Einschränkungen von Let’s Encrypt nicht zu überschreiten.

  2. Eine ähnliche Version des letzten Befehls im renew-Modus ausführen:

LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/acme.sh --issue -d new.example.org -d old.example.org -k 4096 -w /var/www/discourse/public --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --force --renew
  1. Sie sollten eine Bestätigung erhalten. Führen Sie Folgendes aus, um die Aufräumarbeiten durchzuführen und das neue Zertifikat zu aktivieren:
LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/acme.sh --installcert -d new.example.org -d old.example.org --fullchainpath /shared/ssl/new.example.org.cer --keypath /shared/ssl/new.example.org.key --reloadcmd "sv reload nginx"
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop
exit
  1. Letzter Schritt, nachdem Sie den Launcher verlassen haben:
rm -rf /var/discourse/shared/standalone/ssl
rm -rf /var/discourse/shared/standalone/letsencrypt
./launcher rebuild app

Sobald die Site wieder verfügbar ist, sollte sie mit dem neuen Zertifikat laufen. Möglicherweise müssen Sie die gespeicherten Zertifikate in Ihrem Browser löschen, was als Übung für den Leser und Ihre bevorzugte Suchmaschine überlassen bleibt.

Danke an alle, die mich in die richtige Richtung gelenkt haben!

Dies ist eine ideale Anwendung für eine Cloudflare-Regel – keine Serverkonfiguration erforderlich. Übertragen Sie einfach dieselben URL-Parameter an die neue Domain.

Für den alten Domainnamen muss die orange Wolke aktiviert sein.

Ja, eine Reverse-Proxy-Situation wie bei Cloudflare (oder wie ich vermute, Ihr eigener bevorzugter Reverse Proxy vor Ihrer Discourse-Site) könnte dies umgehen, indem die Rewrite-Regeln “eine Ebene höher” implementiert werden. In diesem Fall war Cloudflare aus Sicherheits- und ethischen Gründen keine Option. :slight_smile:

(Siehe oben für eine eigenständige Lösung.)