Executar “./launcher rebuild app” falha em db:migrate. Note que estamos usando PostgreSQL v12.
Isso destruiu nosso fórum. O contêiner docker voltou a funcionar, mas o fórum não. Felizmente, fiz um snapshot da VM antes de atualizar, estou restaurando agora.
Log:
Tasks: TOP => db:migrate
(Ver trace completo executando a tarefa com --trace)
I, [2022-04-14T15:20:51.896917 #1] INFO -- : == 20220304162250 EnableUnaccentExtension: migrando =========
-- enable_extension("unaccent")
I, [2022-04-14T15:20:51.897218 #1] INFO -- : Terminando processos assíncronos
I, [2022-04-14T15:20:51.897265 #1] INFO -- : Enviando INT para HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 1710
I, [2022-04-14T15:20:51.897396 #1] INFO -- : Enviando TERM para exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 1827
2022-04-14 15:20:51.897 UTC [1710] LOG: solicitação de desligamento rápido recebida
1827:signal-handler (1649949651) SIGTERM recebido agendando desligamento...
2022-04-14 15:20:51.900 UTC [1710] LOG: abortando quaisquer transações ativas
2022-04-14 15:20:51.902 UTC [1710] LOG: worker em segundo plano "logical replication launcher" (PID 1719) saiu com código de saída 1
2022-04-14 15:20:51.904 UTC [1714] LOG: desligando
1827:M 14 Apr 2022 15:20:51.913 # Desligamento solicitado pelo usuário...
1827:M 14 Apr 2022 15:20:51.914 * Salvando o snapshot RDB final antes de sair.
2022-04-14 15:20:51.965 UTC [1710] LOG: sistema de banco de dados foi desligado
1827:M 14 Apr 2022 15:20:53.157 * DB salvo em disco
1827:M 14 Apr 2022 15:20:53.157 # Redis está pronto para sair, tchau tchau...
FALHOU
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 2118 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec falhou com os parâmetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap falhou com código de saída 1
** FALHA AO INICIALIZAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
2dcd9aeca614c9e06ef748f673eb68203db6eae5c445253b416d666663879d6d
==================== FIM DO LOG DE RECONSTRUÇÃO ====================
Falha ao reconstruir o aplicativo.
Eles não são separados e não há PG externo. A atualização PG13 também falha (de forma não destrutiva, ao contrário da atualização de hoje) e, para ser honesto, não recebi suporte sobre como corrigi-la aqui.
Acredito (não consigo verificar, obviamente) que tínhamos apenas um contêiner aparecendo no docker ps. A instalação padrão agora tem 2 contêineres?
Esta extensão tornou-se disponível como uma extensão “confiável” no PostgreSQL 13+, onde pode ser habilitada por qualquer usuário.
Como você está executando uma versão mais antiga do PostgreSQL, terá que contornar isso, instalando e habilitando esta extensão para o usuário Discourse e, potencialmente, tentando enganar o Discourse para que considere esta extensão como já instalada. Ou então, migrar para a versão atual suportada do PostgreSQL.
OK. Resumindo, vocês não estão mais oferecendo suporte ao PG12. Sugiro postar isso no tópico de upgrade do PG13 em algum lugar, e provavelmente nos anúncios do 2.9.0b4 também.
Se você está preocupado com o tempo de inatividade, uma solução seria replicar o servidor para o novo host. Algo como community/archived/setting-up-postgres-hot-standby.md at master · GoogleCloudPlatform/community · GitHub. (Você pode encontrar instruções mais recentes ou que façam mais sentido para você…). Isso permitiria migrar para o novo banco de dados enquanto o antigo continuava a funcionar. Mas isso está longe de ser simples.
Essa é uma ótima ideia, se fosse mysql, ms-sql ou oracle eu faria isso, mas dada a minha falta de experiência com postgres eu provavelmente apenas aceitaria o tempo de inatividade.
Minha restauração finalmente terminou, depois de mais de 4 horas. E o Discourse estava disparando erros 502. Este snapshot foi tirado antes da atualização, então isso é super bizarro.
De qualquer forma, olhando os logs do nginx, encontrei este erro
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require': cannot load such file -- /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb (LoadError)
Com certeza, este arquivo pertencia a root:root e tinha permissões 0000. Mudá-lo para discourse:root e 644 para corresponder aos outros arquivos naquele diretório nos fez voltar a funcionar. Ufa!
Alguma ideia de como esse arquivo foi apagado/alterado? Ele também tem 0 bytes, muito estranho.
root@forum-app:/shared/log/rails# ls -la /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
-rw-r--r-- 1 discourse root 0 Feb 10 17:41 /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
Tentei fazer o “Restaurar para uma Instalação Limpa”, mas não funciona, o PG não coopera. Tentei fazer o downgrade da versão do discourse e voltar para o PG12, mas então se torna um carnaval de luz com todos os plugins.
Sim, eu alterei o template, como parte da estratégia “ok, isso não está funcionando” para que eu pudesse voltar para o PG12 (embora isso me faça questionar como vou atualizar o PG então ).
Eu tentei commits mais recentes, mas o erro enable_extension("unaccent") ainda está presente, o que implica que nesses commits a mudança para depender dele já foi feita.
Aguardando o resultado desta tentativa.
Atualização: Não, falhou na restauração durante a fase de “descompactação do dump” e agora está morto novamente.
Olá, Se você tiver um backup do Discourse, sugiro que faça isso em um servidor diferente para tentar primeiro.
Acredito que você encontrou esse problema ao atualizar uma instância do Discourse que estava executando uma versão mais antiga.
Portanto, tente instalar uma cópia do Discourse editando manualmente o yml para usar o Discourse “stable” e fixar a versão do postgres para 12.
Se a compilação for bem-sucedida, tente restaurar o backup. Esperançosamente, ele será restaurado com sucesso.
Se for bem-sucedido, alterne o template do postgres 12 de volta para o template padrão do postgres e comente a tag “stable” para que o Discourse seja reconstruído com os testes mais recentes aprovados.
Acredito que, se o backup for recuperável, ele deverá então sobreviver às atualizações do postgres e do Discourse.
Estou praticamente em "limbo" agora. Tentei sua sugestão com PG12 e "Stable". Não funciona, a restauração simplesmente para. Então, estou formatando a máquina mais uma vez para tentar novamente do zero, porque agora ela não faz a reconstrução do aplicativo.
Enquanto essa máquina tenta "voltar para PG12", estou tentando ver se consigo avançar na outra: Se eu tentar atualizar o PG com uma instalação limpa, ele falha após Criando funções ausentes no esquema discourse_functions... (começa a retornar 500) e tail -f shared/data/log/var-log/postgres/current mostra que o contêiner de dados está "se movendo", embora esteja cheio de "erros" como este:
discourse@discourse ERRO: relação \"user_auth_tokens\" não existe em caractere 34
discourse@discourse DECLARAÇÃO: SELECT \"user_auth_tokens\".* FROM \"user_auth_tokens\" WHERE ((auth_token = 'XXXX=' OR
prev_auth_token = 'XXXX=') AND rotated_at > '2022-03-09 10:21:44.051357') LIMIT 1
discourse@discourse ERRO: relação \"application_requests\" não existe em caractere 41
discourse@discourse DECLARAÇÃO: SELECT \"application_requests\".\"id\" FROM \"application_requests\" WHERE \"application_requests\".\"date\" = '2022-05-08' AND \"application_requests\".\"req_type\" = 0 LIMIT 1
No entanto, o Discourse pode estar inativo, mas a máquina está sendo usada, então… ela está funcionando, mas leva horas e horas? Porque eu a deixei rodando por mais de 1 hora e nada mudou.
Neste ponto, já estou pensando se isso não deveria ir aqui, lol.
PD: Tentei 2 backups diferentes, já que fiz 2 antes da aventura.
Isso não é bom - você não conseguiu restaurar seu backup da versão antiga do Discourse com PG12 para uma nova com PG13? Você pode postar as mensagens de erro, etc.? Todos aqui me asseguraram repetidamente que isso funcionaria.