Migração de container autônomo para containers web e de dados separados

Obrigado, Jay @pfaffman,

Você é realmente um recurso valioso de primeira linha aqui, sem dúvida!

O que você acha dessa ideia talvez maluca (baseada no meu entendimento ainda limitado):

Configurar nginx como um proxy reverso na parte frontal; conforme este tutorial:

Em seguida, ter dois diretórios / instâncias com o discourse_docker (standalone) configurado, por exemplo:

  1. /var/discourse1
  2. /var/discourse2

Em ambas as instâncias, configure o discourse_docker (standalone) para escutar em um socket diferente, modificando este modelo em cada instância:

 - "templates/web.socketed.template.yml"

Então, em resumo, nós simplesmente reconstruímos a produção (em algum momento tranquilo) para rodar em um container diferente, escutando em um socket diferente (nginx.https.sock2). Assim, não há conflito de sockets; o que podemos construir também em modo standalone (com o objetivo de eliminar a necessidade de dois containers, data e web-only).

Por exemplo (para discussão / ilustração), em web.socketed.template.yml no discourse1:

  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;/
     to: |
       listen unix:/shared/nginx.http.sock;
       set_real_ip_from unix:;
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen unix:/shared/nginx.https.sock ssl http2;
       set_real_ip_from unix:;

e no discourse2:

 - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;/
     to: |
       listen unix:/shared/nginx.http.sock2;
       set_real_ip_from unix:;
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen unix:/shared/nginx.https.sock2 ssl http2;
       set_real_ip_from unix:;

No entanto, em vez de deixar o modelo do discourse fazer a mágica, nós simplesmente trocamos manualmente os sockets em /etc/nginx/conf.d/discourse.conf e reiniciamos o nginx. Assim, removeríamos a diretiva replace: no modelo web.socketed.template.yml.

Nesta configuração proposta (talvez ideia maluca), podemos ter dois containers standalone escutando em dois sockets diferentes (sem conflito) e simplesmente configurar o nginx para se conectar ao socket que desejamos e reiniciar o nginx.

Isso parece claro, fácil e talvez útil (durante um período lento de zero novas postagens na instância ao vivo) para aqueles que podem não querer (ou precisar) da complexidade de dois containers (data e web-only) por uma única instância do Discourse (app).

Claro, a configuração mais robusta (do ponto de vista dos dados), no entanto, para a perfeição em sites movimentados seria a solução de “dois containers”, pois quereríamos as instâncias data e web-only (agora escutando em dois sockets diferentes, sock e sock2).

Na solução de “dois containers” com o front-end nginx, a “configuração padrão” é fazer com que ambos os containers web-only escutem no mesmo socket, de modo que ambos não possam rodar ao mesmo tempo; mas se (por exemplo apenas) fizéssemos com que escutassem em sockets diferentes, ambos poderiam rodar ao mesmo tempo e poderíamos apenas usar o arquivo de configuração do nginx (e um reinício do nginx) para alternar entre os dois.

Essa é a compreensão correta?

Estou começando a (lentamente, mas espero que com certeza) entender isso?

Obrigado!

Nota de Acompanhamento Apenas: Tenho a configuração de “dois containers” funcionando em um dos meus Macs de desktop:

Screen Shot 2020-04-11 at 12.41.24 PM

As únicas ressalvas na nossa instalação foram a necessidade de criar manualmente esses diretórios (e definir a propriedade e as permissões), pois esses diretórios não são criados por algum motivo pelos scripts:

~discourse/discourse/shared/data
~discourse/discourse/shared/web-only

e, claro, no início tentei com uma senha em branco para o banco de dados, e isso não funcionou (as instruções dizem para definir uma senha, mas eu estava apenas experimentando).

Em seguida, configurarei o front-end nginx e tentarei a migração para essa configuração com websocket para o app web-only.