Use Nginx Proxy Manager para gerenciar múltiplos sites com Discourse

EDIT: @pfaffman reescreveu isso como um tópico independente com base no que @tophee havia escrito anteriormente. Ainda não foi testado por mim, e eu reorganizei as palavras do Chris, então quaisquer erros provavelmente são de @pfaffman.

Existem motivos para não usar o NGINX Proxy Manager em vez de fazer isso manualmente, conforme descrito em Run other websites on the same machine as Discourse?

Eu já o estou usando. Tenho ele no meu servidor doméstico há algum tempo e, quando migrei minha instância do Discourse para um novo servidor em nuvem, percebi que havia esquecido a maior parte da configuração do proxy reverso NGINX que fiz há 4 anos no servidor antigo. Então pensei: por que não fazer isso com o NGINX Proxy Manager? Para minha surpresa, descobri que ele foi mencionado bastante raramente aqui no meta, então comecei a me perguntar se havia algumas desvantagens que eu poderia ter perdido…

De fato, isso exigiu um pouco de tentativa e erro, mas consegui fazê-lo funcionar da seguinte forma (sem garantia de que esta seja a melhor maneira de fazer isso — na verdade, sei que deve haver uma maneira melhor — então correções e melhorias são muito bem-vindas):

Para começar, existem duas maneiras de acessar sua instância do Discourse: 1. expondo uma porta, 2. via websocket. Acredito ter aprendido em algum lugar neste fórum que o websocket é mais rápido/mais eficiente, então é isso que estou usando, mas expor uma porta deve ser muito mais fácil, então se você não conseguir fazer o socket funcionar, tente expor uma porta. Portanto, para evitar confusão: para acessar o Discourse via porta, siga os passos 0, 1, 2, 3, 4 e 8 abaixo. Se você quiser usar um websocket, siga os passos 0, 1, 5, 6, 7, 8 e 9.

0. Ponto de partida

Vamos supor que você tenha concluído a instalação padrão de 30 minutos e vamos supor que você não tenha deixado o Discourse adquirir um certificado lets encrypt ainda — porque você não precisa dele ao usar um proxy reverso. O NGINX Proxy Manager cuidará disso. Não importa, no entanto, se você já tiver um certificado. O NGINX Proxy Manager simplesmente obterá um novo.

1. Instalar o NGINX Proxy Manager

O próximo passo é instalar o NGINX Proxy Manager para que você tenha mais dois contêineres Docker em execução (o NGINX Proxy Manager e seu contêiner de banco de dados).

Agora vem a parte complicada sobre a qual você está perguntando.

O primeiro obstáculo é que o Discourse roda na rede bridge padrão do Docker, enquanto o NGINX Proxy Manager, por padrão, roda em uma “rede criada pelo usuário” padrão (chamada npm_default no meu caso), o que significa que o NGINX Proxy Manager não consegue ver o Discourse. :cry:

2. Trazer todos os contêineres para a rede bridge padrão

Então, enquanto não sei se e como o Discourse pode ser movido para uma rede personalizada, temos que mover o NGINX Proxy Manager para a rede bridge padrão. Podemos fazer isso adicionando network_mode: bridge a ambos os contêineres do NGINX Proxy Manager em nosso arquivo docker compose.

3. Usar endereço IP em vez de nome de serviço

O próximo problema é que o arquivo docker compose padrão não funcionará mais se você apenas movê-lo para a rede bridge. O NGINX Proxy Manager não conseguirá mais encontrar seu contêiner de banco de dados. Isso ocorre porque a resolução interna de DNS para nomes de serviço (da qual o arquivo docker-compose depende) está disponível apenas em redes criadas pelo usuário, não nas redes padrão do Docker. Portanto, temos que recorrer a endereços IP codificados (o que torna isso definitivamente não a solução ideal, pois quebrará se os IPs dos seus contêineres mudarem). Então, você precisa iniciar o contêiner mesmo sabendo que não funcionará, anote o IP do contêiner de banco de dados do NGINX Proxy Manager e substitua DB_MYSQL_HOST: "db" no seu arquivo docker compose por DB_MYSQL_HOST: "<ip_do_contêiner_db>".

