Sebbene il multisito sia supportato nell’applicazione Discourse, questa è una configurazione avanzata per amministratori di sistema. Se non sai cosa stai facendo, non configurare il multisito. Il team di Discourse non è in grado di fornire supporto per la configurazione multisito.
Se desideri ospitare più domini su una singola configurazione Docker, avrai bisogno di una configurazione multisito. Ecco i blocchi fondamentali per una.
Comprendere gli hook
Il multisito è un argomento piuttosto avanzato. Prima di tentare una build multisito, dedica del tempo per impararli.
I template di Discourse utilizzano pups; le sue regole sono semplici e potenti.
Ogni regola che esegui può definire un hook:
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
Successivamente, nel tuo container puoi inserire regole prima o dopo un hook:
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
Quindi nell’esempio sopra vedrai un output simile al seguente:
I ran before
1
I ran after
Puoi leggere i template in /var/discourse/templates per vedere quali hook hai a disposizione.
Modificare il tuo container standalone per effettuare il provisioning del tenant del secondo sito
Sostituisci l’intera sezione 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
Ci sono 3 hook in gioco:
-
after_postgresassicura che dopo l’installazione di postgres venga creato un db aggiuntivo chiamatob_discoursecon i permessi appropriati. -
before_bundle_exec, assicura chedocker_managersia presente e che il filemultisite.ymlsia presente (il quale definisce dove trovare i database) -
after_bundle_exec, esegue l’attività di migrazione del db personalizzatarake multisite:migratequesto assicura che tutti i db siano aggiornati.
Nota sulla configurazione
L’esempio sopra può essere suddiviso in container dati / container app se necessario. Esegui semplicemente l’hook after_postgres nel container dati e il resto nel container web.
L’esempio sopra può essere esteso per effettuare il provisioning di ancora più DB. Per farlo, effettua il provisioning di più DB duplicando le chiamate di creazione db ecc., e assicurati di aggiungere siti aggiuntivi in multisite.yml.
Assicurati di modificare il nodo host_names in multisite.yml per farlo corrispondere al nome host effettivo che desideri ospitare.
Inoltre, se hai intenzione di eseguire HTTPS, avrai bisogno di un proxy davanti al sito per gestirlo poiché la funzionalità letsencrypt integrata non funzionerà in uno scenario multisito.