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

Estas instrucciones deben considerarse beta y para aquellos familiarizados con una configuración estándar

Pero ahora mismo (2023.02.11) ¡estas instrucciones no funcionan! (Vea Set up Let’s Encrypt with multiple domains / redirects para saber cómo actualizar la configuración de letsencrypt para agregar la parte fullpath. Actualizaré esto para reflejar esos cambios Muy Pronto.)

Desarrollé este tutorial hace un par de semanas, pero necesito que alguien lo pruebe y vea si funciona para otra persona. Por favor, responda si lo intenta y hágame saber si funciona y si algo no está claro.

Y ahora, ¡al espectáculo! . . .

Este tutorial documenta ampliamente cómo configurar una instalación multisitio con 2 hosts adicionales (3 en total).

Asume que tiene una Instalación Estándar Oficial de Discourse o una instalación de 2 contenedores (Move from standalone container to separate web and data containers) que funcione.

Nombre de dominio para el sitio principal

Subdominio para el segundo sitio

Subdominio para el tercer sitio

Contraseña de la base de datos (la misma que DISCOURSE_DB_PASSWORD) o discourse en app.yml

Por simplicidad, esto es para un sitio principal llamado =domain=, con dos sitios adicionales =two=.=domain= y =three=.=domain=. Puede usar los nombres que desee, pero para este modelo, no tener un nombre corto (para el nombre de la base de datos y el título del subforo) y un nombre de host completo diferente es un poco más fácil.

agregue en hooks después de los plugins en app.yml o 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:
   # decirle a letsencrypt qué certificados adicionales obtener
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # no redirigir todos los hosts de vuelta al nombre de dominio principal
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \\(\\$http_host[^\\}]*\\}/m
        to: ""

Agregue a la sección after_postgres en app.yml o 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;"'

Después de eso,

./launcher rebuild app

o

./launcher rebuild data
./launcher rebuild web_only
10 Me gusta

Acabo de probarla; de hecho, la intenté dos veces porque no podía creer que funcionara sin ningún problema desde el primer intento :smile:. Solo tuve que copiar, ajustar los dominios y la contraseña, y luego pegar todo en los archivos correspondientes de una instalación nueva con 2 contenedores. :ok_hand:

Quedo a la espera de comentarios si algo no queda claro. Solo tuve que pensarlo un poco más este párrafo:

Parece sugerir que es necesario un entorno de 2 contenedores para seguir los pasos, pero luego no lo es. Además, no entendí por qué enlaza al mensaje 48 del tema en lugar de al mensaje inicial.

2 Me gusta

¡Gracias! Lo revisaré. Ambas parecen ser ese tipo de descuidos de los que esperaba que me avisaras.

EDIT: ¡Gracias! Había copiado descuidadamente mi ubicación actual en el tema de 2 contenedores, así que lo corregí y cambié el texto para indicar que funcionará con cualquier instalación funcional.

¡Gracias!

2 Me gusta

¡Hola!

Comencé con una instalación estándar de Discourse (en DigitalOcean) y luego configuré nginx (usando estas instrucciones) porque quería tener algunos sitios de Drupal en el mismo droplet.

¿Si quiero tener otra instancia de Discourse, debo seguir lo anterior?

¿O sería mejor esta guía?

¡Gracias!
/Sifaan

Estas instrucciones son para no usar un proxy inverso. Recomiendo que sigas Configuración multisitio con Docker. Las instrucciones a las que enlazaste podrían funcionar, pero te recomiendo que primero sigas lo que se explica aquí.

2 Me gusta

Gracias; noto que con eso ambos sitios usarían la misma configuración SMTP :frowning: ¿hay alguna forma de evitarlo? ¿o sería mejor seguir la otra guía (parece que podría requerir algo de trabajo para poner el sitio existente en la red de Docker)?

Alternativamente, ¿es posible instalar otra base de código, por ejemplo /var/discourse2? (me costará unos 500 MB, pero vale la pena si me ahorra este dolor de cabeza).

Sí.

No uses multisitio.

Sí, pero solo necesitas crear una instalación de 2 contenedores y luego tener un web_only2.yml. (Creo que puedes tener 2 archivos con estilo de app.yml, pero entonces estarías ejecutando innecesariamente dos instancias de PostgreSQL). Creo, sin embargo, que sí necesitas dos instancias de Redis.

3 Me gusta

Gracias; como no estoy muy familiarizado con la separación de los datos y el contenedor web, simplemente creé otro contenedor independiente siguiendo estas pautas (y los certificados generados por certbot parecen funcionar correctamente). Sin embargo, actualmente parece haber un problema con la configuración de Mailgun: envía correos de activación a Gmail, pero cualquier correo alojado en mi registrador (DreamHost) falla :frowning:

¿Cuánta carga adicional generaría la instancia extra de Postgres?
Leí tu publicación sobre la separación y la probaré si los ahorros son significativos.

Probablemente no mucha. Solo un poco de RAM. Tengo poca idea de cuánto exactamente.

1 me gusta

Recientemente he estado intentando esto, pero tengo problemas con varios puntos de la guía:

  1. No logro encontrar la contraseña de la base de datos (ni siquiera sé para qué se usa en el archivo).
  2. Mi archivo app.yml no tenía originalmente una sección after_postgres, así que la agregué bajo hooks para que coincida con las demás (after_ssl, after_db_migrate, etc.). Si esto está en la sección incorrecta, por favor házmelo saber; soy completamente nuevo trabajando con este tipo de cosas.
  3. Cuando verifico la sintaxis del archivo YAML en http://www.yamllint.com/, obtengo el error (\u003cunknown\u003e): did not find expected key while parsing a block mapping en la línea donde coloqué la sección after_postgres bajo la sección hooks.

Si pudieras aclarar los pasos para editar el archivo app.yml, te lo agradecería mucho.

2 Me gusta

Quizás no necesites una contraseña si estás usando una configuración de contenedor único (un post anterior sugiere eso).

Agregar la sección como sugieres debería funcionar.

No logro identificar exactamente qué podría estar mal. Intentaré echar un vistazo más de cerca en unos días.

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?

1 me gusta