Agora todos os contêineres devem estar na rede bridge padrão para que o NGINX Proxy Manager possa ver tanto o Discourse quanto seu banco de dados.

4. Tornar o Discourse acessível

Mas “ver” o Discourse e ser capaz de acessá-lo não é a mesma coisa. Então, você precisa garantir que o Discourse aceitará qualquer tráfego que o NGINX Proxy Manager encaminhar para ele. Se você não se importa em usar o websocket, imagino que possa apenas apontar o NGINX Proxy Manager para a porta 80 (não 443) do IP do seu contêiner do Discourse, assim:

Não testei isso, no entanto. Como mencionei, estou usando a configuração do websocket, que requer alguns passos adicionais. Note que o nome de host/IP e a porta acima serão ignorados quando você usar o websocket.

5. Configurar app.yml para usar websocket

Isso está explicado no OP, então não vou entrar nisso.

6. Montar o websocket no contêiner do NGINX Proxy Manager

Precisamos dar ao NGINX Proxy Manager acesso ao websocket montando-o como um volume: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Esta é a última alteração no arquivo docker compose padrão do NGINX Proxy Manager, então aqui está a versão final que funciona para mim:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurar o NGINX Proxy Manager para usar o websocket

Último passo: dizer ao NGINX Proxy Manager para usar o websocket. Até onde me lembro, não foi suficiente apenas ativar o “Suporte a Websockets”, então copiei o local NGINX do OP para a aba “Avançado”, assim:

Não consegui fazer isso funcionar na aba “Locais personalizados”.

8. Não esqueça de ativar o SSL

Não mencionei a configuração SSL no NGINX Proxy Manager porque parece bastante óbvia e não acho que importa em que ponto do processo você a ativa. Então, se você ainda não fez isso, é assim que a minha se parece:


9. Atenção

tl;dr Sempre que você reiniciar o contêiner do Discourse, também precisará reiniciar o contêiner principal do NGINX Proxy Manager (não é necessário reiniciar o banco de dados).
Se você estiver acessando o Discourse através do websocket, precisa estar ciente de que, ao reconstruir seu contêiner do Discourse (como é necessário a cada poucos meses para atualizar a imagem base), o websocket anterior será excluído e um novo será criado. Como consequência, o NGINX Proxy Manager perderá o contato com sua instância do Discourse e retornará um erro 502. Talvez uma atualização futura do NGINX Proxy Manager seja capaz de encontrar o novo websocket automaticamente, mas atualmente (janeiro de 2022) o NGINX Proxy Manager não encontrará seu contêiner do Discourse reconstruído a menos que você reinicie o NGINX Proxy Manager.

Explicação

Se você está se perguntando por que as instruções acima combinam o websocket com portas, a razão simples é que, enquanto escrevia este post, de repente me ocorreu que o NGINX Proxy Manager e o Discourse provavelmente nem precisam estar na mesma rede Docker quando usamos o websocket. E quando isso foi confirmado, ninguém sentiu vontade de reescrever completamente as instruções.

Este é o aspecto mais fascinante dos fóruns de suporte: fazer um bom trabalho descrevendo seu problema muitas vezes leva você à solução sem nem mesmo postar sua pergunta. E neste caso, eu estava respondendo à pergunta de outra pessoa, mas também pude ter encontrado a resposta para a minha própria. :smiley:

9 curtidas

Discutir qual proxy reverso você deve usar está claramente fora do escopo de suporte. :wink: Mas, após examinar o NGINX Proxy Manager por 12 segundos ou mais, acredito que ele funcionará bem. Há outra ferramenta “automágica” de proxy NGINX que já vi ser discutida anteriormente também, mas com meu extenso conhecimento do NGINX Proxy Manager, acho que ele pode ser melhor. Posso dar uma olhada nela, pois estou ficando desiludido com o Traefik.

