I recently upgraded a self-hosted instance of Discourse using the ./launcher rebuild app strategy. The rebuild seemed to work, but Discourse itself failed to respond. Using docker logs app gives the following output:
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
run-parts: executing /etc/runit/1.d/cleanup-pids
Cleaning stale PID files
run-parts: executing /etc/runit/1.d/copy-env
[Mon Apr 13 06:24:19 PM UTC 2026] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Mon Apr 13 06:24:19 PM UTC 2026] e[1;31mReload error for :e[0m
Started runsvdir, PID is 1613
ok: run: redis: (pid 1624) 0s
ok: run: postgres: (pid 1626) 0s
supervisor pid: 1620 unicorn pid: 1655
I, [2026-04-13T18:24:33.162604 #1659] INFO -- : listening on addr=127.0.0.1:3000 fd=12
URGENT: Failed to initialize site default: NoMethodError undefined method 'with_connection' for nil
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1458:in 'block in ActiveRecord::Relation#exec_main_query'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1480:in 'ActiveRecord::Relation#skip_query_cache_if_necessary'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1442:in 'ActiveRecord::Relation#exec_main_query'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1420:in 'block in ActiveRecord::Relation#exec_queries'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1480:in 'ActiveRecord::Relation#skip_query_cache_if_necessary'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1414:in 'ActiveRecord::Relation#exec_queries'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/goldiloader-6.0.0/lib/goldiloader/active_record_patches.rb:40:in 'Goldiloader::RelationPatch#exec_queries'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:1191:in 'ActiveRecord::Relation#load'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation.rb:353:in 'ActiveRecord::Relation#records'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/relation/delegation.rb:101:in 'ActiveRecord::Delegation#each'
/var/www/discourse/plugins/discourse-multilingual/lib/multilingual/translation.rb:29:in 'Multilingual::Translation.get'
/var/www/discourse/plugins/discourse-multilingual/plugin.rb:231:in 'block (2 levels) in SiteCategorySerializer#activate!'
(eval at /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:467):4:in 'SiteCategorySerializer#_fast_attributes'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:468:in 'ActiveModel::Serializer#attributes'
/var/www/discourse/plugins/discourse-custom-wizard/lib/custom_wizard/extensions/custom_field/serializer.rb:4:in 'CustomWizardCustomFieldSerializer#attributes'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:480:in 'ActiveModel::Serializer#_serializable_hash'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:359:in 'ActiveModel::Serializer#serializable_hash'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/array_serializer.rb:89:in 'block in ActiveModel::ArraySerializer#_serializable_array'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/array_serializer.rb:79:in 'Array#map'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/array_serializer.rb:79:in 'ActiveModel::ArraySerializer#_serializable_array'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/array_serializer.rb:73:in 'ActiveModel::ArraySerializer#serializable_array'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/array_serializer.rb:53:in 'ActiveModel::ArraySerializer#as_json'
/var/www/discourse/app/models/site.rb:102:in 'block in Site.all_categories_cache'
/var/www/discourse/lib/cache.rb:93:in 'Cache#fetch'
/var/www/discourse/app/models/site.rb:72:in 'Site.all_categories_cache'
/var/www/discourse/app/models/site.rb:122:in 'Site#categories'
/var/www/discourse/app/serializers/site_serializer.rb:320:in 'SiteSerializer#include_categories?'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:375:in 'ActiveModel::Serializer#include?'
(eval at /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:467):35:in 'SiteSerializer#_fast_attributes'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:468:in 'ActiveModel::Serializer#attributes'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:480:in 'ActiveModel::Serializer#_serializable_hash'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:359:in 'ActiveModel::Serializer#serializable_hash'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:347:in 'ActiveModel::Serializer#as_json'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/json/encoding.rb:41:in 'Oj::Rails::Encoder#encode'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/json/encoding.rb:41:in 'ActiveSupport::JSON.encode'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/core_ext/object/json.rb:42:in 'ActiveSupport::ToJsonWithActiveSupportEncoder#to_json'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:331:in 'ActiveModel::Serializer#to_json'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/multi_json-1.19.1/lib/multi_json/adapters/oj.rb:62:in 'Oj.dump'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/multi_json-1.19.1/lib/multi_json/adapters/oj.rb:62:in 'MultiJson::Adapters::Oj#dump'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/multi_json-1.19.1/lib/multi_json/adapter.rb:66:in 'MultiJson::Adapter.dump'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/multi_json-1.19.1/lib/multi_json.rb:195:in 'MultiJson.dump'
/var/www/discourse/app/models/site.rb:251:in 'Site.json_for'
/var/www/discourse/lib/discourse.rb:1255:in 'block in Discourse.preload_rails!'
/var/www/discourse/lib/freedom_patches/rails_multisite.rb:16:in 'block in RailsMultisite::ConnectionManagement.safe_each_connection'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in 'RailsMultisite::ConnectionManagement::NullInstance#each_connection'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in 'RailsMultisite::ConnectionManagement.each_connection'
/var/www/discourse/lib/freedom_patches/rails_multisite.rb:9:in 'RailsMultisite::ConnectionManagement.each_active_connection'
/var/www/discourse/lib/freedom_patches/rails_multisite.rb:14:in 'RailsMultisite::ConnectionManagement.safe_each_connection'
/var/www/discourse/lib/discourse.rb:1247:in 'Discourse.preload_rails!'
config/pitchfork.conf.rb:55:in 'block in Pitchfork::Configurator#load'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:965:in 'Pitchfork::HttpServer#init_mold_process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:1073:in 'Pitchfork::HttpServer#mold_loop'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:696:in 'block in Pitchfork::HttpServer#spawn_initial_mold'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in 'Kernel#load'
/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in '<main>'
I, [2026-04-13T18:24:55.272232 #1655] INFO -- : mold gen=0 pid=1659 ready
I, [2026-04-13T18:24:55.272392 #1655] INFO -- : monitor pid=1655 ready
I, [2026-04-13T18:24:55.272465 #1655] INFO -- : monitor process ready
I, [2026-04-13T18:24:55.273154 #1659] INFO -- : service gen=0 spawning...
I, [2026-04-13T18:24:56.299170 #2421] INFO -- : starting 1 supervised sidekiqs
I, [2026-04-13T18:24:56.299585 #1655] INFO -- : service gen=0 pid=2421 spawned
I, [2026-04-13T18:24:56.327552 #1659] INFO -- : worker=0 gen=0 spawning...
I, [2026-04-13T18:24:57.352058 #1655] INFO -- : worker=0 gen=0 pid=2428 registered
I, [2026-04-13T18:24:57.378980 #1659] INFO -- : worker=1 gen=0 spawning...
I, [2026-04-13T18:24:57.424859 #2428] INFO -- : worker=0 gen=0 pid=2428 ready
I, [2026-04-13T18:24:57.734069 #2467] INFO -- : Loading Sidekiq in process id 2467
I, [2026-04-13T18:24:58.407835 #1655] INFO -- : worker=1 gen=0 pid=2531 registered
I, [2026-04-13T18:24:58.432123 #1659] INFO -- : worker=2 gen=0 spawning...
I, [2026-04-13T18:24:58.476681 #2531] INFO -- : worker=1 gen=0 pid=2531 ready
I, [2026-04-13T18:24:59.458790 #1655] INFO -- : worker=2 gen=0 pid=2610 registered
I, [2026-04-13T18:24:59.485286 #1659] INFO -- : worker=3 gen=0 spawning...
I, [2026-04-13T18:24:59.546700 #2610] INFO -- : worker=2 gen=0 pid=2610 ready
I, [2026-04-13T18:25:00.517958 #1655] INFO -- : worker=3 gen=0 pid=2637 registered
I, [2026-04-13T18:25:00.589481 #2637] INFO -- : worker=3 gen=0 pid=2637 ready
Would anyone be willing to suggest what might have gone wrong?