Bien que le multisite soit pris en charge dans l’application Discourse, il s’agit d’une configuration d’administrateur système avancée. Si vous ne savez pas ce que vous faites, ne configurez pas le multisite. L’équipe Discourse n’est pas en mesure de fournir un support de configuration multisite.
Si vous souhaitez héberger plusieurs domaines sur une seule configuration Docker, vous aurez besoin d’une configuration multisite. Voici les éléments de base pour en créer une.
Comprendre les hooks
Le multisite est un sujet assez avancé. Avant de tenter une construction multisite, passez du temps à vous familiariser avec eux.
Les modèles Discourse utilisent pups ; ses règles sont simples et puissantes.
Chaque règle que vous exécutez peut définir un hook :
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
Plus tard dans votre conteneur, vous pouvez insérer des règles avant ou après un hook :
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
Ainsi, dans l’exemple ci-dessus, vous verrez une sortie similaire à ce qui suit :
I ran before
1
I ran after
Vous pouvez parcourir les modèles dans /var/discourse/templates pour voir quels hooks sont disponibles.
Modifier votre conteneur autonome pour provisionner le deuxième site locataire
Remplacez l’intégralité de la section hooks par :
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
Il y a 3 hooks en jeu :
-
after_postgresgarantit qu’après l’installation de postgres, une base de données supplémentaire appeléeb_discourseest créée avec les autorisations appropriées. -
before_bundle_exec, garantit quedocker_managerest en place et que le fichiermultisite.ymlest en place (ce qui définit où trouver les bases de données) -
after_bundle_exec, exécute la tâche de migration de base de données personnaliséerake multisite:migratececi garantit que toutes les bases de données sont à jour.
Note sur la configuration
L’exemple ci-dessus peut être divisé en conteneur de données / conteneur d’application si nécessaire. Exécutez simplement le hook after_postgres dans le conteneur data et le reste dans le conteneur web.
L’exemple ci-dessus peut être étendu pour provisionner encore plus de bases de données. Pour ce faire, provisionnez plus de bases de données en dupliquant les appels de création de base de données, etc., et assurez-vous d’ajouter des sites supplémentaires dans multisite.yml.
Assurez-vous de modifier le nœud host_names dans multisite.yml pour qu’il corresponde au nom d’hôte réel que vous souhaitez héberger.
De plus, si vous prévoyez d’exécuter HTTPS, vous aurez besoin d’un proxy devant le site pour le gérer, car la fonctionnalité letsencrypt intégrée ne fonctionnera pas dans un scénario multisite.