EDIT: Agora examinei a ferramenta por 3 minutos. Prefiro ferramentas que facilitem a automação, então o Traefik e o jwilder/nginx-proxy - Docker Image (que encontrei), que permitem adicionar algumas labels ou variáveis de ambiente ao contêiner Docker para que não seja necessário clicar em uma interface web, são mais o que eu quero. Parece que, para fazer aquela outra ferramenta funcionar, você precisa usar a interface web ou se virar para atualizar o banco de dados manualmente com os hosts que deseja adicionar. Mas, se você estiver disposto a clicar e mexer em uma interface web como uma Pessoa Normal (em vez de um “pessoal” administrador de sistemas), então parece que aquela ferramenta pode ser exatamente o que você está procurando.

4 curtidas

Tentei instalar o Nginx Proxy Manager, mas não consigo entender como “conectar” (proxy? desculpe, sou bastante novo em administração de sistemas) o container do Discourse para que ele seja acessível via navegador.

Pode me dar algumas dicas? O container do Discourse deve expor as portas 80 e 443 ou não, como sugere este tópico do fórum?

1 curtida

De fato, isso exigiu um pouco de tentativa e erro, mas consegui fazer funcionar da seguinte maneira (sem garantia de que esta seja a melhor forma de fazê-lo — na verdade, sei que deve haver uma maneira melhor — então correções e melhorias são muito bem-vindas):

Instruções que @pfaffman moveu para a OP

Para começar, existem duas maneiras de acessar sua instância do Discourse: 1. expondo uma porta, 2. via websocket. Acredito ter aprendido em algum lugar neste fórum que o websocket é mais rápido/mais eficiente, então é isso que estou usando, mas expor uma porta deve ser muito mais fácil. Então, se você não conseguir fazer o socket funcionar, tente expor uma porta (mais sobre isso abaixo).

Vamos supor que você tenha concluído a instalação padrão de 30 minutos e que você ainda não deixou o Discourse obter um certificado do Let’s Encrypt — porque não é necessário quando se usa um proxy reverso. O NPM cuidará disso. Não importa, no entanto, se você já tiver um certificado. O NPM simplesmente obterá um novo.

1. Instalar o NPM

O próximo passo é instalar o NPM para que você tenha mais dois containers Docker em execução (o NPM e seu container de banco de dados).

Agora vem a parte complicada sobre a qual você está perguntando.

O primeiro obstáculo é que o Discourse roda na rede bridge padrão do Docker, enquanto o NPM, por padrão, roda em uma “rede criada pelo usuário” (chamada npm_default no meu caso), o que significa que o NPM não consegue ver o Discourse. :cry:

2. Trazer todos os containers para a rede bridge padrão

Então, enquanto não sei se e como o Discourse pode ser movido para uma rede personalizada, temos que mover o NPM para a rede bridge padrão. Podemos fazer isso adicionando network_mode: bridge a ambos os containers do NPM no nosso arquivo docker compose.

3. Usar endereço IP em vez de nome de serviço

O próximo problema é que o arquivo docker compose padrão não funcionará mais se você apenas movê-lo para a rede bridge. O NPM não conseguirá mais encontrar seu container de banco de dados. Isso ocorre porque a resolução interna de DNS para nomes de serviço (da qual o arquivo docker-compose depende) está disponível apenas em redes criadas pelo usuário, não nas redes padrão do Docker. Então, temos que recorrer a endereços IP codificados manualmente (o que é definitivamente não a solução ideal, pois quebrará se os IPs dos seus containers mudarem). Portanto, você precisa iniciar o container mesmo sabendo que não funcionará, anote o IP do container de banco de dados do NPM e substitua DB_MYSQL_HOST: "db" no seu arquivo docker compose por DB_MYSQL_HOST: "<ip_do_container_db>".

Agora, todos os containers devem estar na rede bridge padrão para que o NPM possa ver tanto o Discourse quanto seu banco de dados.

4. Tornar o Discourse acessível

