Atualização do Discourse via Web UI Falha e Atualização SSH Derruba Instância do Discourse

NOTA: Post original atualizado em 25/11/21 21:00 EST com novas informações

Fui notificado sobre atualizações críticas de segurança na minha instalação do Discourse e tentei atualizar minha instalação usando a Interface Web (/admin/upgrade), como fiz no passado. Havia dois softwares que precisavam ser atualizados — Docker Manager e Discourse.

O Docker Manager teve que ser atualizado primeiro (o botão de atualização do Discourse estava desabilitado). Iniciei a atualização do Docker Manager usando a Interface Web e ela foi concluída com sucesso. Em seguida, iniciei a atualização do Discourse, mas ela falhou no meio do processo. Ao atualizar a Interface Web, vi a seguinte mensagem:

Seguindo as instruções na tela, acessei o servidor via SSH, executei um git pull e, em seguida, executei sudo ./launcher rebuild app na linha de comando. O processo terminou, mas falhou com uma mensagem de erro FAILED TO BOOTSTRAP.

Aqui está a saída de duas execuções de sudo ./launcher rebuild app em momentos diferentes:

Os números das linhas após cada arquivo indicam onde aparecem os únicos ERROS. Ambos parecem estar relacionados a banco de dados e roles (a diferença entre ambos os intervalos ocorre porque o segundo tentou um git pull do repositório discourse/base).

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Isso parece coincidir com a mensagem de erro FAILED exibida na parte inferior de cada tentativa de Reconstrução do Launcher.

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 436 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
13bbdd52e0835ba9dfddc5c367d63b6087a16553c3a77d27ca307734d6e16907
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

Nota: Estes ERROS não são o problema raiz. Veja “Solução” abaixo.

Algumas pessoas abaixo disseram que há um problema com o redis que está impedindo uma reconstrução bem-sucedida.

Executei sudo ./discourse-doctor em vários momentos do dia. Aqui está a saída de duas das execuções:

Verifiquei que minha instalação do Docker estava funcionando corretamente executando sudo docker run -it --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

Executei sudo ./launcher cleanup para garantir que tinha espaço em disco suficiente.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
<DETAILS REMOVED>

Total reclaimed space: 3.836GB

$ df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     ext4   30G  9.1G   20G  32% /

E até verifiquei minhas configurações de memória.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        304M        633M         20M        1.0G        1.5G
Swap:          2.0G          0B        2.0G

Uma reinicialização do servidor não resolveu o problema, mas notei algo interessante após reiniciar o servidor.

O container app do Docker está em execução após uma reinicialização.

$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS          PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   "\"/sbin/boot\""   7 weeks ago   Up 25 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Mas quando acesso o site, recebo um erro “502 Bad Gateway”.

Quando paro o container app e acesso o site, recebo um erro “Unable To Connect” (o que parece certo, já que o container não está em execução).

Mas isso me intriga, pois não tenho o Nginx instalado neste servidor.

Posso ver na saída da Reconstrução onde o processo está copiando arquivos do Nginx de um local para outro, mas não consigo encontrar os diretórios ou arquivos correspondentes, especificamente nginx.conf no meu servidor em lugar nenhum. Ubuntu, Docker e Discourse não são minhas principais habilidades, mas presumo que esses arquivos estão sendo copiados “dentro” do container app do Docker.

Agradeço antecipadamente por qualquer ajuda ou direção adicional com este problema, que parece surgir de tempos em tempos durante as atualizações do Discourse.

ATUALIZAÇÃO: Acontece que minha suposição sobre o container app do Docker ter seu próprio sistema de arquivos interno está correta. Você pode criar um snapshot do sistema de arquivos do container e explorar este sistema de arquivos usando bash.

# create image (snapshot) from container filesystem
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash

No sistema de arquivos do app, há um diretório nginx que contém um arquivo de configuração do Discourse.

root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct  3 21:33 discourse.conf

Que tal reiniciar? A partir daqui

Esta atualização requer que o Docker seja reiniciado.

Portanto, sim, seu Discourse ficará offline enquanto você executa ‘./launcher rebuild app’ na linha de comando.

Tudo ficará 100% após a conclusão da reconstrução.

