Configuración de Multisite con Let's Encrypt y sin Proxy Inverso

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 Me gusta

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 me gusta

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 Me gusta

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 me gusta

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 Me gusta

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 me gusta

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 Me gusta

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 me gusta

Estoy pensando en configurar esto, ya que mi amigo y yo queremos probar varios foros diferentes antes de decidir si invertimos más en ellos, posiblemente teniendo alojamiento separado y cosas así.

Estaba pensando en tenerlos en dominios diferentes, entiendo que puede generar un poco de confusión ya que la gente recibirá los correos electrónicos de la dirección SMTP principal, sin embargo, ¿sabes si los dominios separados crearían algún otro dolor de cabeza?

Discourse tiene un único dominio para todos sus clientes empresariales y estándar. Puedes hacer que la dirección de correo electrónico de notificación sea la que desees, como shortname@whatevermail.com.

2 Me gusta

¡Me alegra mucho oír esto, gracias!

1 me gusta

Hola, primero que nada, gracias por el tutorial.

Desafortunadamente, tengo un problema al ejecutar Discourse adicional en un solo servidor/IP.
Primero, seguí la documentación para configurar un sitio independiente y fue exitoso.
(por ejemplo, test.john.com - un subdominio que redirige a la IP única)
Ahora, cuando intenté agregar más Discourse (por ejemplo, test.joe.com y test.doe.com - otros subdominios de otros sitios).
Intenté seguir tus pasos pero no tuve éxito y ahora estoy perdido.

Algunas preguntas:

  1. ¿Cómo se instalarán estos dos sitios más? ¿Como copiar el /standalone.yml al directorio containers y renombrarlo? ¿Y simplemente hacer la instalación regular? (por ejemplo, ./launcher rebuild joe)
  2. Tus instrucciones indican que los cambios deben estar en el app.yml, agregando todo el código anterior, ¿lo que supongo que se agregará en el primer archivo instalado exitosamente (test.john.com)?

Aparte de los del directorio container, creé un config/multisite.yml y así es como se ve mi código:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# y la configuración del tercer sitio

Sin embargo, no estoy seguro si hay otras cosas que necesite configurar.

Agradezco cualquier respuesta. ¡Gracias!

No. Añades las cosas a app.yml como se describe. Eso creará mutlisite.yml dentro del contenedor. Habrá una sola instancia y funcionará para todos los dominios, dado que el DNS de todos ellos apunta allí. Esto no es para tener múltiples contenedores de Discourse, uno para cada nombre de dominio.

La última vez que comprobé, esas instrucciones funcionaban tal como estaban escritas. Simplemente añade las líneas a tu app.yml y debería funcionar. No necesitas tocar ningún otro archivo.

1 me gusta

La configuración de un solo sitio web funciona perfectamente. Sin problemas.
Pero probé muchas combinaciones para multisitio. Configuración de app.yml única o separada por web_only.yml, data.yml, etc. Probé otros consejos en Configuración multisitio con Docker o Moverse de un contenedor independiente a contenedores web y de datos separados.

En cuanto a la parte de migración, todas las combinaciones siempre fallaron… >> bundle exec rake multisite:migrate

********************** última parte del proceso**************************
2023-02-11 17:50:43.853 UTC [61] LOG: apagando
162:M 11 Feb 2023 17:50:43.866 # Solicitud de apagado por el usuario...
162:M 11 Feb 2023 17:50:43.866 * Guardando la instantánea final de RDB antes de salir.
162:M 11 Feb 2023 17:50:43.881 * DB guardado en disco
162:M 11 Feb 2023 17:50:43.882 # Redis está listo para salir, adiós...
2023-02-11 17:50:44.007 UTC [57] LOG: sistema de base de datos apagado


FALLIDO
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate falló con retorno #&lt;Process::Status: pid 582 exit 1&gt;
Ubicación del fallo: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec falló con los parámetros "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate"
bootstrap falló con código de salida 1
**FALLO AL INICIAR** por favor desplácese hacia arriba y busque mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.

Comprobé qué se creó y qué no se creó hasta el fallo.
Las bases de datos de subdominios se crean pero la migración falló. Las configuraciones nginx de subdominios o multisite.yml no pudieron crearse cuando revisé las carpetas overlay2 o en cualquier lugar.

./launcher bootstrap,destroy,start,stop,rebuild o configuración nueva muchas veces…Probé todos los comandos pero nada sucedió… :slight_smile:

¿Sigue siendo válido este tutorial para v3.1.0.beta 2 o qué podría estar yo perdiendo?
¿Alguna idea, por favor?

1 me gusta

No. Algo sobre Let’s Encrypt cambió en algún momento. Te haré examinar más de cerca todo lo que necesitas cambiar dentro del contenedor para manejar múltiples dominios.

1 me gusta

Estoy usando este método y funciona bien. Actualmente no tengo https habilitado, así que no puedo comentar sobre las dificultades de Let’s Encrypt.

He estado usando esta configuración durante años con mis servidores de staging. Sin embargo, desde que actualicé a la versión 3.5.0.beta5-dev, ahora soy redirigido al sitio principal cada vez que ingreso un subdominio.

He estado tan contento de no tener que lidiar con todo el tema de las certificaciones. Pero ahora estoy bastante perdido, ¿hay herramientas para depurar lo que está sucediendo?