Aunque la aplicación Discourse admite la configuración multisitio, esta es una configuración avanzada para administradores de sistemas. Si no sabe lo que está haciendo, no configure multisitio. El equipo de Discourse no puede ofrecer soporte para la configuración multisitio.
Si desea alojar varios dominios en una única configuración de Docker, necesitará una configuración multisitio. Estos son los elementos básicos para una.
Entender los hooks
La configuración multisitio es un tema bastante avanzado. Antes de intentar una implementación multisitio, dedique algo de tiempo a aprender sobre ellos.
Las plantillas de Discourse usan pups; sus reglas son sencillas y potentes.
Cada regla que ejecute puede definir un hook:
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
Más tarde, dentro de su contenedor, puede insertar reglas antes o después de un hook:
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
Así que en el ejemplo anterior verá una salida como la siguiente:
I ran before
1
I ran after
Puede leer las plantillas en /var/discourse/templates para ver qué hooks tiene disponibles.
Modificar su contenedor independiente para aprovisionar el tenant del segundo sitio
Reemplace la sección completa de hooks con:
hooks:
after_postgres:
- exec: sudo -u postgres createdb b_discourse || exit 0
- exec:
stdin: |
grant all privileges on database b_discourse to discourse;
cmd: sudo -u postgres psql b_discourse
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'
after_code:
- exec:
cd: $home/plugins
cmd:
- mkdir -p plugins
- git clone https://github.com/discourse/docker_manager.git
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
secondsite:
adapter: postgresql
database: b_discourse
pool: 25
timeout: 5000
host_names:
- b.discourse.example.com
after_bundle_exec:
- exec: cd /var/www/discourse && sudo -H -E -u discourse bundle exec rake multisite:migrate
Hay 4 hooks en juego:
-
after_postgresasegura que después de instalar postgres se cree una base de datos adicional llamadab_discoursecon los permisos apropiados y las extensiones requeridas. -
after_codeasegura quedocker_managerse descargue en el directorio de plugins. -
before_bundle_execasegura que el archivomultisite.ymlesté en su lugar (que define dónde encontrar las bases de datos). -
after_bundle_execejecuta la tarea personalizada de migración de la base de datosrake multisite:migrate— esto asegura que todas las bases de datos estén actualizadas.
Nota sobre la configuración
El ejemplo anterior se puede dividir en contenedor de datos / contenedor de aplicaciones si es necesario. Simplemente ejecute el hook after_postgres en el contenedor de datos y el resto en el contenedor web.
El ejemplo anterior se puede extender para aprovisionar aún más bases de datos. Para hacerlo, aprovisione más bases de datos duplicando las llamadas de creación de DB, etc., y asegúrese de agregar sitios adicionales en multisite.yml.
Asegúrese de modificar el nodo host_names en multisite.yml para que coincida con el nombre de host real que desea alojar.
Además, si planea usar HTTPS, necesitará un proxy delante del sitio para manejarlo, ya que la funcionalidad integrada de letsencrypt no funcionará en un escenario multisitio.