Mas “ver” o Discourse e conseguir acessá-lo não é a mesma coisa. Então, você precisa garantir que o Discourse aceite qualquer tráfego que o NPM encaminhe para ele. Se você não se importa em usar o websocket, imagino que possa apenas apontar o NPM para a porta 80 (não 443) do IP do seu container do Discourse, assim:

Não testei isso, no entanto. Como mencionei, estou usando a configuração do websocket, que requer alguns passos adicionais. Note que o nome de host/IP e a porta acima serão ignorados quando você usar o websocket.

5. Configurar app.yml para usar websocket

Isso está explicado na OP, então não vou entrar nisso.

6. Montar o websocket no container do NPM

Precisamos dar ao NPM acesso ao websocket montando-o como um volume: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Esta é a última alteração no arquivo docker compose padrão do NPM, então aqui está a versão final que funciona para mim:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurar o NPM para usar o websocket

Último passo: dizer ao NPM para usar o websocket. Até onde me lembro, não foi suficiente apenas ativar o “Suporte a Websockets”, então copiei a localização do NGINX da OP para a aba “Avançado”, assim:

Não consegui fazer isso funcionar na aba “Locais personalizados”.

8. Não se esqueça de ativar o SSL

Não mencionei a configuração SSL no NPM porque parece bastante óbvia e não acho que importa em que ponto do processo você a ativa. Então, se você ainda não fez isso, é assim que a minha se parece:


9. Aviso final

Enquanto escrevia este post, de repente me ocorreu que o NPM e o Discourse provavelmente nem precisam estar na mesma rede Docker quando usamos o websocket. Não tenho tempo para verificar isso no momento, mas se isso for verdade, então você pode simplesmente esquecer os passos 2, 3 e 4 acima e deve funcionar.

Este é o aspecto mais fascinante dos fóruns de suporte: fazer um bom trabalho descrevendo seu problema frequentemente leva você à solução sem nem mesmo postar sua pergunta. E, neste caso, eu estava respondendo à pergunta de outra pessoa, mas também pode ter encontrado a resposta para a minha própria. :smiley:

4 curtidas

Muito obrigado pela resposta excelente e bem articulada! Vou tentar suas dicas o mais rápido possível. A propósito, o IP que deve ser colocado no NPM é o do servidor (ou seja, o IP externo para acessar o servidor) ou o interno do Docker (notei que o Docker usa 172… para os containers)?
Desculpe se minhas perguntas parecem triviais; não conheço bem questões de rede.

1 curtida

Recomendo que você use o WebSocket. Assim, pode colocar qualquer coisa como IP, pois ele não será utilizado. Caso contrário, trata-se do IP interno do contêiner, e não do IP público do host.

BTW: Parece que sua resposta por e-mail não foi renderizada corretamente. Talvez queira editar (encurtar) sua postagem acima?

2 curtidas

Sim, eu vi. Usei o “Responder” do e-mail e ele tentou incluir toda a mensagem original, mas não consigo encontrar uma maneira de modificá-la. É possível? Sou novo no Discourse, até como usuário… :pensive:

1 curtida

Você pode editar suas mensagens usando o ícone de lápis na parte inferior da sua mensagem. No entanto… os Níveis de Confiança 1 e inferiores têm apenas 24 horas (padrão), enquanto os Níveis de Confiança 2 e superiores têm 30 dias (padrão).

Parece que você está atualmente no Nível de Confiança 1 Básico, mas pode saber mais sobre o que precisa fazer para “subir de nível” em Níveis de Confiança. :+1:

2 curtidas

Desculpe se já se passou bastante tempo desde a última pergunta, mas perdi muito tempo tentando fazer o que você sugeriu, sem nenhum sucesso. Ao modificar o app.yml e reconstruir o app com suas alterações, ele começou a exibir nos logs: “config/unicorn_launcher: line 71: kill: (898) - No such process”. Não importa o que eu tente, não há como impedir esse comportamento. Também tentei reconstruir o app em seu estado original (com portas expostas, sem websocket) e parar o npm, mas sem chance alguma; o “unicorn” não está rodando.

