Ultima ricostruzione rotta

Ho un sistema in esecuzione da molto tempo, non ho mai avuto problemi prima. Aggiorno sempre con una ricostruzione completa, senza mai usare l’aggiornamento integrato.

Recentemente ho eseguito un apt-get upgrade, ho aggiornato Docker alla versione 19.03.5 e ho provato a ricostruire, ma ora è rotto. Il sistema è Ubuntu 16.04.6.

Ecco il mio frammento di ricostruzione:

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

Ecco il log completo:
diag.txt (518,9 KB)

Sono passato alla versione Docker 18.09.9 e il problema persiste.

@j.jaffeux Dovrebbe essere retroportato Discourse.redis su stable e beta? Immagino che sarebbe più semplice rispetto all’aggiunta di codice per la compatibilità all’indietro in più plugin.

Sì, speravo non causasse troppi problemi, ma sì, probabilmente sì. Sono comunque più commit.

Ho fatto il backport alla versione beta e a quella stabile, fammi sapere se incontri qualche problema.

@j.jaffeux Ora non riesco ad aggiornare dal pannello di controllo:

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

Grazie, ora funziona perfettamente!

Questo problema è davvero correlato alla nuova aggiornamento?

È necessario ricostruire il container.

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

Sono quasi certo che le ultime modifiche abbiano rotto docker_manager, poiché viene aggiornato prima di Discourse e quindi non riesce a trovare Discourse.redis.

Ma git pull; ./launcher rebuild app risolve il problema, giusto?

Ho un insieme di clienti per cui eseguo gli aggiornamenti quando viene rilasciata una nuova immagine del contenitore. Di solito eseguo questi aggiornamenti poco dopo: (1) che sia necessario un nuovo contenitore e (2) che sia stata rilasciata una nuova beta.

So che la tua capacità di prevedere il futuro in modo affidabile è piuttosto limitata, ma prevedi che ci sarà presto una nuova release beta?

Prevediamo di avere una versione beta oggi o all’inizio della prossima settimana

Si è rotto di nuovo. Log completo dopo git pull + rebuild:

discourse.txt|allegato (24,4 KB)

Il branch “stable” è attualmente rotto.

Breve riassunto: tests-passed ha funzionato, ho avuto un’interruzione di servizio di 1 giorno

Versione più dettagliata: Credo che questo sia uno dei software open source di qualità più elevata scritti oggi su Internet, con un modello di business solido e un ottimo team. Come mai il meccanismo di aggiornamento è così rotto?

  1. La funzione di aggiornamento nell’app mi ha causato così tante interruzioni di servizio che ho deciso di non usarla affatto, optando invece per un rebuild ogni volta.
  2. Ma come puoi vedere da questa discussione, nelle ultime due occasioni il rebuild ha prodotto un’app completamente rotta, qualcosa che non potevo assolutamente risolvere da solo, se non ricorrendo a “tests-passed” come consigliato qui.

Perché il meccanismo di aggiornamento è così rotto in un software così ben scritto? Perché ho siti WordPress attivi da oltre 5 anni che funzionano senza problemi con il loro meccanismo di aggiornamento integrato?

Qual è lo scopo delle release in Discourse se non esiste letteralmente alcun modo per utilizzarle? Un rebuild è sempre eseguito da un branch git, mentre le release non hanno nulla a che fare con git.

Per me una release dovrebbe essere o un tag git o un file zip. Perché non posso semplicemente usare rebuild con la versione 2.3.x, come si può fare con qualsiasi gestore di pacchetti moderno oggi?

Come si è scoperto, tests-passed è la versione che discourse.org distribuisce sui propri server ed è più testata e affidabile rispetto a stable. Se rimani su tests-passed, avrai meno problemi. Se desideri eseguire stable, devi sapere che richiederà più lavoro rispetto all’esecuzione di tests-passed, ad esempio l’utilizzo di un server di staging per testare gli aggiornamenti prima di applicarli in produzione.

Voglio solo qualcosa di stabile e affidabile, basato su

tests-passed è ciò che discourse.org distribuisce sui propri server ed è più testato e affidabile di stable

Mi atterrò a questo. Due cose sono ancora molto strane:

  • Perché si chiama test-passed e non stable, se è davvero stabile? “stable” potrebbe essere rinominato in qualcosa come “legacy”.
  • Il sistema di rilascio non ha ancora senso. Se stiamo costruendo da un ramo Git, qual è lo scopo di fare rilasci? Mi piacerebbe poter rimanere su 2.3.x finché 2.4.x non si stabilizza, ad esempio, e credo che con il modello di Discourse questo non sia assolutamente possibile.

Con tutto il rispetto, ma non sono d’accordo. Stable è molto affidabile e, beh, stabile. Rubygems ha aggiornato una dipendenza che ha rotto sia tests-passed sia stable, e risolvere il problema è stato semplicemente una questione di backport di una correzione.

Comunque, questo avrebbe potuto essere evitato fissando una versione specifica di Rubygems nel comando gem update. gem update --system 3.0.6 sarebbe stato sicuro.

Il fatto che stable sia stato rotto più a lungo di tests-passed è solo una coincidenza e, per quanto mi ricordi, una prima volta.

Lo stiamo facendo (mantenere stable come predefinito) da oltre sei anni con centinaia di istanze di Discourse senza problemi significativi.

Proprio in questa discussione ci sono diversi casi in cui la versione stable è stata ricostruita in uno stato rotto; non è certo la prima volta. Se le istanze commerciali di discourse.org sono considerate passate ai test, allora mi atterrò a quelle.

Lo facciamo da oltre sei anni (mantenendo la stable come predefinita) con centinaia di istanze Discourse, senza problemi significativi.

Mantenere la stable e rimanere sulla 2.3.x sono cose molto diverse. Ad esempio, la stable non ti permette di restare sulla 2.3.x finché la 2.4.x non matura a sufficienza. In un ambiente di produzione, preferisco aggiornare solo quando escono versioni x.x.3 o x.x.4. Oggi, a quanto pare, questo non è possibile.

So che è vero, ma tu non sei un amministratore Discourse medio. :wink: Mi hai salvato molte volte e, in linea di principio, leggo tutto ciò che dici due volte per assicurarmi di ricordarlo, ma ritengo comunque che per la maggior parte delle persone normali sia più sicuro attenersi a tests-passed.

Puoi utilizzare un ID di commit git invece di un tag.

Ma anche se lo facessi, non mi salverebbe in una situazione in cui la versione stabile è rotta, vero? In entrambi i casi il problema era un backport mancante, e questo mancherebbe ugualmente in qualsiasi ID di commit git, credo.

Quindi non esiste una vera “release” di Discourse dove puoi scaricare un file zip alla maniera di WordPress o utilizzare un gestore di pacchetti come yarn/pip/gem, semplicemente perché Discourse non viene rilasciato, ma viene “ricostruito”, utilizzando sempre le versioni live dei pacchetti esterni.