Embora o multisite seja suportado na aplicação Discourse, esta é uma configuração avançada de sysadmin. Se você não sabe o que está fazendo, não configure o multisite. A equipe do Discourse não pode fornecer suporte à configuração de multisite.
Se você deseja hospedar vários domínios em uma única configuração Docker, precisará de uma configuração multisite. Aqui estão os blocos de construção básicos para uma.
Entenda os hooks
Multisite é um tópico bastante avançado. Antes de tentar uma construção multisite, dedique algum tempo para aprender sobre eles.
Os templates do Discourse usam pups; suas regras são simples e poderosas.
Cada regra que você executa pode definir um hook:
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
Mais tarde, em seu contêiner, você pode inserir regras antes ou depois de um hook:
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
Portanto, no exemplo acima, você verá uma saída como a seguinte:
I ran before
1
I ran after
Você pode ler os templates em /var/discourse/templates para ver quais hooks você tem disponíveis.
Modifique seu contêiner standalone para provisionar o segundo tenant do site
Substitua a seção inteira de hooks por:
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
Existem 3 hooks em ação:
-
after_postgresgarante que, após a instalação do postgres, um banco de dados adicional chamadob_discourseseja criado com as permissões apropriadas. -
before_bundle_exec, garante quedocker_manageresteja no lugar e que o arquivomultisite.ymlesteja no lugar (que define onde encontrar os bancos de dados) -
after_bundle_exec, executa a tarefa de migração de banco de dados personalizadarake multisite:migrate, isso garante que todos os bancos de dados estejam atualizados.
Nota sobre a configuração
O exemplo acima pode ser dividido em contêiner de dados / contêiner de aplicação, se necessário. Basta executar o hook after_postgres no contêiner de dados e o restante no contêiner web.
O exemplo acima pode ser estendido para provisionar ainda mais bancos de dados. Para fazer isso, provisione mais bancos de dados duplicando as chamadas de criação de banco de dados, etc., e certifique-se de adicionar sites adicionais em multisite.yml.
Certifique-se de alterar o nó host_names em multisite.yml para corresponder ao nome de host real que você deseja hospedar.
Além disso, se você planeja executar HTTPS, precisará de um proxy na frente do site para lidar com isso, pois a funcionalidade letsencrypt integrada não funcionará em um cenário multisite.