Configurazione multisito con Let's Encrypt e senza 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 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

Sto pensando di configurarlo, dato che io e il mio amico vogliamo testare alcuni forum diversi prima di decidere se investire di più su di essi, possibilmente avendo hosting separati e cose del genere.

Stavo pensando di metterli su domini diversi, capisco che possa creare un po’ di confusione dato che le persone riceveranno le email solo dall’indirizzo SMTP principale, tuttavia, sai se domini separati creerebbero altri grattacapi?

Discourse ha un unico dominio per tutti i suoi clienti aziendali e standard. Puoi impostare l’indirizzo email di notifica come preferisci, ad esempio shortname@whatevermail.com.

2 Mi Piace

Sono molto felice di sentirlo, grazie!

1 Mi Piace

Ciao, prima di tutto grazie per il tutorial.

Sfortunatamente, ho un problema nell’eseguire ulteriori discourse su un singolo server/IP.
Innanzitutto, ho seguito la documentazione per avviare un sito standalone ed è stato un successo.
(ad es. test.john.com - un sottodominio che reindirizza all’IP singolo)
Ora, quando ho provato ad aggiungere altri discourse (ad es. test.joe.com e test.doe.com - altri sottodomini da altri siti).
Ho provato a seguire i tuoi passaggi ma non ci sono riuscito e ora sono perso.

Alcune domande:

  1. Come verranno installati questi altri due siti? Come copiare /standalone.yml nella directory containers e rinominarlo? E fare semplicemente l’installazione regolare? (ad es. ./launcher rebuild joe)
  2. Le tue istruzioni affermano che le modifiche dovrebbero essere in app.yml, aggiungendo tutto il codice sopra - che presumo debba essere aggiunto nel primo file installato con successo (test.john.com)?

Oltre a quelli nella directory container, ho creato un config/multisite.yml e questo è il codice che ho:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# e la configurazione del terzo sito

Non sono sicuro, però, se ci siano altre cose che devo configurare.

Apprezzo qualsiasi risposta. Grazie!

No. Aggiungi le cose a app.yml come descritto. Questo creerà mutlisite.yml all’interno del container. Ci sarà una singola istanza e funzionerà per tutti i domini, dato che il DNS per tutti punta lì. Questo non serve ad avere più container di Discourse, uno per ogni nome di dominio.

Per quanto ne so, quelle istruzioni funzionavano così come erano scritte. Aggiungi solo le righe al tuo app.yml e dovrebbe funzionare. Non è necessario toccare nessun altro file.

1 Mi Piace

La configurazione di un singolo sito funziona perfettamente. Nessun problema.
Ma ho provato molte combinazioni per il multisito. Configurazione singola app.yml o separata da web_only.yml, data.yml ecc… Ho provato altri suggerimenti su Configurazione multisito con Docker o Spostamento da container standalone a container web e dati separati.

Per quanto riguarda la migrazione, tutte le combinazioni sono sempre fallite… >> bundle exec rake multisite:migrate

********************** ultima parte del processo**************************
2023-02-11 17:50:43.853 UTC [61] LOG:  spegnimento in corso
162:M 11 Feb 2023 17:50:43.866 # Richiesta di spegnimento dall'utente...
162:M 11 Feb 2023 17:50:43.866 * Salvataggio dello snapshot RDB finale prima dell'uscita.
162:M 11 Feb 2023 17:50:43.881 * DB salvato su disco
162:M 11 Feb 2023 17:50:43.882 # Redis è ora pronto per uscire, arrivederci...
2023-02-11 17:50:44.007 UTC [57] LOG:  sistema di database spento


FALLITO
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate fallito con ritorno #&lt;Process::Status: pid 582 exit 1&gt;
Posizione del fallimento: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec fallito con i parametri "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate"
bootstrap fallito con codice di uscita 1
** FALLITO IL BOOTSTRAP ** si prega di scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor potrebbe aiutare a diagnosticare il problema.

Ho controllato cosa è stato creato e cosa non è stato creato fino al fallimento.
I database dei sottodomini sono stati creati ma la migrazione è fallita. Le configurazioni nginx dei sottodomini o multisite.yml non sono state create quando ho controllato le cartelle overlay2 o altrove.

./launcher bootstrap,destroy,start,stop,rebuild o fresh setup molte volte… Ho provato tutti i comandi ma non è successo nulla… :slight_smile:

Questo tutorial è ancora valido per v3.1.0.beta 2 o cosa potrei star missing?
Qualche idea, per favore?

1 Mi Piace

No. Qualcosa riguardo a Let’s Encrypt è cambiato a un certo punto. Ti farò dare un’occhiata più da vicino a tutto ciò che deve essere modificato all’interno del container per gestire più domini.

1 Mi Piace

Sto usando questo metodo e funziona bene. Al momento non ho https abilitato, quindi non posso commentare le difficoltà di Let’s Encrypt.

Utilizzo questa configurazione da anni con i miei server di staging. Tuttavia, dopo l’aggiornamento a 3.5.0.beta5-dev, vengo reindirizzato al sito principale ogni volta che inserisco un sottodominio.

Ero così felice di non dovermi occupare di tutte le questioni relative alle certificazioni. Ma ora sono piuttosto perso, ci sono strumenti per eseguire il debug di ciò che sta accadendo?