Problema ao atualizar o Discourse

Olá,

Estou atualizando o Discourse da versão v2.3.0.beta8 +212 para a 2.4.0.beta1.

Primeiro, atualizei o gerenciador Docker pela interface web. Em seguida, a interface web informou que eu precisava realizar a atualização via linha de comando, o que fiz.

Tenho enfrentado erros repetidos durante a atualização. Executo:

cd /var/discourse
./launcher rebuild app

O processo roda por alguns minutos e depois falha na atualização do banco de dados. Reiniciei meu servidor, o que trouxe o Discourse de volta (mas sem a atualização) e tentei novamente. O mesmo erro ocorreu.

Alguma sugestão de como proceder?

Abaixo está o último conjunto de linhas exibido quando executo o rebuild:

Optimizing site icons...
I, [2019-07-09T01:22:18.589503 #13]  INFO -- : Terminating async processes
I, [2019-07-09T01:22:18.589624 #13]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/10/bin/postmaster -D /etc/postgresql/10/main pid: 67
I, [2019-07-09T01:22:18.589816 #13]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 183
2019-07-09 01:22:18.589 UTC [67] LOG:  received fast shutdown request
183:signal-handler (1562635338) Received SIGTERM scheduling shutdown...
2019-07-09 01:22:18.593 UTC [67] LOG:  aborting any active transactions
2019-07-09 01:22:18.599 UTC [67] LOG:  worker process: logical replication launcher (PID 76) exited with exit code 1
2019-07-09 01:22:18.599 UTC [71] LOG:  shutting down
2019-07-09 01:22:18.629 UTC [67] LOG:  database system is shut down
183:M 09 Jul 2019 01:22:18.645 # User requested shutdown...
183:M 09 Jul 2019 01:22:18.645 * Saving the final RDB snapshot before exiting.
183:M 09 Jul 2019 01:22:18.672 * DB saved on disk
183:M 09 Jul 2019 01:22:18.672 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 366 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'"]}
cbaaf74d12f5c22faf7f054d391f3570b5e7d8dd3b8bce421c57ef17c4b43c55
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one

Edição: Os únicos erros no log completo são estes:

I, [2019-07-09T01:21:35.162142 #13]  INFO -- : > su postgres -c 'createdb discourse' || true
2019-07-09 01:21:35.330 UTC [80] postgres@postgres ERROR:  database "discourse" already exists
2019-07-09 01:21:35.330 UTC [80] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: database creation failed: ERROR:  database "discourse" already exists
I, [2019-07-09T01:21:35.332706 #13]  INFO -- :
I, [2019-07-09T01:21:35.333101 #13]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2019-07-09 01:21:35.444 UTC [91] postgres@discourse ERROR:  role "discourse" already exists
2019-07-09 01:21:35.444 UTC [91] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Notei que ele encerra acima após “Optimizing Site Icons…” — talvez haja um problema aqui?

Você pode tentar pesquisar por “error role discourse already exists”

pesquisei por esse termo, não encontrei nada que ajudasse

  • alguns posts mencionavam plugins, desativei os plugins no app.yml
  • recebi uma mensagem sobre uma versão desatualizada do docker e atualizei
  • executei o discourse doctor

os mesmos erros persistem.

Em anexo está a saída do comando de reconstrução.

Alguma sugestão sobre qual caminho seguir?

rebuild script.txt (140,9 KB)

Vale a pena notar que tenho uma raiz de URL relativa no meu app.xml. Isso poderia estar atrapalhando a atualização?

env:
  DISCOURSE_RELATIVE_URL_ROOT: /epicenter/support

run:
  - exec: echo "Início dos comandos personalizados"

  - exec:
        cd: $home
        cmd:
          - mkdir -p public/epicenter/support
          - cd public/epicenter/support && ln -s ../../uploads && ln -s ../../backups
          - rm public/uploads
          - rm public/backups
  - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /epicenter/support/$1 break;
          proxy_pass http://discourse;
  - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /epicenter/support {
             rewrite ^/epicenter/support/?(.*)$ /$1;
          }
  - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_fastly_client_ip
         global: true

Finalmente consegui fazer isso funcionar na minha terceira ou quarta sessão de trabalho. O problema parecia ser a falta de imagens na pasta “uploads”. A solução foi fazer uma nova instalação, usar o mesmo arquivo “app.yml” e restaurar a partir do backup com arquivos fictícios para as imagens ausentes.

Em paralelo ao problema original, notei que, após uma atualização anterior, vários ícones e imagens desapareceram. Quando tentei reconstruir, os logs mostraram que o processo parava após “otimizar as imagens do site”. Acho que deve ter travado em uma imagem não encontrada e encerrado sem registrar esse erro específico. (não havia nenhuma indicação de que imagens ausentes eram o problema ou quais arquivos de imagem estavam faltando).

No final, fiz uma nova instalação do Discourse com a versão mais recente. Restaurei a partir do backup seguindo as instruções aqui. Levei três tentativas.

Primeiro, o script de backup apresentou erro ao procurar por arquivos carregados, então copiei a pasta uploads/default dos meus arquivos de backup anteriores.

Executei o script de restauração novamente. Desta vez, ele retornou um erro dizendo que não conseguiu encontrar um arquivo de imagem específico. Criei um arquivo de imagem falso, dei o mesmo nome e o coloquei no local especificado.

Executei o script de restauração pela terceira vez. E voilà! Meu site foi restaurado a partir do backup e está na versão mais recente.