Migrar para S3 falha na Rebake

Com a ajuda de @itsbhanusharma, tenho trabalhado para mover meus uploads antigos para o S3.

Segui os passos neste guia:

Após uma reconstrução, os uploads ainda não haviam sido movidos para o S3, o que é estranho. O Discourse-doctor relatou um problema de DNS:

> 
> ========================================
> Versão do Discourse em : NÃO ENCONTRADA
> Versão do Discourse em localhost: Discourse 2.5.0.beta4
> **> ==================== PROBLEMA DE DNS ====================**
> **> Este servidor reporta a versão Discourse 2.5.0.beta4, mas reporta NÃO ENCONTRADA.**
> **> Isso sugere que você tem um problema de DNS ou que um proxy intermediário é o culpado.**
> **> Se você está usando Cloudflare ou uma CDN, pode estar configurado incorretamente.**

Executei uma migração manual para o S3 e obtive o seguinte:

 > root@discourse-app:/var/www/discourse# rake --trace uploads:migrate_to_s3
 > ** Invoke uploads:migrate_to_s3 (first_time)
 > ** Invoke environment (first_time)
 > ** Execute environment
 > ** Execute uploads:migrate_to_s3
 > Migrando uploads para o S3 para 'default'...
 > Enviando arquivos para o S3...
 >  - Listando arquivos locais
 > .. => 2980 arquivos
 >  - Listando arquivos no S3
 > .... => 3156 arquivos
 >  - Sincronizando arquivos para o S3
 > ....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
 > Atualizando as URLs no banco de dados...
 > Aviso: nenhum cast de tipo definido para o tipo "name" com oid 19. Por favor, faça o cast explícito deste tipo para TEXT para estar seguro contra futuras mudanças.
 > Removendo imagens otimizadas antigas...
 > Marcando todas as postagens contendo lightboxes para rebake...
 > 781 postagens foram marcadas para rebake
 > rake aborted!
 > FileStore::ToS3MigrationError: 68 postagens não foram remapeadas para a nova URL de upload do S3. Migração para o S3 falhou para o banco de dados 'default'.
 > /var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
 > /var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?'
 > /var/www/discourse/lib/file_store/to_s3_migration.rb:351:in `migrate_to_s3'
 > /var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
 > /var/www/discourse/lib/tasks/uploads.rake:239:in `migrate_to_s3'
 > /var/www/discourse/lib/tasks/uploads.rake:218:in `block in migrate_to_s3_all_sites'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.1.2/lib/rails_multisite/connection_management.rb:64:in `with_connection'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.1.2/lib/rails_multisite/connection_management.rb:74:in `each_connection'
 > /var/www/discourse/lib/tasks/uploads.rake:216:in `migrate_to_s3_all_sites'
 > /var/www/discourse/lib/tasks/uploads.rake:212:in `block in <top (required)>'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
 > /usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
 > /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
 > bin/rake:13:in `<top (required)>'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
 > /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
 > /usr/local/bin/bundle:23:in `load'
 > /usr/local/bin/bundle:23:in `<main>'
 > Tasks: TOP => uploads:migrate_to_s3
 > root@discourse-app:/var/www/discourse#

Alguma opinião sobre isso, @gerhard?

Falha porque a verificação a seguir falha:

Sugiro que descubra por que esses caminhos não estão sendo remapeados corretamente. Tente executar o seguinte no console do Rails para examinar o campo cooked desses posts. Talvez haja uma pista em algum lugar…

current_db = RailsMultisite::ConnectionManagement.current_db
cdn_path = SiteSetting.cdn_path("/uploads/#{current_db}/original").sub(/https?:/, "")
Post.where("cooked LIKE '%#{cdn_path}%'").pluck(:cooked)

Here’s the output from the rails console: (this is only part of it and it is ugly)

root@discourse-app:/var/www/discourse# rails console
[1] pry(main)> current_db = RailsMultisite::ConnectionManagement.current_db
=> "default"
[2] pry(main)> cdn_path = SiteSetting.cdn_path("/uploads/#{current_db}/original").sub(/https?:/, "")
=> "/uploads/default/original"
[3] pry(main)> Post.where("cooked LIKE '%#{cdn_path}%'").pluck(:cooked)
=> ["<p>U.C. Tricolor frag $30<br>\nRed Stylocoeniella $30<br>\nBranching Cyphastrea $40<br>\nOrenji Mont frag $30</p>\n<hr>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534.jpeg\" data-download-href=\"/uploads/short-url/5Jf4Z7WaQqYix5IDWN12IlLoYfi.jpeg?dl=1\" title=\"DSCN0069-005.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534_2_524x500.jpeg\" alt=\"DSCN0069-005.JPG\" data-base62-sha1=\"5Jf4Z7WaQqYix5IDWN12IlLoYfi\" width=\"524\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534_2_524x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534_2_786x750.jpeg 1.5x, /uploads/default/original/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/2/282821b1e16dce48ac11f1d607412e1bfed61534_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0069-005.JPG</span><span class=\"informations\">800×762 181 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5.jpeg\" data-download-href=\"/uploads/short-url/lprJZk3t4LfijslovcQ9kgaqzcN.jpeg?dl=1\" title=\"DSCN0119-003.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5_2_513x500.jpeg\" alt=\"DSCN0119-003.JPG\" data-base62-sha1=\"lprJZk3t4LfijslovcQ9kgaqzcN\" width=\"513\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5_2_513x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5_2_769x750.jpeg 1.5x, /uploads/default/original/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/9/960e0f184917ad7e0bbf2d6c31cf546fa9e124f5_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0119-003.JPG</span><span class=\"informations\">800×779 186 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/5/548f0324f3b0e8dd482729c1d1f5c450b5556919.jpeg\" data-download-href=\"/uploads/short-url/c42vC8e8IRT52htW2RX7YedLpaN.jpeg?dl=1\" title=\"DSCN0072-004.JPG\"><img src=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/5/548f0324f3b0e8dd482729c1d1f5c450b5556919.jpeg\" alt=\"DSCN0072-004.JPG\" data-base62-sha1=\"c42vC8e8IRT52htW2RX7YedLpaN\" width=\"468\" height=\"500\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/5/548f0324f3b0e8dd482729c1d1f5c450b5556919_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0072-004.JPG</span><span class=\"informations\">750×800 180 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8.jpeg\" data-download-href=\"/uploads/short-url/vshBXgkYrsRhRqNFakI1jgIE5Sg.jpeg?dl=1\" title=\"DSCN0060-005.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8_2_396x500.jpeg\" alt=\"DSCN0060-005.JPG\" data-base62-sha1=\"vshBXgkYrsRhRqNFakI1jgIE5Sg\" width=\"396\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8_2_396x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8_2_594x750.jpeg 1.5x, /uploads/default/original/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/d/dc75e2b57072ff260f99cfa9a7cc1e4f39c207f8_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0060-005.JPG</span><span class=\"informations\">635×800 196 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>",
 "<p>U.C. Raspberry delight frag $39 “radion”<br>\nORA Kelly green psammacora $39 \"radion<br>\nU.C. Red Dragon Frag $30<br>\nU.C. Red dragon Smaller frag $20</p>\n<hr>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/d/deb035a3639a3a3bb8b04ebd9da2b97fb5d8652d.jpeg\" data-download-href=\"/uploads/short-url/vLZwAqgUqcslrwos7Q27gheEVSR.jpeg?dl=1\" title=\"DSCN9908-003.JPG\"><img src=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/d/deb035a3639a3a3bb8b04ebd9da2b97fb5d8652d.jpeg\" alt=\"DSCN9908-003.JPG\" data-base62-sha1=\"vLZwAqgUqcslrwos7Q27gheEVSR\" width=\"561\" height=\"500\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/d/deb035a3639a3a3bb8b04ebd9da2b97fb5d8652d_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN9908-003.JPG</span><span class=\"informations\">800×712 165 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/e/e579dab30a023f12755b22e8bb1c077b34225110.jpeg\" data-download-href=\"/uploads/short-url/wK2pz5DNtgezJhhQuxaFE52CvnO.jpeg?dl=1\" title=\"DSCN0059-005.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e579dab30a023f12755b22e8bb1c077b34225110_2_450x500.jpeg\" alt=\"DSCN0059-005.JPG\" data-base62-sha1=\"wK2pz5DNtgezJhhQuxaFE52CvnO\" width=\"450\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e579dab30a023f12755b22e8bb1c077b34225110_2_450x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e579dab30a023f12755b22e8bb1c077b34225110_2_675x750.jpeg 1.5x, /uploads/default/original/2X/e/e579dab30a023f12755b22e8bb1c077b34225110.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e579dab30a023f12755b22e8bb1c077b34225110_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0059-005.JPG</span><span class=\"informations\">721×800 231 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/e/e5d72072aee537852120d7106522b543e6af9085.jpeg\" data-download-href=\"/uploads/short-url/wNgfm2qrVEyTWGfUV3QAc2EGKfX.jpeg?dl=1\" title=\"DSCN0066-005.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e5d72072aee537852120d7106522b543e6af9085_2_506x500.jpeg\" alt=\"DSCN0066-005.JPG\" data-base62-sha1=\"wNgfm2qrVEyTWGfUV3QAc2EGKfX\" width=\"506\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e5d72072aee537852120d7106522b543e6af9085_2_506x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e5d72072aee537852120d7106522b543e6af9085_2_759x750.jpeg 1.5x, /uploads/default/original/2X/e/e5d72072aee537852120d7106522b543e6af9085.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/e/e5d72072aee537852120d7106522b543e6af9085_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0066-005.JPG</span><span class=\"informations\">800×790 200 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>\n<p><div class=\"lightbox-wrapper\"><a class=\"lightbox\" href=\"//brcuploads.s3.dualstack.us-east-1.amazonaws.com/original/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e.jpeg\" data-download-href=\"/uploads/short-url/8G3Jz9KwzbbXzYx3PYei4ayTmSa.jpeg?dl=1\" title=\"DSCN0068-005.JPG\"><img src=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e_2_395x500.jpeg\" alt=\"DSCN0068-005.JPG\" data-base62-sha1=\"8G3Jz9KwzbbXzYx3PYei4ayTmSa\" width=\"395\" height=\"500\" srcset=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e_2_395x500.jpeg, https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e_2_592x750.jpeg 1.5x, /uploads/default/original/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e.jpeg 2x\" data-small-upload=\"https://d2hneyr8lp58j4.cloudfront.net/optimized/2X/3/3cd28b0f2704180632ca5e714241b6b62f63459e_2_10x10.png\"><div class=\"meta\"><svg class=\"fa d-icon d-icon-far-image svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#far-image\"></use></svg><span class=\"filename\">DSCN0068-005.JPG</span><span class=\"informations\">633×800 139 KB</span><svg class=\"fa d-icon d-icon-discourse-expand svg-icon\" aria-hidden=\"true\"><use xlink:href=\"#discourse-expand\"></use></svg></div></a></div></p>",

Acho que resolvi o problema. Percebi que não conseguia executar um backup e, eventualmente, descobri que o nome do bucket de backup estava escrito incorretamente no app.yml. O bucket de upload estava correto. Corrigi a grafia e os backups voltaram a funcionar. Acabei de testar por curiosidade e funcionou.

Estou executando um rebake nos posts agora mesmo.

Estou enfrentando o mesmo problema: apenas 17 publicações de um total de 49.595 estão causando a interrupção da rebake.

49595 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 17 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:245:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:224:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:86:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:222:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:218:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(See full trace by running task with --trace)

Não tenho certeza do que devo procurar na saída do comando Rails acima, @gerhard — você tem alguma dica para mim?

Obtendo o mesmo erro devido a 3 posts :confused:

Atualizando as URLs no banco de dados...
Aviso: nenhum casting de tipo definido para o tipo "name" com oid 19. Por favor, faça o casting explícito deste tipo para TEXT para garantir segurança contra mudanças futuras.
Removendo imagens otimizadas antigas...
Marcando todos os posts contendo lightboxes para rebake...
123456 posts foram marcados para um rebake
rake abortado!
FileStore::ToS3MigrationError: 3 posts não foram remapeados para a nova URL de upload S3. A migração S3 falhou para o banco de dados 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:245:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:224:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:86:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:222:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:218:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tarefas: TOP => uploads:migrate_to_s3
(Veja o rastreamento completo executando a tarefa com --trace)

@gerhard - Se recebermos um erro assim, você sabe se o significado é “sucesso! - exceto por 3 posts” ou “falha crítica na migração, por causa de 3 posts”?

Para tentar retomar, devo executar rake posts:rebake, rake posts:rebake_uncooked_posts ou rake uploads:migrate_to_s3 novamente?

Agradeceria muito qualquer ajuda :slight_smile:

Ao executar isso, não consigo ver nada que pareça comum entre todos eles. O único ponto em comum é que todos estão dentro de tags <p>, se isso significar algo.

Algo estranho foi um com um link para um emoji do fórum. Exemplo:
https://www.example.com/images/emoji/twitter/slight_smile.png?v=9


Ao executar rake posts:rebake_uncooked_posts manualmente após o erro de migração mencionado em minha postagem anterior (não tenho certeza se o rebake é o que devo fazer), surgiu este erro:

Failed to report error: "\x8B" from ASCII-8BIT to UTF-8 3 Job exception: 403 Error:

Com um monte de texto ilegível abaixo. Ainda está em execução agora.

@gerhard Tem alguma chance de você saber como corrigir o problema de todos os avatares personalizados serem exibidos como avatares padrão após a migração para o S3?

Tudo o mais está sendo exibido corretamente no S3. Imagens de postagens, cartões de usuário, imagens de fundo de usuário. Apenas os avatares não estão sendo exibidos. Parece que os avatares originais foram migrados; é possível vê-los no banco de dados e os arquivos existem no S3, então parece ser apenas um problema com os otimizados. Vejo que muitas pessoas tiveram esse problema, mas ainda não consegui encontrar uma solução. :sweat_smile:


Atualização/Edição:

Então, vou arriscar e completar a migração sem que os avatares funcionem. Novos uploads de avatar estão indo para o S3, mas eles também não serão exibidos :confused:

Espero que isso possa ser corrigido mais tarde, em algum momento.

Ao verificar em /logs, vejo alguns registros como este para URLs de avatar:

Could not find file in the store located at url: //bucketname.s3.fr-par.scw.cloud/original/2X/d/123456.JPG

O arquivo existe, no entanto, se eu visitar a URL e o caminho do arquivo parece correto. Tenho outra instância com as mesmas configurações (a única diferença é o nome do bucket) e os avatares estão funcionando muito bem. O caminho está no formato idêntico na outra instância também (ao pesquisar os uploads no Rails).

Espero que isso seja uma pista do que está acontecendo.

Executei uma migração manual para o S3 e obtive o mesmo resultado, mas encontrei a pasta tombstone no bucket do S3. Isso é normal, @gerhard?

Por que esses caminhos não foram remapeados corretamente:

> current_db = RailsMultisite::ConnectionManagement.current_db
=> "default"
> cdn_path = SiteSetting.cdn_path("/uploads/#{current_db}/original").sub(/https?:/, "")
=> "/uploads/default/original"
> Post.where("cooked LIKE '%#{cdn_path}%'").pluck(:cooked)
=> []

> Atualizando as URLs no banco de dados...
> Aviso: nenhum tipo de conversão definido para o tipo "name" com oid 19. Por favor, converta explicitamente este tipo para TEXT para garantir segurança em futuras alterações.
> Removendo imagens otimizadas antigas...
> Marcando todas as postagens contendo lightboxes para rebake...
> 10855 postagens foram marcadas para rebake
> rake aborted!
> FileStore::ToS3MigrationError: 1889 de 6492 uploads não foram migrados para o S3. A migração para o S3 falhou para o banco de dados 'default'.
> /var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:78:in `migration_successful?'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
> /var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
> /var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:86:in `each_connection'
> /var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
> /var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:281:in `block in execute'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:281:in `each'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:281:in `execute'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:199:in `synchronize'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:199:in `invoke_with_call_chain'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/task.rb:188:in `invoke'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:160:in `invoke_task'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:116:in `block (2 levels) in top_level'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:116:in `each'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:116:in `block in top_level'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:125:in `run_with_threads'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:110:in `top_level'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:83:in `block in run'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:186:in `standard_exception_handling'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/lib/rake/application.rb:80:in `run'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/exe/rake:27:in `<top (required)>'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:23:in `load'
> /var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:23:in `<top (required)>'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `load'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `kernel_load'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:28:in `run'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:494:in `exec'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:30:in `dispatch'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:24:in `start'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:49:in `block in <top (required)>'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
> /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:37:in `<top (required)>'
> /usr/local/bin/bundle:23:in `load'
> /usr/local/bin/bundle:23:in `<main>'
> Tasks: TOP => uploads:migrate_to_s3

Edição: Parece que seu erro foi diferente do meu. Parece que algumas das suas imagens não foram movidas para o S3. Desculpe, eu li errado. Talvez algumas das informações abaixo ainda sejam úteis. Você configurou seus uploads no S3 seguindo este guia? Configure an S3 compatible object storage provider for uploads

@evenif - Sinto muito em saber que você está tendo problemas com isso. Eu planejava escrever um guia sobre isso para pessoas que estão enfrentando os mesmos problemas, já que foi necessário reunir bastante informação de diferentes tópicos. Mas estou esperando para consertar os avatares, como você pode ver acima, ainda estou tendo problemas com isso.

Se você executar isso no Rails, obtém true ou false?

SiteSetting.migrate_to_new_scheme

Se for false, então você pode tentar defini-lo como true assim:

SiteSetting.migrate_to_new_scheme = true

Em seguida, espere um pouco e volte mais tarde (creio que isso roda a cada 15 minutos, se não me engano), mas se quiser executá-lo imediatamente:

Jobs::MigrateUploadScheme.new.execute(nil)

Depois, verifique novamente mais tarde se SiteSetting.migrate_to_new_scheme agora é false (o que significa que deve ter concluído).

Em seguida, execute:
Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a

Isso deve encontrar uploads que ainda têm problemas e não puderam ser migrados. No meu caso, todos esses uploads existiam como registros no banco de dados, mas as imagens reais não existiam.

Dependendo do tamanho da lista, você pode copiar a página e usar encontrar + substituir para criar uma lista de comandos para remover esses registros problemáticos usando a lista de IDs de upload.

Upload.find(1).destroy
Upload.find(2).destroy
Upload.find(3).destroy

Substituindo 1, 2, 3, etc., pelos IDs de upload. Copie e cole toda a lista no Rails e pressione Enter. Isso deve excluir esses registros problemáticos.

Depois, saia do Rails (digite exit) e tudo o que você precisa fazer é executar:

rake posts:rebake
ou
rake posts:rebake_uncooked_posts

A opção uncooked permite retomar o rebake se ele falhar. Recomendo usar o rebake normal, a menos que você tenha toneladas de uploads.

Então, tudo deve funcionar corretamente, espero. Mas há uma boa chance de que seus avatares otimizados estejam quebrados como os meus, mas os originais devem existir no S3.

Você pode verificar se os avatares foram migrados com sucesso (pelo menos para alguns usuários) executando isso no Rails para um usuário que está exibindo um avatar padrão:
User.find_by_username('nome_de_usuário').uploaded_avatar

Também pode verificar se as versões otimizadas existem usando:
OptimizedImage.where(upload_id: upload_id).where(version: 2)

@markersocial Obrigado pela sua ajuda. Acredito que meu problema ocorreu porque usei o serviço S3 antes (desde 2005), depois armazenamento local e, em seguida, voltei a usar o armazenamento S3. Agora, ao tentar fazer o upload das minhas imagens locais para o S3, surgiram muitos problemas. Meu bucket S3 não possui /uploads/default.

Após executar uploads:migrate_to_s3, encontrei algumas imagens quebradas em /images/transparent.png. Quando usei o comando rake uploads:recover_from_tombstone:

Obtive a seguinte mensagem:

Aviso: /t/topic/6216/4 tinha um hash incorreto: 338c64ada8cbb0fb99bff79e833a4cc492ead00c, mas deveria ser c95e4b7c08702db4593332f29b40ca07fb1d9db1. Armazenando no campo personalizado. O comando rake uploads:fix_relative_upload_links pode corrigir isso.

Em seguida, o rake foi abortado com a seguinte mensagem:

rake uploads:fix_relative_upload_links --trace
** Invoke uploads:fix_relative_upload_links (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:fix_relative_upload_links
Upload não encontrado em /uploads/files/general/111/cours-offerts.pdf no Post 23033 - /t/certificate-technique-de-soudage-college-mathieu/11060/1

Agora estou confuso.

Ah :confused: Esse problema está além do meu entendimento. Espero que você consiga encontrar uma solução ou que alguém com mais conhecimento possa intervir.

Quanto à ausência de /uploads/default no seu bucket, acredito que isso seja normal e não deva ser o problema. É o mesmo caso para os meus buckets (tanto nas instâncias que migraram para o S3 quanto naquelas que usaram o S3 desde o primeiro dia). Você pode verificar o caminho da sua imagem incorporada neste tópico e ver que o caminho também não contém /uploads/default.

Eu também estou sofrendo com o mesmo problema exato.

Você chegou a encontrar pelo menos alguma solução!!!???

Se não, peço que, caso encontre alguma maneira, compartilhe comigo. Ficarei muito grato.

Encontrei um problema semelhante, possivelmente devido à migração de AWS S3 → local → DO Spaces. Acabei escrevendo um código Ruby para substituir manualmente as URLs de upload antigas e quebradas pelo formato atualizado e funcional, e parece que isso resolveu meu problema.

No meu caso, todos os arquivos foram movidos com sucesso para o DO Spaces na primeira migração, mas o migrate_to_s3 os registrou como falhas. Isso não quebrou os anexos inicialmente, mas executar um rebake fez com que eles parassem de funcionar. Mais detalhes no tópico vinculado.

Eu também estou recebendo esse erro após importar um banco de dados do smf2, habilitar o S3 e executar rake --trace uploads:migrate_to_s3

Migrando uploads para o S3 para 'default'...
Fazendo upload de arquivos para o S3...
 - Listando arquivos locais
.. => 2244 arquivos
 - Listando arquivos do S3
... => 2383 arquivos
 - Sincronizando arquivos para o S3
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Atualizando as URLs no banco de dados...
Removendo imagens otimizadas antigas...
Marcando todas as postagens contendo lightboxes para rebake...
454 postagens foram marcadas para um rebake
rake aborted!
FileStore::ToS3MigrationError: 7165 de 9554 uploads não foram migrados para o S3. A migração para o S3 falhou para o db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-3.1.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-3.1.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli.rb:477:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/cli.rb:25:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/exe/bundle:49:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/lib/bundler/friendly_errors.rb:128:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.26/exe/bundle:37:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

markersocial, quando executo Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a, a saída é []

Estou presumindo que isso signifique que meu problema é diferente do seu?

ipoopfool, acho que posso estar enfrentando o mesmo problema que você. Você se importaria de compartilhar seu código Ruby que resolveu isso para você? :blue_heart:

Obrigado.

Ao executar o script, recebo o seguinte erro:

NameError: variável ou método local `upload_regex' não definido para main:Object
de /var/www/discourse/script/discourse-fix-old-broken-uploads.rb:30:in `update_post_upload_links'

Alguma sugestão?

Desculpe pelo necro, removendo o link que compartilhei antes, então pensei em apenas copiar e colar o código diretamente aqui

Postagens de antes de setembro de 2020 têm uploads quebrados após a migração para armazenamentos de objetos e re-bake. Parece que os uploads estão bem, os URLs no raw estavam apenas formatados incorretamente, então estou corrigindo-os manualmente.

# Nota: fazer uma atualização desta forma não parece adicionar histórico de revisão às postagens. Faça um backup manual do banco de dados antes de executar, apenas por precaução.

# https://rubular.com/
# Grupos de captura: /uploads/..., nome do arquivo sha1
upload_regex = /(\/uploads\/[\/\w]+\/)([0-9a-f]+)\.\w+/

def to_short_name(sha1)
  # REQUER EXECUÇÃO NO CONSOLE RAILS DO DISCOURSE
  Upload.base62_sha1(sha1)
end

# Uma verificação de sanidade. Você pode percorrer todas as postagens e extrair quantas vezes /uploads/ aparece.
# em seguida, execute a correspondência de regex para ver se o número de correspondências é igual a ele.
def count_num_broken_upload_links(posts)
  num_string_match = 0
  num_regex_match = 0

  posts.each do |post|
    num_string_match += post.raw.count("(/uploads/") # ISSO ESTÁ QUEBRADO. A CONTAGEM SÓ FUNCIONA PARA CARACTERES.
    num_regex_match += post.raw.scan(upload_regex).count
  end

  puts "Número de verificação de sanidade de vezes que links de upload antigos aparecem"
  puts "Correspondências de string simples " + num_string_match.to_s
  puts "Correspondências de Regex " + num_regex_match.to_s
end

def update_post_upload_links(post)
  matches = post.raw.scan(upload_regex)
  fixed_raw = matches.reduce(post.raw) do |accumulator, match|
    prefix = match[0]
    sha1 = match[1]
    # sub, não gsub, para que substituamos sequencialmente cada anexo um por um
    accumulator.sub(prefix, "upload://").sub(sha1, to_short_name(sha1))
  end

  if post.raw != fixed_raw
    # Atualizar post.raw também parece acionar um re-bake. Mas ainda quero fazer um re-bake completo mais tarde, apenas para ter certeza.
    post.update(raw: fixed_raw)
  end

  puts "Post id #{post.id} atualizado"
end

# O problema que estou corrigindo ocorre até o final de 2020-9-5, mas adicionarei alguns dias extras apenas para ter certeza.
posts = Post.where("created_at < ?", Date.new(2020,9,7))

posts.each { |post| update_post_upload_links(post) }

E outra pessoa comentou

No meu cenário, a variável upload_regex precisa ser global, não local. Então, upload_regex precisa ser alterado para $upload_regex.