Estava migrando nossa instância do Discourse de um servidor para outro e me deparei com um problema interessante…
Usamos o S3 para armazenar uploads do fórum. Habilitamos isso há vários anos, portanto, não é algo que introduzimos nesta migração.
Depois de corrigir alguns outros problemas, consegui importar o backup. Mas falhou em uma etapa relacionada ao S3 com o seguinte:
Atualizando os URLs no banco de dados...
Removendo imagens otimizadas antigas...
Marcando todos os posts contendo lightboxes para rebake...
72038 posts foram marcados para rebake
EXCEÇÃO: 257 posts não foram remapeados para o novo URL de upload do S3. A migração do S3 falhou para o banco de dados 'default'.
Depois de investigar um pouco, consegui rastrear o problema até esta linha:
Então, fui ao console do rails e consegui replicar as consultas com o seguinte:
discourse(prod)> SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
=> "/uploads//original"
discourse(prod)> RailsMultisite::ConnectionManagement.current_db
=> "default"
discourse(prod)> cdn_path = SiteSetting.cdn_path("/uploads/default/original").sub(/https?:/, "")
=> "/uploads/default/original"
discourse(prod)> Post.where("cooked LIKE '%#{cdn_path}%'")
=> ...
Então, fui a esses posts específicos, e eles faziam parte dos Relatórios de Desempenho (a captura de tela é de depois que executei um script de encontrar e substituir):
Aparentemente, essa verificação recupera qualquer post contendo /uploads/default/original no campo cooked, apesar de não ser um ativo legítimo. Neste caso, /uploads/default/original foi usado como “texto simples”, portanto, não foi perdido durante o trabalho de migração.
Não tenho certeza se isso é esperado?
Obrigado!