Também segui tudo o que o Google encontrou sobre isso (parece ser um problema comum), mas de nenhuma forma consegui entender como reconstruir um container do Discourse funcionando. O problema agora é (um dos principais, estou quase desistindo do Discourse) que, por alguma razão obscura e confusa, o PostgreSQL interno está sempre “reiniciando”.

Não sei por que isso acontece. Simplesmente fiz suas alterações, reconstruí o app e, desde então, o “unicorn” :roll_eyes: está morto.

Existe alguma maneira de corrigir esse problema do PostgreSQL? Por que isso aconteceu? Há alguma chance (tenho medo que não!) de não perder todas as alterações que fiz no Discourse quando ele estava funcionando?

Aliás, é normal que toda pequena mudança ou tentativa de corrigir algo termine com outra coisa deixando de funcionar? :rage:

Não estou com raiva de você; a questão é o Discourse, não suas sugestões. Passei muito tempo tentando fazer esse fórum “aparentemente” legal funcionar, mas toda vez algo mais dá errado, e minha sensação de que o Discourse é pouco confiável só está ficando mais forte.

1 curtida

Se você tinha uma instalação padrão funcionando, deve ser possível restaurar as coisas para esse estado e fazer com que tudo continue funcionando.

O problema com o PostgreSQL pode estar relacionado à atualização do PostgreSQL 13?

Se você fez um backup antes de começar, pode instalar em um servidor novo e restaurar esse backup. Isso deve ser o pior cenário possível.

2 curtidas

Como posso saber se o problema do PostgreSQL está relacionado à atualização 13? Eu não escolhi atualizá-lo; simplesmente digitei “./launcher rebuild app”, e todas as… coisas aconteceram.
Sim, é a versão 13. Depois de horas lendo na internet sobre outras pessoas com o mesmo problema, descobri que isso poderia ser o problema, mas não encontrei uma maneira de trazer o Discourse de volta à vida.

1 curtida

Então esse não é o problema. Desculpe.

1 curtida

Sinto muito por ouvir que você está passando por esses problemas. Conheço a sensação frustrante de passar horas tentando consertar algo. Mas você também aprende algo a cada vez, mesmo que o caminho para a solução raramente seja uma linha reta…

Sinto muito, mas não sou a pessoa certa para ajudá-lo com isso. Não tenho experiência com postgres ou unicorns. Existem três maneiras pelas quais eu supero esses cenários de “nada funciona”: 1. fazer backup para que eu possa sempre voltar ao estado original. 2. tentar/mudar apenas uma coisa de cada vez e testar em uma máquina de não produção (ou em um fórum menos importante) primeiro. 3. investir ainda mais horas tentando entender as coisas.

A propósito: escrever descrições detalhadas de problemas/tickets de suporte mais de uma vez me ajudou a resolver o problema. Eu nem precisei enviar o ticket. Escrevê-lo me fez ver a solução.

Então, no seu caso, o que eu tentaria entender é: em que circunstâncias alterar o app.yml e depois alterá-lo de volta ao seu estado original pode levar a um resultado diferente do resultado original. Ao investigar isso, você ou percebe que não restaurou exatamente o original ou entende o mais que precisa “resetar” para que funcione.

5 curtidas

Sinto muito, mas não entendi: primeiro você me perguntou se o problema do PostgreSQL poderia estar relacionado à atualização para o PostgreSQL 13, e quando eu respondi “sim, é a versão 13” (juro que não sabia qual era a anterior, faz muito tempo que não recrio o app), você disse que não era esse o problema… então, por que o PostgreSQL fica sempre “iniciando” e o Discourse não avança?

1 curtida

Olá @Wanderer. Não consigo identificar qual pode ser o seu problema, então a atualização do PostgreSQL foi apenas um palpite. Tenho quase certeza de que, se você estiver executando o PostgreSQL 13, o problema não é que você esteja travado na atualização a partir da versão 10 ou 12. Portanto, embora possa haver algum problema com o PostgreSQL, provavelmente não está relacionado à atualização para o PostgreSQL 13.

