Obwohl Multisite von der Discourse-Anwendung unterstützt wird, handelt es sich hierbei um eine fortgeschrittene Sysadmin-Einrichtung. Wenn Sie nicht wissen, was Sie tun, richten Sie kein Multisite ein. Das Discourse-Team kann keinen Support für die Multisite-Konfiguration leisten.
Wenn Sie mehrere Domains auf einer einzigen Docker-Einrichtung hosten möchten, benötigen Sie eine Multisite-Konfiguration. Hier sind die grundlegenden Bausteine dafür.
Hooks verstehen
Multisite ist ein ziemlich fortgeschrittenes Thema. Bevor Sie versuchen, ein Multisite-Setup zu erstellen, sollten Sie sich etwas Zeit nehmen, um sich darüber zu informieren.
Discourse-Vorlagen verwenden pups; deren Regeln sind einfach und leistungsstark.
Jede Regel, die Sie ausführen, kann einen Hook definieren:
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
Später in Ihrem Container können Sie Regeln vor oder nach einem Hook einfügen:
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
Im obigen Beispiel sehen Sie dann eine Ausgabe wie die folgende:
I ran before
1
I ran after
Sie können die Vorlagen unter /var/discourse/templates durchlesen, um zu sehen, welche Hooks Ihnen zur Verfügung stehen.
Ändern Ihres Standalone-Containers zur Bereitstellung des zweiten Site-Tenants
Ersetzen Sie den gesamten hooks-Abschnitt durch:
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
Es sind 3 Hooks im Spiel:
-
after_postgresstellt sicher, dass nach der Installation von Postgres eine zusätzliche Datenbank namensb_discoursemit den entsprechenden Berechtigungen erstellt wird. -
before_bundle_execstellt sicher, dassdocker_managervorhanden ist und die Dateimultisite.ymlvorhanden ist (die angibt, wo die Datenbanken zu finden sind). -
after_bundle_execführt den benutzerdefinierten DB-Migrations-Taskrake multisite:migrateaus, um sicherzustellen, dass alle Datenbanken auf dem neuesten Stand sind.
Hinweis zur Konfiguration
Das obige Beispiel kann bei Bedarf in einen Datencontainer und einen App-Container aufgeteilt werden. Führen Sie einfach den Hook after_postgres im Daten-Container und den Rest im Web-Container aus.
Das obige Beispiel kann erweitert werden, um noch mehr Datenbanken bereitzustellen. Duplizieren Sie dazu die Aufrufe zum Erstellen von Datenbanken usw. und stellen Sie sicher, dass Sie zusätzliche Sites in multisite.yml hinzufügen.
Stellen Sie sicher, dass Sie den Knoten host_names in multisite.yml so ändern, dass er dem tatsächlichen Hostnamen entspricht, den Sie hosten möchten.
Wenn Sie außerdem HTTPS ausführen möchten, benötigen Sie einen Proxy vor der Site, um dies zu handhaben, da die integrierte Letsencrypt-Funktionalität in einem Multisite-Szenario nicht funktioniert.