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 keine Unterstützung für die Multisite-Konfiguration anbieten.
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, Multisite einzurichten, nehmen Sie sich etwas Zeit, um sich darüber zu informieren.
Discourse-Vorlagen verwenden pups; deren Regeln sind einfach und mächtig.
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 in /var/discourse/templates durchlesen, um zu sehen, welche Hooks Ihnen zur Verfügung stehen.
Ändern Sie Ihren Standalone-Container, um den zweiten Site-Mandanten bereitzustellen
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
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 4 Hooks im Spiel:
-
after_postgresstellt sicher, dass nach der Installation von PostgreSQL eine zusätzliche Datenbank namensb_discoursemit den entsprechenden Berechtigungen und erforderlichen Erweiterungen erstellt wird. -
after_codestellt sicher, dassdocker_managerin das Plugins-Verzeichnis geklont wird. -
before_bundle_execstellt sicher, dass die Dateimultisite.ymlvorhanden ist (die festlegt, wo die Datenbanken zu finden sind). -
after_bundle_execführt den benutzerdefinierten DB-Migrations-Taskrake multisite:migrateaus – dies stellt sicher, dass alle Datenbanken auf dem neuesten Stand sind.
Hinweis zur Konfiguration
Das obige Beispiel kann bei Bedarf in einen Datencontainer / App-Container aufgeteilt werden. Führen Sie einfach den Hook after_postgres im Datencontainer und den Rest im Webcontainer 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 an den tatsächlichen Hostnamen anpassen, den Sie hosten möchten.
Wenn Sie außerdem HTTPS betreiben 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.