Problema no Postgres... de novo!

Olá, tenho dois grandes problemas ao parar e reiniciar o Discourse.

Primeiro
Depois de 2 ou 3 vezes que faço isso (não importa se com ./launcher stop ou via Portainer stop), o container se recusa a iniciar novamente, ficando continuamente travado em “rm: cannot remove ‘/shared/nginx.http.sock’: Is a directory” (Acabei de notar que o socket não está no diretório “shared”, mas em “shared/standalone”, será apenas um erro na mensagem?).
Por alguma razão ainda desconhecida para mim, esse socket, talvez após o stop, torna-se um diretório, e o template não consegue excluí-lo porque não consegue excluir um diretório, mas um socket. Excluí-lo manualmente não muda nada, ele reaparece toda vez.

Segundo
“./launcher rebuild app” trava em “FATAL: the database system is starting up”, após o primeiro “PANIC could not locate a valid checkpoint record”. Li e tentei tudo que encontrei sobre esse problema, e a única “solução” que funcionou que encontrei foi excluir o diretório discourse com tudo dentro e configurar tudo novamente… obviamente não é uma solução real!

Parece que, às vezes, parar o container do Discourse deixa o banco de dados em um estado ruim, e ele não consegue continuar porque “está iniciando”, talvez tentando corrigir algo. Mas ainda não descobri como corrigir esse problema, que parece surgir após alguns stop&start.

Alguma dica? Alguma maneira de deixar o Postgres corrigir seus problemas?

Não, não é um erro. Esse arquivo está no volume que é montado no contêiner, portanto os caminhos são diferentes dependendo do ponto de vista, ou seja, dentro do contêiner versus fora do contêiner.

Isso ocorre quando o contêiner não é interrompido corretamente. O PostgreSQL precisa de algum tempo para desligar adequadamente, e nós fazemos isso quando você para o serviço usando nosso comando do launcher. No entanto, se sua instância for grande o suficiente ou se houver muitas transações em execução, o banco de dados pode ter dificuldade para parar dentro do prazo que recebe.

Mas eu encontrei este “nginx.http.sock” criado em “shared/standalone” no sistema de arquivos do host também. Inicialmente rosa, como um socket, mas depois de um tempo, talvez após uma parada, ele fica azul, como um diretório, e o contêiner se recusa a iniciar, travado tentando deletar um socket… que se tornou um diretório.

Então, o que podemos fazer para corrigir isso? Até agora, estou apenas experimentando, mas se eu colocar no ar com algumas centenas de pessoas conectadas e centenas de milhares de posts, corro o risco de perder tudo apenas porque o Postgres não lida bem com interrupções abruptas? Haverá algo a ser feito para corrigir um banco de dados corrompido. O Discourse pode rodar em um PostgreSQL externo, algo que possamos gerenciar caso o contêiner do Discourse não inicie? Em resumo, em caso de “PANIC” ou “FATAL”, deve haver alguma correção…

Na verdade, estou tentando resolver o problema (para o futuro) configurando um Postgres “containerizado” e conectando-o ao Discourse, na esperança de não danificar o banco de dados (ou, pelo menos, conseguir realizar alguma manutenção mesmo com o Discourse desligado) ao parar o Discourse.