Setup Multisite-Konfiguration mit Let's Encrypt und ohne Reverse Proxy

These instructions should be considered beta and for those familiar with a standard setup

But right now (2023.02.11) these instructions do not work!! (See Set up Let’s Encrypt with multiple domains / redirects for how to update the letsencrypt setting to add the fullpath part. I’ll update this to reflect those changes Real Soon Now.)

I developed this howto a couple weeks ago but need someone to test and see if this works for someone else. Please reply if you try and let me know whether it works and if anything is unclear.

And on with the show. . .

This howto documents broadly how to set up a multisite setup with 2 additional hosts (3 total).

It assumes that you have a working Discourse official Standard Installation or 2-container installation (Move from standalone container to separate web and data containers).

Domain name for primary site

subdomain for the 2nd site

Suddomain for the 3rd site

Database password (same as DISCOURSE_DB_PASSWORD) or discourse in app.yml

For the sake of simplicity, this is for a main site called =domain=, with two additional sites =two=.=domain= and =three=.=domain=. You can use whatever names you want, but for the sake of this template, not having a different short name (for the database name and title for the sub-forum) and full hostname is a bit easier.

add in hooks after the plugins in app.yml or web_only.yml

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         =two=:
           adapter: postgresql
           database: =two=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =two=.=domain=
         =three=:
           adapter: postgresql
           database: =three=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =three=.=domain=

  after_db_migrate:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

  after_ssl:
   # tell letsencrypt what additional certs to get
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # do not redirect all hosts back to the main domain name
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \(\$http_host[^\}]*\}/m
        to: ""

Add to the after_postgres section in app.yml or data.yml

  - exec: sudo -u postgres createdb =two= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =two= to discourse;
        cmd: sudo -u postgres psql =two=
        raise_on_fail: false

    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
    - exec: sudo -u postgres createdb =three= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =three= to discourse;
        cmd: sudo -u postgres psql =three=
        raise_on_fail: false
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'

After that,

./launcher rebuild app

or

./launcher rebuild data
./launcher rebuild web_only
10 „Gefällt mir“

I just tried it out, in fact I tried it twice because I couldn’t believe it just worked without any problems the first time already :smile: All I did was copying, adjusting the domains and password and then pasting into the respective files of a fresh installation with 2 containers. :ok_hand:

Regards feedback whether anything is unclear, I only had to mull a bit over this paragraph:

It seems to suggest a 2-container setup is necessary to follow along, but then it isn’t. And I didn’t understand why it links to post 48 of the topic, rather than the initial post.

1 „Gefällt mir“

Thanks! I’ll take a look. Those both seem like the kind of careless things I was hoping you’d let me know about!

EDIT: Thanks! I’d carelessly copied my current location in the 2-container topic, so I fixed that, and changed the language to say that it’ll work with any working installation.

Thanks!

2 „Gefällt mir“

Hi
I started with a standard Discourse install (at DigitalOcean), then setup nginx (using these instructions) because I wanted a couple of Drupal sites on the same droplet
If I want to have another instance of Discourse should I follow the above?

Or would this guide be better?

Thanks!
/Sifaan

These instructions are for not using a reverse proxy. I’d recommend that you follow Multisite configuration with Docker. The instructions that you linked might work, but I’d recommend that you first follow what’s here.

1 „Gefällt mir“

Thanks; I notice that with that both sites would use the same SMTP config :frowning:
is there a way to bypass that?
or would the other guide be better (looks like it might require some work to put the existing site on the docker network)

alternately, is it possible to install another codebase, say /var/discourse2 ?
(it will cost me ~500MB but worth it if it saves me the brain damage)

Yes.

Don’t use multisite.

Yes, but you just need to create a 2-container installation and then have a web_only2.yml. (I think that you can have 2 app.yml-style files, but then you’re needlessly running two postgres instances). I think, though, that you do need two redis instances.

3 „Gefällt mir“

