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 proporcionar soporte para la configuración multisitio.
Si desea alojar varios dominios en una única configuración de Docker, necesitará una configuración multisitio. Aquí están los componentes básicos para una.
Entender los hooks
La configuración multisitio es un tema bastante avanzado. Antes de intentar una configuración multisitio, dedique algo de tiempo a aprender sobre ellos.
Las plantillas de Discourse utilizan 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 adelante, en 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 segundo sitio (tenant)
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
db_id: 2
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 3 hooks en juego:
-
after_postgresasegura que después de que se instale postgres se cree una base de datos adicional llamadab_discoursecon los permisos apropiados. -
before_bundle_exec, asegura quedocker_manageresté en su lugar y que el archivomultisite.ymlesté en su lugar (que define dónde encontrar las bases de datos). -
after_bundle_exec, ejecuta la tarea de migración de base de datos personalizadarake 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 base de datos, 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 ejecutar HTTPS, necesitará un proxy delante del sitio para manejarlo, ya que la funcionalidad integrada de letsencrypt no funcionará en un escenario multisitio.