Minha melhor recomendação para quem não é especialista nesses assuntos é fazer uma instalação limpa e restaurar seu backup mais recente.

Se você deseja obter ajuda mais específica para o seu problema e tem um orçamento, pode entrar em contato comigo ou postar em Marketplace.

Vou trabalhar para melhorar as instruções do Nginx Proxy Manager, mas meu palpite é que seu problema, embora tenha surgido ao tentar migrar para essas configurações complexas, provavelmente não é causado por falhas nessas instruções. (Não tenho certeza, mas esse é o meu melhor palpite.)

2 curtidas

Aqui está a minha versão disso. Quase desisti, mas @tophee linkou para uma postagem que eu (!?) escrevi e que forneceu a mágica necessária! Agora, esta é uma maneira direta de configurar o Nginx Proxy Manager para o Discourse. Acho que isso torna o processo semelhante ao descrito em Run other websites on the same machine as Discourse - #396.

Instale o Nginx Proxy Manager seguindo as instruções deles em

Remova os modelos de SSL e Let’s Encrypt:

Verifique se essas linhas no seu arquivo yml estão comentadas ou excluídas:

## Descomente estas duas linhas se desejar adicionar o Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Faça o Discourse usar a rede npm-default.

Se você seguir cegamente as instruções de instalação do Nginx Proxy Manager, ele criará uma rede Docker chamada npm_default.

Adicione este bloco aos seus arquivo(s) yml. Se você tiver contêineres web_only e data separados, precisará adicionar isso a cada um deles (eu não testei o contêiner mail-receiver). O docker_args não deve ser recuado.

docker_args: |
  --network npm_default

Não há necessidade de expor nenhuma porta

Comente ou remova estas linhas do seu arquivo yml:

# expose:
#  - "80:80"   # http
#  - "443:443" # https

Em seguida, você pode reconstruir seus contêineres e configurar o Nginx Proxy Manager assim:

image

Uma maneira simples (mas não necessariamente recomendada) de iniciar um segundo site do Discourse seria esta:

cd /var/discourse/containers
cp app.yml othersite.yml
# de alguma forma edite, no mínimo, o nome do host em othersite.yml
./launcher rebuild othersite

Em seguida, adicione-o ao NPM como descrito acima, usando othersite no lugar de app.

Testei isso com um app.yml mais dois contêineres do tipo web_only e um único contêiner data, além de um contêiner othersite-redis separado que é uma cópia do contêiner data contendo apenas os modelos do Redis. (Mas uma solução mais fácil seria colocar o Redis extra no contêiner web_only).

2 curtidas

Então, depois de algumas dificuldades, consegui fazer tudo funcionar.

Preciso começar dizendo: embora eu seja um desenvolvedor de “geração antiga” (nascido no início dos anos 80), sempre busquei as melhores e mais novas formas de desenvolver ou gerenciar. Por isso, detesto, em 2021, ter que escrever comandos estranhos repletos de opções cripticas, como no antigo CP/M ou DOS. Sempre procuro alguma interface que facilite e deixe minha vida mais clara.

Por exemplo, uso o Portainer para gerenciar containers. Ele permite iniciar, parar, editar e duplicar todos os containers sob demanda, sem precisar “vasculhar” o sistema de arquivos em busca de um arquivo em um milhão; por exemplo, para alterar a rede do container, basta escolher uma opção em uma lista e clicar, o mesmo vale para adicionar parâmetros ou volumes, como no exemplo que @tophee escreveu. Por esse motivo, tentei usar o NPM, pois prefiro “conter” meu proxy Nginx e, aparentemente, com apenas alguns cliques — entendendo bem o que estou fazendo, mas sem precisar memorizar um novo conjunto de comandos e opções estranhas.