Thanks; because I am not too familiar with splitting the data and web container I just created another standalone container following these guidelines (and certificates created by certbot seem to be working). However currently there seems to be an issue with mailgun config - it sends activation emails to gmail but anything mail hosted at my registrar (dreamhost) is failing :frowning:

How much of a extra load would the extra Postgres instance causing?
I looked at your post about splitting and will try it if the savings were significant.

Probably not that much. Just a bit of RAM. I have little idea how much.

1 „Gefällt mir“

Recently I’ve been giving this a try, but I’m having trouble with a couple of things in the guide:

  1. I can’t seem to find the Database password (or what it is even used for in the file)
  2. My app.yml file did not originally contain an after_postgres section, so I added one under hooks to match the others (after_ssl, after_db_migrate, etc.). If this is placed in the wrong section, please let me know, I’m completely new to working with this type of stuff.
  3. When I check the syntax of the YAML file on http://www.yamllint.com/ I get (<unknown>): did not find expected key while parsing a block mapping on the line where I put the after_postgres section under the hooks section.

If you could clarify the steps for editing the app.yml file, that would be greatly appreciated.

2 „Gefällt mir“

Maybe you don’t need a password if you’re using a single container setup (an earlier post suggests that).

Adding the section as you suggest should work.

I can’t quite the what might be wrong. I’ll try to take a closer look on a couple of days.

1 „Gefällt mir“

Ich überlege, dies einzurichten, da mein Freund und ich ein paar verschiedene Foren testen möchten, bevor wir entscheiden, ob wir mehr in sie investieren wollen, möglicherweise mit separatem Hosting und so weiter.

Ich dachte daran, sie auf verschiedenen Domains zu haben. Ich verstehe, dass dies zu einiger Verwirrung führen kann, da die Leute E-Mails von nur der Haupt-SMTP-Adresse erhalten, aber wissen Sie, ob separate Domains andere Probleme verursachen würden?

Discourse hat eine einzige Domain für alle seine Geschäfts- und Standardkunden. Sie können die E-Mail-Adresse für Benachrichtigungen beliebig festlegen, z. B. shortname@whatevermail.com.

2 „Gefällt mir“

Das freut mich sehr zu hören, danke!

1 „Gefällt mir“

Hallo, vielen Dank für das Tutorial.

Leider habe ich ein Problem, zusätzliche Discourse-Instanzen auf einem einzigen Server/einer einzigen IP-Adresse auszuführen.
Zuerst habe ich die Dokumentation befolgt, um eine eigenständige Website einzurichten, und das war erfolgreich.
(z. B. test.john.com - ein Subdomain-Redirect zur einzelnen IP)
Als ich nun versuchte, weitere Discourse-Instanzen hinzuzufügen (z. B. test.joe.com und test.doe.com - andere Subdomains von anderen Websites).
Ich habe versucht, Ihren Schritten zu folgen, aber es war nicht erfolgreich und jetzt bin ich ratlos.

Einige Fragen:

  1. Wie werden diese beiden weiteren Websites installiert? Wie das Kopieren von /standalone.yml in das containers-Verzeichnis und das Umbenennen? Und dann die normale Installation durchführen? (z. B. ./launcher rebuild joe)
  2. Ihre Anweisungen besagen, dass die Änderungen in der app.yml vorgenommen werden sollen, indem der gesamte obige Code angehängt wird – was ich davon ausgehe, dass es in die erste erfolgreich installierte Datei (test.john.com) eingefügt werden soll?

Abgesehen von denen im container-Verzeichnis habe ich eine config/multisite.yml erstellt und so sieht mein Code aus:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# und die Konfiguration der dritten Website

Ich bin mir jedoch nicht sicher, ob es noch andere Dinge gibt, die ich konfigurieren muss.

Ich freue mich über jede Antwort. Danke!

Nein. Sie fügen die Dinge wie beschrieben zur app.yml hinzu. Dadurch wird die mutlisite.yml innerhalb des Containers erstellt. Es wird eine einzige Instanz geben und sie wird für alle Domains funktionieren, vorausgesetzt, die DNS für alle davon zeigen dorthin. Dies ist nicht dazu gedacht, mehrere Discourse-Container für jeden Domainnamen zu haben.

