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 l’une d’elles.
Comprendre les crochets (hooks)
Le multisite est un sujet assez avancé. Avant de tenter une construction multisite, passez du temps à les apprendre.
Les modèles Discourse utilisent pups ; ses règles sont simples et puissantes.
Chaque règle que vous exécutez peut définir un crochet (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 crochet :
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 semblable à ce qui suit :
I ran before
1
I ran after
Vous pouvez parcourir les modèles dans /var/discourse/templates pour voir quels crochets sont disponibles.
Modifier votre conteneur autonome pour provisionner le second site locataire
Remplacez la totalité 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
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 4 crochets en jeu :
-
after_postgresassure qu’après l’installation de postgres, une base de données supplémentaire nomméeb_discourseest créée avec les permissions appropriées et les extensions requises. -
after_codeassure quedocker_managerest cloné dans le répertoire des plugins. -
before_bundle_execassure que le fichiermultisite.ymlest en place (ce qui définit où trouver les bases de données). -
after_bundle_execexécute la tâche de migration de base de données personnaliséerake multisite:migrate— cela 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 crochet 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.