Configuração de Servidor 3 de Alta Disponibilidade

O Discourse suporta múltiplas máquinas (cada uma com um único contêiner Docker) atrás de um balanceador de carga independente?

Preciso de uma configuração do Discourse para lidar com a falha de um servidor, então minha resposta padrão é configurar 3 servidores atrás de um balanceador de carga (com o LB gerenciando o certificado SSL).

Configurei servidores externos independentes de PostgreSQL e Redis para o Discourse. (Tudo isso está na Google Cloud Platform). Estou usando o lançador do Discourse para configurar o contêiner Docker apenas para web.

  1. O Discourse suporta a execução de múltiplos contêineres quando cada contêiner está em uma máquina diferente?
  2. Devo apenas copiar o contêiner Docker criado da primeira máquina para as outras máquinas?
  3. Como são tratados os logotipos enviados?
  4. Os logotipos enviados, favicons, etc., são armazenados no banco de dados?

Muito obrigado pela ajuda.

5 curtidas

Sim, é assim que operamos no nosso serviço de hospedagem.

  1. Sim
  2. Sim
  3. Você deve configurar Usar armazenamento de objetos para uploads (S3 e clones)
  4. Não, eles vão para o armazenamento de objetos, conforme mencionado no item 3.
7 curtidas

Obrigado, Rafael. Muito apreciado.

Encontrei um problema com o SSL encerrado no balanceador de carga. O Discourse especifica todos os seus links como HTTP.

Existe alguma maneira de fazer o Discourse perceber que seus links devem ser HTTPS?

Sim, acesse o console do Rails e defina-o como https com:

cd /var/discourse
./launcher enter app
rails c
SiteSetting.force_https = true
2 curtidas

Excelente. Obrigado novamente.

Presumo que eu pudesse fazer no app.yml
- exec: rails c "SiteSetting.force_https = true"

Não faço ideia sobre rails. No meu comando acima, deveria ser ‘rails c’ ou ‘rails r’?

2 curtidas

Temos um exemplo de alteração das configurações do site no bootstrap em nosso arquivo de amostra:

3 curtidas

Sim, foi de lá que copiei meu comando.

Uma última pergunta. O contêiner Docker é monitorado? Se o contêiner Docker parar por qualquer motivo, o launcher configurou algo para reiniciá-lo?

Sim, o launcher pede ao Docker para reiniciar automaticamente os containers.

2 curtidas

Ok. Então, agora tenho um Discourse funcional em uma única máquina. Tenho outras duas máquinas. O volume compartilhado do Docker guest está apontado para um diretório NFS para permitir que todas as máquinas acessem os uploads (especialmente logotipos, etc.).

Copiei as imagens do Docker para as máquinas 2 e 3 (docker save -o app-image local_discourse/app e depois docker load -i app-image).

Eu tinha a impressão de que um simples ./launcher start app funcionaria, mas ele tenta verificar containers/app.yml.

Vou ter problemas se permitir que o app.yml seja verificado (e alterações feitas) no banco de dados a partir das máquinas 2 e 3?

Existe uma maneira melhor de ter três máquinas executando uma única configuração?

1 curtida

Você tem duas opções:

  • Use – acho que é ./launcher start-command app – na máquina totalmente configurada (a “máquina de build”) para obter uma linha de comando Docker completa
  • Copie o app.yml e faça o que você acabou de tentar (launcher start).
5 curtidas

Eu configuraria a variável de ambiente DISCOURSE_FORCE_HTTPS: true

6 curtidas