Dernière reconstruction cassée

J’ai un système de longue durée, sans aucun problème auparavant. Je fais toujours une mise à jour en effectuant une reconstruction complète, jamais en utilisant la mise à jour intégrée.

Récemment, j’ai effectué une mise à jour via apt-get, une mise à jour de Docker vers la version 19.03.5, puis j’ai tenté une reconstruction, mais cela ne fonctionne plus. Le système est Ubuntu 16.04.6.

Voici mon extrait de reconstruction :

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

Voici le journal complet :
diag.txt (518,9 Ko)

J’ai rétrogradé vers Docker 18.09.9 et le problème persiste.

@j.jaffeux Discourse.redis doit-il être rétroporté vers stable et beta ? Je suppose que ce serait plus simple que d’ajouter du code pour la compatibilité ascendante dans plusieurs plugins.

Oui, j’espérais que cela ne causerait pas trop de problèmes, mais oui, probablement. C’est cependant plusieurs commits.

J’ai rétroporté vers les versions bêta et stable, faites-moi savoir si vous rencontrez un problème.

@j.jaffeux Maintenant, je ne peux pas mettre à jour depuis le tableau de bord :

/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>'

Merci, ça marche parfaitement maintenant !

Ce problème est-il même lié à la nouvelle mise à jour ?

Vous devez reconstruire le conteneur.

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

Je suis presque certain que les dernières modifications cassent docker_manager, car il est mis à jour avant Discourse et ne trouve donc pas Discourse.redis.

Mais git pull; ./launcher rebuild app devrait fonctionner, non ?

J’ai un ensemble de clients pour lesquels je procède aux mises à jour lorsqu’une nouvelle image de conteneur est publiée. Je réalise généralement ces mises à jour peu après (1) la nécessité d’un nouveau conteneur et (2) la sortie d’une nouvelle version bêta.

Je sais que votre capacité à prédire l’avenir de manière fiable est quelque peu limitée, mais pensez-vous qu’une nouvelle version bêta soit prévue prochainement ?

Nous prévoyons une version bêta aujourd’hui ou au début de la semaine prochaine.

Ça a encore planté. Journal complet après git pull + reconstruction :

discourse.txt|pièce jointe (24,4 Ko)

La branche “stable” est actuellement cassée.

Résumé court : tests-passed a fonctionné, j’ai eu 1 jour d’indisponibilité.

Version plus détaillée : Je pense qu’il s’agit de l’un des logiciels open source de la plus haute qualité écrits sur internet aujourd’hui, avec un modèle économique solide et une excellente équipe. Comment se fait-il que le mécanisme de mise à niveau soit simplement si défaillant ?

  1. La fonctionnalité de mise à niveau dans l’application m’a causé tant d’indisponibilités que j’ai décidé de ne plus l’utiliser du tout, et de toujours procéder à une reconstruction.
  2. Mais comme vous pouvez le voir dans ce fil de discussion, sur les 2 dernières tentatives, la reconstruction a également donné une application très cassée, quelque chose que je ne pouvais absolument pas réparer moi-même, si ce n’est en passant par « tests-passed » sur la base des recommandations ici.

Pourquoi le mécanisme de mise à niveau est-il si défaillant dans un logiciel aussi bien conçu ? Pourquoi est-ce que mes sites WordPress de plus de 5 ans fonctionnent sans aucun problème avec leur mécanisme de mise à niveau intégré ?

Quel est l’intérêt d’avoir des versions dans Discourse s’il n’y a littéralement aucun moyen de les utiliser ? Une reconstruction provient toujours d’une branche git, et les versions n’ont rien à voir avec git.

Pour moi, une version serait soit un tag git, soit un fichier zip. Pourquoi ne puis-je pas simplement utiliser la reconstruction avec la version 2.3.x, comme je pourrais le faire avec n’importe quel gestionnaire de paquets moderne aujourd’hui ?

Il s’avère que tests-passed est la version déployée par discourse.org sur leurs serveurs. Elle est mieux testée et plus fiable que stable. Si vous restez sur tests-passed, vous aurez moins de problèmes. Si vous souhaitez utiliser stable, sachez que cela demandera plus de travail que d’utiliser tests-passed, par exemple en exécutant un serveur de préproduction pour tester les mises à jour avant de les déployer en production.

Je veux simplement quelque chose de stable et fiable, et basé sur

tests-passed est ce que discourse.org déploie sur ses serveurs ; c’est mieux testé et plus fiable que stable.

Je vais m’en tenir à cela. Deux choses restent très étranges :

  • Pourquoi cela s’appelle-t-il test-passed et non stable, s’il est effectivement stable ? « stable » pourrait être renommé « legacy » ou quelque chose de similaire.
  • Le système de publication n’a toujours pas de sens. Si nous construisons à partir d’une branche Git, quel est l’intérêt de faire des versions à tout prix ? J’aimerais pouvoir rester sur la 2.3.x jusqu’à ce que la 2.4.x soit mature, par exemple, et je pense que ce n’est pas du tout possible avec le modèle de Discourse.

Avec tout le respect dû, je ne suis pas d’accord avec cela. Stable est très fiable et, eh bien, stable. Rubygems a mis à jour une dépendance, ce qui a cassé à la fois tests-passed et stable, et la résolution de ce problème n’était qu’une question de rétroportage d’un correctif.

D’ailleurs, cela aurait pu être évité en épinglant Rubygems à une version spécifique dans la commande gem update. gem update --system 3.0.6 aurait été sûr.

Le fait que stable ait été cassé plus longtemps que tests-passed est simplement une coïncidence et, à ma connaissance, une première.

Nous faisons cela (rester sur stable par défaut) depuis plus de six ans avec des centaines d’instances Discourse sans problèmes majeurs.

Justement dans ce fil, il y a plusieurs cas où la version stable a été reconstruite dans un état cassé ; ce n’est absolument pas la première fois. Si les instances commerciales de discourse.org ont passé les tests, je m’en tiendrai à celles-ci.

Nous faisons cela (s’en tenir à la version stable par défaut) depuis plus de six ans avec des centaines d’instances Discourse, sans problèmes majeurs.

S’en tenir à la version stable et s’en tenir à la 2.3.x sont deux choses très différentes. Par exemple, la version stable ne vous permet pas de rester sur la 2.3.x tant que la 2.4.x n’est pas suffisamment mature. Par exemple, dans un environnement de production, je préfère ne faire la mise à niveau qu’une fois que la x.x.3 ou la x.x.4 est sortie. À mon avis, ce n’est pas possible aujourd’hui.

Je sais que c’est vrai, mais vous n’êtes pas l’administrateur Discourse moyen. :wink: Vous m’avez sauvé la mise à plusieurs reprises, et par principe, je relis tout ce que vous dites deux fois pour m’assurer de bien retenir. Cependant, je pense toujours que, pour la plupart des gens normaux, il est plus prudent de s’en tenir à la version « tests-passed ».

Vous pouvez utiliser un identifiant de commit Git plutôt qu’une balise.

Mais même si je le fais, cela ne m’aidera pas dans une situation où la version stable est cassée, n’est-ce pas ? Dans les deux cas, le problème était un backport manquant, et celui-ci manquerait tout autant dans n’importe quel ID de commit git, je pense.

Par conséquent, il n’existe pas de « version » Discourse au sens où vous téléchargez un fichier zip à la manière de WordPress ou utilisez un gestionnaire de paquets comme yarn/pip/gem, simplement parce que Discourse n’est pas « publié », mais est « reconstruit », en utilisant toujours les versions en direct des packages externes.