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:
- launcher-rebuild-app-output-0.txt - Linhas 88-95
- launcher-rebuild-app-output-1.txt - Linhas 100-107
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:
- discourse-doctor-output-0.txt - não foi possível encontrar o container ‘app’ em execução; tentou reconstruir, mas falhou ao reiniciar o container
- discourse-doctor-output-1.txt - ‘app’ iniciado manualmente com
sudo usr/bin/docker start appantes de executardiscourse-doctor
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








