O aplicativo ficaria fora do contêiner Docker do Discourse, mas no mesmo servidor. Nesse caso, alguém poderia compartilhar alguns detalhes sobre como fazer isso ou indicar um guia ou instruções, por favor?
Haveria também alguma desvantagem em fazer isso em vez de usar o plugin/API DE?
Não é um requisito, mas estou bem com isso como uma desvantagem
Comecei a usar seu plugin DE, mas infelizmente acho que meu caso de uso exigirá uma conexão direta, pois estou enviando muitas solicitações através da API para algumas das minhas páginas (e isso é apenas com o meu acesso ao site). São principalmente consultas personalizadas, então não tenho certeza se isso está tendo algum impacto. Ainda assim, adoro o plugin DE!
Você saberia me dizer qual é a melhor maneira de conectar diretamente ao banco de dados Postgres fora do container? Tanto o fórum quanto o site estão no mesmo servidor, caso isso ajude.
Edição: Acho que estou atingindo um limite de taxa com o plugin DE, mas tenho certeza de que vi o Sam dizendo que, se as solicitações estiverem vindo do mesmo servidor, nenhum limite de taxa se aplica — isso ainda é válido?
Embora seja possível, o outro aplicativo pode adquirir bloqueios nas tabelas e impedir que o Discourse funcione normalmente.
Ou opte por um novo plugin que adicione os endpoints de API necessários que você precisa, ou mergulhe de vez criando outra instância do PostgreSQL que replique seu Discourse e onde você possa integrar seu aplicativo.
Obrigado pela informação, Rafael. Vou usar apenas instruções SELECT e, pelo que sei, elas não causam bloqueios. Assim, só precisaria me preocupar com alterações nas tabelas do lado do Discourse (ou seja, durante atualizações) e com a possibilidade de desativar temporariamente o outro aplicativo. Isso ajudaria a resolver as preocupações com bloqueios?
Quanto à replicação do banco de dados, parece uma opção interessante. É possível fazê-la em tempo real, de modo que os dados estejam desatualizados por apenas alguns minutos? (Preciso buscar os tópicos mais recentes com frequência — quase todas as páginas do site os exibem. Embora eu faça cache por dois minutos, eles variam conforme a página e os critérios, e haverá centenas desses tipos de páginas). Além disso, essa opção pode deixar de ser viável conforme o banco de dados cresce? (Em outro fórum Discourse, meu banco de dados já tem alguns gigabytes.)
(Não acho que criar um plugin seja uma opção aqui, pois não vejo como seria melhor do que o plugin Data Explorer. Na verdade, o plugin DE é quase perfeito — exceto por essa questão.)
Reconstruí o container. Dentro do container, defini uma senha para o usuário postgres e consegui conectar com o seguinte comando de dentro do container:
psql -h localhost -d discourse -U postgres
No entanto, quando saio do container e tento conectar, recebo:
# psql -h 127.0.0.2 -p 5432 -d discourse -U postgres
psql: server closed the connection unexpectedly
Isso provavelmente significa que o servidor terminou de forma anormal
antes ou durante o processamento da solicitação.
Também tentei alterar a porta para outra, mas recebo o mesmo erro. Obtive o IP 127 do docker ps e inspecionando as Configurações de Rede (tenho três instâncias independentes do Discourse em execução).
Se eu alterar o IP (para o de um dos outros fóruns Discourse), recebo uma resposta/mensagem diferente (mais imediata), então o acima parece estar parcialmente correto:
# psql -h 127.0.0.3 -p 5432 -d discourse -U postgres
psql: could not connect to server: Connection refused
O servidor está rodando no host "127.0.0.3" e aceitando
conexões TCP/IP na porta 5432?
Alguma ideia do que estou fazendo de errado? Pesquisar no Google por psql: server closed the connection unexpectedly parece sugerir um problema de rede — então preciso alterar algo mais dentro do container?
O jeito que consegui fazer isso funcionar (de fora do container) foi usando um túnel SSH. Na verdade, criei um novo usuário em vez de usar o postgres e configurei portas personalizadas para SSH e postgres, mas isso deve funcionar para sua configuração:
O EXTERNAL_VPS_IP é o endereço IP que você usa para se conectar ao seu servidor remoto.
Se ainda não funcionar, talvez valha a pena tentar alterar o IP exposto no app.yml para usar o IP da docker bridge em vez do IP interno do container que você obteve com docker ps. Não tenho certeza se isso é necessário, mas é assim que configurei:
expose:
- "127.0.0.1:5432:5432"
# ou se você usa uma porta personalizada: - "127.0.0.1:PORTA_CUSTOMIZADA:5432"
Lembre-se de reconstruir o container depois.
Me avise como ficou. Demorei MUITO para fazer tudo funcionar (e, em retrospecto, foi tão simples), então estou feliz em ajudar.
Parece que o conselho no seu (e no outro) thread estava correto: você precisa de:
expose:
- "127.17.0.1:5432:5432"
…como mencionado naquele link, o Docker encaminhará automaticamente para o IP correto do seu container (o que faz sentido, já que esses IPs são dinâmicos — algo que eu já tinha me perguntado). Acho que isso é tudo o que é necessário para a maioria das configurações.
Já tinha tentado isso antes, então você pode estar se perguntando qual era o meu problema. O meu firewall! (Pensei que reconhecesse o erro psql: server closed the connection unexpectedly!)