Embora a funcionalidade multisite seja suportada 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 para configuração de multisite.
Se você deseja hospedar múltiplos domínios em uma única instalação Docker, você 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 instalaçã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 (gancho):
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 site tenant
Substitua a inteira seção 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
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 4 hooks em ação:
-
after_postgresgarante que, após o postgres ser instalado, um banco de dados adicional chamadob_discourseseja criado com as permissões apropriadas e extensões necessárias. -
after_codegarante que odocker_managerseja clonado no diretório de plugins. -
before_bundle_execgarante que o arquivomultisite.ymlesteja no lugar (o que define onde encontrar os bancos de dados). -
after_bundle_execexecuta a tarefa de migração de banco de dados personalizadarake multisite:migrate— isso garante que todos os bancos de dados estejam atualizados.
Nota sobre 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 embutida não funcionará em um cenário multisite.