@IAmGav O Docker parece estar em execução.

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

Tentarei alguns dos outros comandos do launcher para ver se consigo colocar as coisas em funcionamento.

@IAmGav Ran ./discourse-doctor e também confirmou que o contêiner Docker está em execução.

==================== DOCKER INFO ====================
DOCKER VERSION: Docker version 20.10.11, build dea9396

DOCKER PROCESSES (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS             PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   “/sbin/boot”   7 weeks ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


Discourse container app is running


@rmccown Tentei start e restart sem sucesso.

Ainda recebo isso no URL.

Executar sudo ./launcher rebuild app novamente falha com estas mensagens (atualmente estou procurando no arquivo por mensagens de erro anteriores).

Quando tudo mais falhar - você já tentou desconectar e reconectar? :wink:

Reinicie a instância: reboot now

Atualize a instância para a mais recente: apt-get update e apt-get dist-upgrade

Em seguida, execute a atualização do Discourse.

1 curtida

@omarfilip Essa foi a primeira coisa que tentei :wink:

Acabei de tentar reiniciar novamente (sem componentes do Ubuntu 18.04.6 para atualizar da atualização anterior).

Mesmos resultados - erro 502 Bad Gateway no URL.

Mas obrigado pela sugestão.

1 curtida

Também acabei de encontrar isto de novembro de 2020 - Upgrade ends with FAILED TO BOOTSTRAP.

Mas tenho de admitir que não sei exatamente o que significa “seguir o nosso canal de lançamento padrão”. Assumo que atualizar através da UI Web é o “canal de lançamento padrão”.

Isso seria “tests-passed”. Se você não modificou esta linha no seu arquivo app.yaml, então você está no canal de lançamento padrão:

  ## Qual revisão do Git este contêiner deve usar? (padrão: tests-passed)
  #version: tests-passed

você pode compartilhar o log inteiro, isso não é suficiente para ver o erro real.

Estou usando o canal de lançamento padrão.

E o meu valor de db_shared_buffers não é 0MB (encontrei esse problema aqui).

@IAmGav Aqui está um gist que contém a saída de ./launcher rebuild app - link

A única indicação de ERRO está no seguinte grupo de linhas (veja abaixo).

Eles parecem estar relacionados à criação de banco de dados e de roles. Existe alguma maneira de contornar essas ações? (o que eu acho que você gostaria de fazer durante uma atualização, já que está trabalhando com uma instância pré-existente)

Linhas 88-95

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Literalmente a mesma coisa aconteceu comigo há um tempo, uma atualização falhou no meio de uma atualização da interface web; até as mensagens de erro após uma tentativa de reconstrução são praticamente as mesmas e ainda não foram resolvidas; a única diferença é que eu conseguia atualizar pela interface web por um tempo, exceto que há um ou dois dias, depois de não atualizar por duas semanas ou mais, agora aparece o aviso “Você está executando uma versão antiga da imagem do Discourse”, e agora não consigo mais atualizar. :upside_down_face:

Aparentemente é um problema com o redis.

Todos - Atualizei minha postagem original com informações coletadas ao longo do dia. Obrigado a todos que postaram até agora.

Não. Há outro erro. Tente remover esse plugin.

Gem::ConflictError: Incapaz de ativar omniauth-vkontakte-1.7.0, porque omniauth-oauth2-1.7.2 entra em conflito com omniauth-oauth2 (>= 1.5, <= 1.7.1)

3 curtidas

Seguindo o conselho de Michael na postagem acima, comentei um plug-in no arquivo app.yml que era de uma tentativa inicial de autenticação SSO usando o plug-in VK (nunca seguimos com essa implementação, mas obviamente esquecemos de remover o plug-in do arquivo app.yml).

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
##          - git clone https://github.com/discourse/discourse-vk-auth.git

Após comentar a linha acima, executei sudo ./launcher rebuild app novamente. Após a reconstrução, o site do fórum parece estar no ar e funcionando (testando agora).

Obrigado novamente a todos que dedicaram tempo para revisar minhas postagens e comentar. Sua ajuda foi muito apreciada (que melhor maneira de passar o feriado de Ação de Graças aqui nos EUA :wink:).

Fiquem seguros.

4 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.