Nach meinem letzten Kenntnisstand funktionierten diese Anweisungen so, wie sie geschrieben wurden. Fügen Sie einfach die Zeilen zu Ihrer app.yml hinzu und es sollte funktionieren. Sie müssen keine anderen Dateien anfassen.

1 „Gefällt mir“

Einzelne Website-Normaleinrichtung funktioniert perfekt. Kein Problem.
Aber ich habe viele Kombinationen für Multisite ausprobiert. Einzelne app.yml-Konfiguration oder getrennt nach web_only.yml, data.yml usw. Ich habe andere Tipps unter Multisite-Konfiguration mit Docker oder Umzug von einem eigenständigen Container zu separaten Web- und Datencontainern ausprobiert.

Was den Migrationspart angeht, sind alle Kombinationen immer fehlgeschlagen… >> bundle exec rake multisite:migrate

********************** letzter Teil des Prozesses**************************
2023-02-11 17:50:43.853 UTC [61] LOG: Herunterfahren wird eingeleitet
162:M 11 Feb 2023 17:50:43.866 # Benutzer hat das Herunterfahren angefordert...
162:M 11 Feb 2023 17:50:43.866 * Speichern des finalen RDB-Snapshots vor dem Beenden.
162:M 11 Feb 2023 17:50:43.881 * DB auf Festplatte gespeichert
162:M 11 Feb 2023 17:50:43.882 # Redis ist nun bereit zum Beenden, auf Wiedersehen...
2023-02-11 17:50:44.007 UTC [57] LOG: Das Datenbanksystem wurde heruntergefahren.


FEHLGESCHLAGEN
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate fehlgeschlagen mit Rückgabewert #&lt;Process::Status: pid 582 exit 1&gt;
Ort des Fehlschlags: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec fehlgeschlagen mit den Parametern "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate"
Bootstrap fehlgeschlagen mit Exit-Code 1
** BOOTSTRAP FEHLGESCHLAGEN ** Bitte scrollen Sie nach oben und suchen Sie nach früheren Fehlermeldungen, es kann mehr als eine geben.
./discourse-doctor kann helfen, das Problem zu diagnostizieren.

Ich habe überprüft, was erstellt wurde und was nicht, bis zum Fehlschlag.
Subdomain-Datenbanken werden erstellt, aber die Migration schlug fehl. Subdomain-Nginx-Konfigurationen oder multisite.yml konnten nicht erstellt werden, als ich die overlay2-Ordner oder irgendwo anders überprüft habe.

./launcher bootstrap, destroy, start, stop, rebuild oder frische Einrichtung viele Male … Alle Befehle ausprobiert, aber nichts ist passiert… :slight_smile:

Ist dieses Tutorial noch gültig für v3.1.0.beta 2 oder was könnte ich übersehen?
Irgendwelche Ideen, bitte?

1 „Gefällt mir“

Nein. Etwas mit Let’s Encrypt hat sich irgendwann geändert. Ich werde Sie bitten, genauer zu untersuchen, was alles im Container geändert werden muss, um mehrere Domains zu verwalten.

1 „Gefällt mir“

Ich verwende diese Methode und sie funktioniert gut. Ich habe derzeit kein HTTPS aktiviert, daher kann ich nichts zu den Schwierigkeiten mit Let’s Encrypt sagen.

Ich benutze dieses Setup seit Jahren mit meinen Staging-Servern. Seit dem Update auf 3.5.0.beta5-dev werde ich jedoch auf die primäre Website umgeleitet, wenn ich eine Subdomain eingebe.

Ich war so glücklich, mich nicht mit all den Zertifizierungsangelegenheiten befassen zu müssen. Aber jetzt bin ich ziemlich verloren, gibt es Tools, um zu debuggen, was passiert?