Última rebuild quebrada

Tenho um sistema de longa duração, nunca tive problemas antes. Sempre faço a atualização com uma reconstrução completa, nunca usando a atualização integrada.

Recentemente, fiz um apt-get upgrade, atualizei o Docker para a versão 19.03.5 e tentei uma reconstrução, mas agora está quebrado. O sistema é Ubuntu 16.04.6.

Aqui está meu trecho de reconstrução:

cd /var/discourse || exit
sudo git pull
sudo docker stop maphub_forum
sudo docker rm maphub_forum
sudo ./launcher rebuild maphub_forum

Aqui está o log completo:
diag.txt (518,9 KB)

Eu fiz o downgrade para o Docker 18.09.9 e o problema persiste.

@j.jaffeux Discourse.redis deve ser portado para trás para stable e beta? Acredito que isso seria mais fácil do que adicionar código para compatibilidade retroativa em vários plugins.

Sim, eu esperava que não causasse muitos problemas, mas sim, provavelmente causará. São vários commits, no entanto.

Fiz o backport para a beta e para a estável. Avise-me se encontrar algum problema.

@j.jaffeux Agora não consigo atualizar pelo painel de controle:

/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:23:in `upgrade_version'
/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:27:in `upgrading?'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:42:in `block in repos'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `map!'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `repos'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `block in instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:136:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.1/lib/action_view/rendering.rb:39:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:191:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:252:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:18:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.4.1/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiler.rb:296:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

Obrigado, funciona perfeitamente agora!

Esse problema está relacionado à nova atualização?

Você precisa reconstruir o contêiner.

cd /var/discourse
git pull
./launcher rebuild app

Tenho quase certeza de que as alterações mais recentes quebram o docker_manager, pois ele é atualizado antes do Discourse e, portanto, não encontra Discourse.redis.

Mas git pull; ./launcher rebuild app resolve o problema, certo?

Eu tenho um conjunto de clientes para os quais faço atualizações quando uma nova imagem de contêiner é lançada. Geralmente, realizo essas atualizações pouco depois de (1) ser necessário um novo contêiner e (2) ser lançada uma nova versão beta.

Sei que sua capacidade de prever o futuro de forma confiável é um pouco limitada, mas você antecipa que haverá um novo lançamento beta em breve?

Esperamos ter um lançamento beta hoje ou no início da próxima semana.

Quebrou novamente. Log completo após git pull + rebuild:

discourse.txt (24,4 KB)

A branch “stable” está atualmente quebrada.

Resumo curto: o tests-passed funcionou, tive 1 dia de indisponibilidade.

Versão mais detalhada: Acredito que este seja um dos softwares de código aberto de maior qualidade escritos na internet hoje, com um modelo de negócios sólido e uma equipe excelente. Como é que o mecanismo de atualização está tão quebrado?

  1. O recurso de atualização no aplicativo me causou tantas indisponibilidades que decidi não usá-lo de forma alguma, optando sempre por fazer uma reconstrução.
  2. Mas, como você pode ver neste tópico, nas duas vezes recentes a reconstrução também resultou em um aplicativo muito quebrado, algo que eu não conseguiria corrigir sozinho, a não ser recorrendo ao tests-passed com base nas recomendações aqui.

Por que o mecanismo de atualização está tão quebrado em um software tão bem escrito? Por que tenho sites WordPress com mais de 5 anos funcionando sem problemas com o mecanismo de atualização integrado?

Qual é o sentido de ter releases no Discourse se literalmente não há como usá-las? Uma reconstrução é sempre feita a partir de uma branch do git, e as releases não têm nada a ver com git.

Para mim, uma release seria ou um tag do git ou um arquivo zip. Por que não posso simplesmente usar a reconstrução com a versão 2.3.x, como faria com qualquer gerenciador de pacotes moderno hoje em dia?

Como se vê, tests-passed é o que o discourse.org implanta em seus servidores e é mais testado e confiável do que stable. Se você permanecer em tests-passed, terá menos problemas. Se quiser executar stable, precisa entender que isso exigirá mais trabalho do que executar tests-passed, como rodar um servidor de staging para testar atualizações antes de aplicá-las em produção.

Eu só quero algo que seja estável e confiável, e baseado em

tests-passed é o que o discourse.org implanta em seus servidores, e é mais testado e mais confiável do que o stable

Vou continuar usando isso. Duas coisas ainda são muito estranhas:

  • Por que isso é chamado de test-passed e não de stable, se é realmente estável? “stable” poderia ser renomeado para algo como “legacy”.
  • O sistema de lançamentos ainda não faz sentido. Se estamos construindo a partir de uma branch do Git, qual é o propósito de fazer lançamentos? Gostaria de poder me manter na versão 2.3.x até que a 2.4.x amadureça, por exemplo, e acredito que com o modelo do Discourse isso não é possível de forma alguma.

Com todo respeito, mas discordo disso. O stable é muito confiável e, bem, estável. O Rubygems atualizou uma dependência que fez com que ambos o tests-passed e o stable falhassem, e resolver isso foi apenas uma questão de backportar uma correção.

Aliás, isso poderia ter sido evitado fixando o Rubygems em uma versão específica no comando gem update. gem update --system 3.0.6 teria sido seguro.

O fato de o stable ter ficado quebrado por mais tempo que o tests-passed é apenas uma coincidência e, pelo que me lembro, uma primeira vez.

Temos feito isso (manter o stable como padrão) há mais de seis anos, com centenas de instâncias do Discourse, sem problemas significativos.

Apenas neste tópico, há vários momentos em que a versão estável foi reconstruída em um estado quebrado; definitivamente não é a primeira vez. Se as instâncias comerciais do discourse.org estiverem aprovadas nos testes, vou me ater a elas.

Temos feito isso (manter a versão estável como padrão) há mais de seis anos, com centenas de instâncias do Discourse, sem problemas significativos.

Manter-se na versão estável e manter-se na 2.3.x são coisas muito diferentes. Por exemplo, a versão estável não permite que você permaneça na 2.3.x até que a 2.4.x amadureça o suficiente. Por exemplo, com tudo em produção, prefiro não atualizar até que a versão x.x.3 ou x.x.4 seja lançada. Isso, acredito eu, não é possível hoje.

Sei que é verdade, mas você não é um administrador do Discourse comum. :wink: Você me salvou várias vezes e, por regra, leio tudo o que você diz duas vezes para garantir que me lembre, mas ainda acho que, para a maioria das pessoas normais, o mais seguro é manter a versão tests-passed.

Você pode usar um ID de commit do git em vez de uma tag.

Mas, mesmo que eu faça isso, isso não me salvará em situações em que a versão estável estiver quebrada, certo? Em ambos os casos, o problema foi um backport ausente, e isso também estaria ausente em qualquer ID de commit do git, acredito.

Portanto, não existe algo como uma “versão” do Discourse onde você baixa um arquivo zip estilo WordPress ou usa um gerenciador de pacotes como yarn/pip/gem, simplesmente porque o Discourse não é lançado, mas sim “reconstruído”, sempre usando versões ao vivo de pacotes externos.