Falha na importação do phpBB3 com Zeitwerk::NameError na versão atual do Discourse

Estou tentando importar um fórum phpBB3 seguindo o guia oficial de migração, mas o script de importação falha imediatamente com um Zeitwerk::NameError.

Ambiente

  • Versão do Discourse: v2026.2.0-latest-324 (também tentei os branches stable/esr)
  • Instalação: Container de importação baseado em Docker
  • Anteriormente: Importei com sucesso o mesmo fórum phpBB no início de janeiro de 2026 sem problemas

O Erro

/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/zeitwerk-2.7.3/lib/zeitwerk/loader/callbacks.rb:31:in 'Zeitwerk::Loader::Callbacks#on_file_autoloaded': expected file /var/www/discourse/lib/freedom_patches/safe_migrations.rb to define constant FreedomPatches::SafeMigrations, but didn't (Zeitwerk::NameError)
Clique para expandir o rastreamento completo do erro
discourse@vps116136-import-from-app:/var/www/discourse/script/import_scripts$ bundle exec ruby phpbb3.rb /shared/import/settings.yml
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/zeitwerk-2.7.3/lib/zeitwerk/loader/callbacks.rb:31:in 'Zeitwerk::Loader::Callbacks#on_file_autoloaded': expected file /var/www/discourse/lib/freedom_patches/safe_migrations.rb to define constant FreedomPatches::SafeMigrations, but didn't (Zeitwerk::NameError)

      raise Zeitwerk::NameError.new(msg, cref.cname)
      ^^^^^
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/zeitwerk-2.7.3/lib/zeitwerk/core_ext/kernel.rb:27:in 'Kernel#require'
        from /var/www/discourse/config/initializers/002-freedom_patches.rb:11:in 'block (2 levels) in <main>'
        from /var/www/discourse/config/initializers/002-freedom_patches.rb:9:in 'Array#each'
        from /var/www/discourse/config/initializers/002-freedom_patches.rb:9:in 'block in <main>'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:406:in 'BasicObject#instance_exec'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:406:in 'block in ActiveSupport::Callbacks::CallTemplate::InstanceExec0#make_lambda'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:178:in 'block in ActiveSupport::Callbacks::Filters::Before#call'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:668:in 'block (2 levels) in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:667:in 'Kernel#catch'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:667:in 'block in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:179:in 'ActiveSupport::Callbacks::Filters::Before#call'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:559:in 'block in ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:559:in 'Array#each'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:559:in 'ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/callbacks.rb:108:in 'ActiveSupport::Callbacks#run_callbacks'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.4/lib/active_support/reloader.rb:96:in 'ActiveSupport::Reloader.prepare!'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/application/finisher.rb:73:in 'block in <module:Finisher>'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/initializable.rb:32:in 'BasicObject#instance_exec'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/initializable.rb:32:in 'Rails::Initializable::Initializer#run'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/initializable.rb:61:in 'block in Rails::Initializable#run_initializers'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:231:in 'block in TSort.tsort_each'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:353:in 'block (2 levels) in TSort.each_strongly_connected_component'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:434:in 'TSort.each_strongly_connected_component_from'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:352:in 'block in TSort.each_strongly_connected_component'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Rails::Initializable::Collection#each'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Method#call'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'TSort.each_strongly_connected_component'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:229:in 'TSort#tsort_each'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:208:in 'TSort#tsort_each'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/initializable.rb:60:in 'Rails::Initializable#run_initializers'
        from /var/www/discourse/vendor/bundle/ruby/3.4.0/gems/railties-8.0.4/lib/rails/application.rb:444:in 'Rails::Application#initialize!'
        from /var/www/discourse/config/environment.rb:7:in '<top (required)>'
        from /var/www/discourse/script/import_scripts/base.rb:16:in 'Kernel#require_relative'
        from /var/www/discourse/script/import_scripts/base.rb:16:in '<top (required)>'
        from /var/www/discourse/script/import_scripts/phpbb3/support/settings.rb:5:in 'Kernel#require_relative'
        from /var/www/discourse/script/import_scripts/phpbb3/support/settings.rb:5:in '<top (required)>'
        from phpbb3.rb:17:in 'Kernel#require_relative'
        from phpbb3.rb:17:in '<module:PhpBB3>'
        from phpbb3.rb:16:in '<module:ImportScripts>'
        from phpbb3.rb:15:in '<main>'

O que eu tentei

  1. Diferentes versões do Discourse: Testei com os branches latest, stable e esr - todos falham com o mesmo erro.
  2. Diferentes ambientes Rails: Tentei RAILS_ENV=production e RAILS_ENV=development.
  3. Novas construções de contêiner: Destruí e reconstruí o contêiner de importação várias vezes.
  4. Bundle install: Atualizei as dependências com bundle install.

Análise da Causa Raiz

O arquivo /var/www/discourse/lib/freedom_patches/safe_migrations.rb define a constante SafeMigrations apenas quando RAILS_ENV != "production":

if ENV["RAILS_ENV"] != "production"
  require_dependency "migration/safe_migrate"
  Migration::SafeMigrate.patch_active_record!
end

No entanto, o inicializador /var/www/discourse/config/initializers/002-freedom_patches.rb tenta exigir este arquivo incondicionalmente, causando o erro Zeitwerk no modo de produção.

Perguntas

  1. Mais alguém encontrou esse problema com versões recentes do Discourse?
  2. Existe uma solução alternativa ou correção conhecida?
  3. Qual versão do Discourse é atualmente recomendada para importações do phpBB?

O fato de isso ter funcionado em janeiro, mas falhar agora, sugere uma mudança recente e quebra no core do Discourse afetando as importações. Qualquer orientação seria muito apreciada!