Voltando ao meu container do Discourse, precisei executá-lo novamente com o “discourse-setup”; tudo correu bem, o “malvado” Postgres foi instalado na versão 13, sem nenhum “unicórnio bêbado” (desculpe, mas imaginar um “unicórnio” rodando no meu servidor me faz rir! :laughing:), enfim, tudo funcionou como deveria. Em seguida, fiz as modificações para que o Discourse funcionasse com WebSocket: tudo certo também dessa vez. Felizmente, a configuração anterior do Discourse fez backups automáticos, então com apenas alguns cliques restaurei tudo (quanto mais uso o Discourse, mais o amo!).

Precisei testar várias vezes as configurações do NPM; no início, tive alguns problemas com certificados, mas no final até ele funcionou perfeitamente.

Adicionei um segundo proxy apontando para meu container do WordPress (sim, estou “contendo” tudo; gosto da ideia de um servidor mais limpo, com todos os principais pacotes contidos em um local gerenciado), e ele também funcionou bem.

Portanto, no final, tenho meu servidor (um VPS) com seu servidor de e-mail (também tentei “contê-lo”, mas após semanas de luta árdua, desisti), o Discourse apontando para ele, o WordPress rodando em outro container e o NPM gerenciando ambos: tudo no meu servidor, sem depender de outros (e muito, muito mais caros) serviços para implantação, envio de e-mails, etc.

Próximo passo: importar algumas centenas de milhares de posts do “antigo e bom Phpbb”. Preparem-se para mais posts da minha parte! :grinning_face_with_smiling_eyes:

Um grande agradecimento a @tophee e @pfaffman pela ajuda. Consigo entender o quão difícil pode ser ajudar pessoas quando elas trabalham de maneira não padrão, como eu.

3 curtidas

Fico feliz que você tenha conseguido fazer funcionar com Websocket. Para qualquer outra pessoa com dificuldades nisso, siga as instruções do @pfaffman para fazer isso sem websocket acima.

Não sei o que causou o seu problema, mas me parece que isso pode ser um ponto a ser esclarecido para quem é relativamente novo na administração do Discourse: você precisa entender como o certificado do Let’s Encrypt funciona na instalação padrão (sem nenhum proxy externo) versus como ele funciona com o NPM (e se você se pergunta por que é chamado de proxy externo, precisa descobrir isso também).

Como configurei meu proxy externo manualmente e também configurei o Let’s Encrypt manualmente, eu tinha uma compreensão de toda a “mágica” que o Discourse e o NPM fazem para que o HTTPS funcione automaticamente. Por isso, consegui evitar várias armadilhas ao mudar de certificados gerenciados pelo Discourse para certificados gerenciados pelo NPM.

Não vejo muito por que você gostaria de colocar o servidor de e-mail atrás do NPM…

1 curtida

Não, Christoph, não atrás do NPM, apenas em um contêiner. Tentei o Zimbra, mas foi uma grande bagunça. Depois, um Postfix simples “em contêiner”, mas sem sucesso também. Eu estava no início da minha experiência com Linux (ainda sou iniciante, mas estou ficando cada vez mais confiante, pelo menos em relação a alguns conceitos de administração), então desisti e tentei diretamente no servidor. Ele inicia sem grandes problemas, então prossegui dessa maneira, mesmo tendo sido bastante difícil configurar o Discourse para usar meu servidor de e-mail. Mas agora, tudo parece estar funcionando.

2 curtidas

Parece bom com a instalação até que eu fique preso com o npm para me comunicar com o host do discourse; você menciona para colocar o IP do contêiner de dados dentro do host mySQL do arquivo compose do npm

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

mas quando eu mudo o (DB_MYSQL_HOST) para o contêiner de dados, ele me mostra conexão recusada.

connect ECONNREFUSED 172.17.0.2:3306 <-- erro quando o npm na rede discours (network_mode: bridge).
getaddrinfo ENOTFOUND db <-- erro quando o mySQL no arquivo compose do npm é definido como "db".

alguma sugestão para que a etapa 3 funcione para mim?

1 curtida