Rebake 時に Migrate_to_S3 が失敗する

With the help of @itsbhanusharma, I’ve been working to move my old uploads over to S3.

I followed the steps in this guide:

After a rebuild, the uploads sitll had not moved to S3, which is odd. Discourse-doctor reported a DNS problem:

> 
> ========================================
> Discourse version at : NOT FOUND
> Discourse version at localhost: Discourse 2.5.0.beta4
> **> ==================== DNS PROBLEM ====================**
> **> This server reports Discourse 2.5.0.beta4 , but reports NOT FOUND.**
> **> This suggests that you have a DNS problem or that an intermediate proxy is to blame.**
> **> If you are using Cloudflare, or a CDN, it may be improperly configured.**

I ran a manual migrate to S3 and got the following:

 > 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
> Migrating uploads to S3 for 'default'...
> Uploading files to S3...
>  - Listing local files
> .. => 2980 files
>  - Listing S3 files
> .... => 3156 files
>  - Syncing files to S3
> ....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
> Updating the URLs in the database...
> Warning: no type cast defined for type "name" with oid 19. Please cast this type explicitly to TEXT to be safe for future changes.
> Removing old optimized images...
> Flagging all posts containing lightboxes for rebake...
> 781 posts were flagged for a rebake
> rake aborted!
> FileStore::ToS3MigrationError: 68 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: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#

Any thoughts on this @gerhard?

「いいね!」 1

It fails because the following check fails:

I suggest you find out why those paths aren’t remapped correctly. Try running the following in the rails console to look at cooked of those posts. Somewhere in there might be a clue…

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)
「いいね!」 4

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>",

I think I fixed the issue. I noticed I couldn’t run a backup and eventually found that the backup bucket name was spelled wrong in app.yml. The upload bucket was fine. I fixed the spelling and backups worked again. Just tried this for giggles and it went through.

Running a rebake on the posts right now.

「いいね!」 2

49595 件の投稿のうち比較的小さな 17 件の投稿でリベイクが中止されるという同じ問題が発生しています。

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)

上記の Rails コマンドの出力で何を確認すべきか分かりません @gerhard -何かヒントはありますか?

3 つの投稿により、同じエラーが発生しています :confused:

データベース内の URL を更新中...
警告: oid 19 の型 "name" に対して型キャストが定義されていません。将来の変更に対して安全にするため、この型を明示的に TEXT にキャストしてください。
古い最適化された画像を削除中...
ライトボックスを含むすべての投稿を再構築対象としてフラグ付け中...
123456 件の投稿が再構築対象としてフラグ付けされました
rake aborted!
FileStore::ToS3MigrationError: 3 つの投稿が新しい S3 アップロード URL に再マッピングされていません。データベース 'default' における S3 移行に失敗しました。
/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
(--trace オプションを付けてタスクを実行することで、完全なトレースを確認できます)

@gerhard - このようなエラーが発生した場合、これは「成功!ただし 3 つの投稿を除く」という意味なのか、「3 つの投稿が原因で重大な移行失敗」という意味なのか、ご存知ですか?

再開を試みるには、rake posts:rebakerake posts:rebake_uncooked_posts、または rake uploads:migrate_to_s3 のいずれを再度実行すべきでしょうか?

ご支援いただければ幸いです :slight_smile:

これを実行しましたが、それらすべてに共通すると思われるものは特に見つかりませんでした。すべてが <p> タグ内に含まれていることだけが共通点ですが、それが何か意味があるかどうかはわかりません。

奇妙だったのは、フォーラムの絵文字へのリンクが含まれていたものです。例えば:
https://www.example.com/images/emoji/twitter/slight_smile.png?v=9


前の投稿で発生したマイグレーションエラーの後に、手動で rake posts:rebake_uncooked_posts を実行している最中(リベイクが正しい処理かどうかはわかりませんが)、以下のエラーが表示されました:

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

その下には読み取れないテキストが多数表示されています。現在も実行中です。

「いいね!」 1

@gerhard S3 への移行後、すべてのカスタムアバターがデフォルトのアバターとして表示されてしまう問題を解決する方法をご存知でしょうか?

S3 では他のすべての表示が正常に動作しています。投稿画像、ユーザーカード、ユーザーの背景画像などです。問題があるのはアバターだけです。元の画像は移行済みで、DB 内でも確認でき、S3 上にもファイルが存在しているようです。つまり、最適化された画像に関する問題のようです。この問題に直面している人は多いようですが、まだ解決策を見つけることができていません :sweat_smile:


更新/編集:

今回は賭けに出ることにし、アバターが機能しないまま移行を完了します。新しいアバターのアップロードは S3 に行われていますが、表示されません :confused:

後で修正できることを願っています。

/logs を確認すると、アバター URL について以下のような記録が見つかりました:

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

しかし、URL にアクセスすると実際にファイルは存在しており、ファイルパスも問題なさそうです。同じ設定(バケット名のみ異なる)の別のインスタンスでも確認したところ、アバターは正常に動作しています。Rails 内のアップロードを確認したところ、パスの形式も他インスタンスと完全に一致しています。

これが何らかの手がかりになることを願っています。

「いいね!」 1

S3 への手動マイグレーションを実行しましたが、同じ結果になりました。S3 バケットに「tombstone」フォルダが見つかったのですが、これは正常ですか?@gerhard

なぜこれらのパスが正しくリマップされないのか:

> 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)
=> []

> Updating the URLs in the database...
> Warning: no type cast defined for type "name" with oid 19. Please cast this type explicitly to TEXT to be safe for future changes.
> Removing old optimized images...
> Flagging all posts containing lightboxes for rebake...
> 10855 posts were flagged for a rebake
> rake aborted!
> FileStore::ToS3MigrationError: 1889 of 6492 uploads are not migrated to S3. 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: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
「いいね!」 1

編集:あなたのエラーは私のものとは異なるようですね。一部の画像が S3 へ移動されなかったのかもしれません。すみません、読み違えていました。もしかしたら、以下の情報の一部はまだ役立つかもしれません。このガイドから S3 アップロードを設定しましたか?Configure an S3 compatible object storage provider for uploads

@evenif - 問題が発生しているとのこと、お気の毒です。この問題に直面している人のためにガイドを書く予定でしたが、必要な情報がスレッドをまたいで散らばっていたため、情報をまとめるのに時間がかかりました。ただし、アバターの修正を待ってからにしようと思っています。上記の通り、私もまだアバターの問題に直面しています。

Rails で以下を実行した場合、true または false のどちらが返されますか?

SiteSetting.migrate_to_new_scheme

false の場合は、以下のように true に設定してみてください。

SiteSetting.migrate_to_new_scheme = true

その後、少し待ってから再度確認してください(15 分ごとに実行されるはずです)。ただし、すぐに実行したい場合は:

Jobs::MigrateUploadScheme.new.execute(nil)

その後、再度 SiteSetting.migrate_to_new_schemefalse になっているか確認してください(完了したことを意味します)。

次に以下を実行します:
Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a

これにより、問題があり移行できていないアップロードが見つかります。私の場合、これらすべてのアップロードは DB にレコードとして存在していましたが、実際の画像は存在していませんでした。

リストのサイズに応じて、ページをコピーして「検索と置換」を行い、アップロード ID のリストから問題のあるレコードを削除するコマンドのリストを作成できます。

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

1、2、3 などをアップロード ID に置き換えてください。作成したリスト全体を Rails にコピー&ペーストして Enter キーを押してください。これで問題のあるレコードが削除されます。

その後、Rails を終了します(exit と入力)。その後、以下のコマンドを実行するだけで済みます。

rake posts:rebake
または
rake posts:rebake_uncooked_posts

uncooked を使用すると、失敗した場合に再構築を再開できます。アップロードが大量にある場合以外は、通常の rebake を使うことをお勧めします。

これですべて正常に動作するはずです。ただし、最適化されたアバターが私の場合のように破損している可能性はありますが、元の画像は S3 に存在するはずです。

デフォルトのアバターが表示されているユーザーに対して Rails で以下を実行し、アバターが正常に移動したか確認できます。
User.find_by_username('username').uploaded_avatar

また、最適化されたバージョンが存在するかどうかは以下で確認できます。
OptimizedImage.where(upload_id: upload_id).where(version: 2)

「いいね!」 3

@markersocial ご協力ありがとうございます。私の問題は、2005 年から S3 サービスを使用し、その後ローカルストレージに移行し、再び S3 ストレージを使用し始めたことに起因しているようです。現在、ローカル画像を S3 にアップロードしようとしたところ、多くの問題が発生しています。私の S3 バケットには /uploads/default が存在しません。

uploads:migrate_to_s3 を実行した後、いくつかの /images/transparent.png が壊れた画像になっていることに気づきました。この rake uploads:recover_from_tombstone を使用すると、

Warning /t/topic/6216/4 のハッシュ値 338c64ada8cbb0fb99bff79e833a4cc492ead00c が正しくなく、正しくは c95e4b7c08702db4593332f29b40ca07fb1d9db1 です。カスタムフィールドに保存されています。‘rake uploads:fix_relative_upload_links’ でこれを修正できます

というメッセージが表示され、その後 rake が中止されました:

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 not found /uploads/files/general/111/cours-offerts.pdf in Post 23033 - /t/certificate-technique-de-soudage-college-mathieu/11060/1

現在は混乱しています。

「いいね!」 2

ああ :confused: その問題は私の理解を超えています。解決策が見つかるか、より詳しい方がコメントしてくれることを願っています。

バケットに /uploads/default がないことについては、それは正常であり、問題の原因ではないと思われます。私のバケット(S3 に移行済みのインスタンスも、最初から S3 を使用しているインスタンスも)も同じ状況です。このスレッドにある埋め込み画像のパスを確認すると、そこにも /uploads/default が含まれていないことがわかります。

「いいね!」 1

私も全く同じ問題に苦しんでいます。

何か解決策は見つかりましたか!?!?

もし見つからなかった場合、何か方法が見つかりましたら、ぜひ共有していただけませんか。大変感謝いたします。

AWS S3 → ローカル → DO Spaces への移行が原因で、同様の問題に遭遇しました。最終的に、Ruby で古い壊れたアップロード URL を、機能する新しい URL フォーマットに手動で置換するコードを書き、問題が解決したようです。

私の場合、最初の移行ではすべてのファイルが DO Spaces に正常に移動しましたが、migrate_to_s3 はそれらを失敗として記録していました。最初は添付ファイルに問題はありませんでしたが、rebuild(rebake)を実行すると添付ファイルが壊れてしまいました。詳細はリンク先のトピックをご覧ください。

「いいね!」 1

私も SMF2 データベースをインポートし、S3 を有効化して rake --trace uploads:migrate_to_s3 を実行した後に、同じエラーが発生しています。

Migrating uploads to S3 for 'default'...
Uploading files to S3...
 - Listing local files
.. => 2244 files
 - Listing S3 files
... => 2383 files
 - Syncing files to S3
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
454 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 7165 of 9554 uploads are not migrated to S3. S3 migration failed for 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 さん、Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a を実行したところ、出力は [] でした。

つまり、私の問題はあなたとは異なるものだと推測されますが、いかがでしょうか?

ipoopfool さん、私もあなたと同じ問題を抱えているかもしれません。この問題を解決した Ruby コードを共有していただけませんか?:blue_heart:

ありがとうございます。

スクリプトを実行すると、以下のエラーが発生します。

NameError: undefined local variable or method `upload_regex' for main:Object
from /var/www/discourse/script/discourse-fix-old-broken-uploads.rb:30:in `update_post_upload_links'

ご助言をお願いします。

投稿が壊れたアップロードを修正するためのコードを共有します。

9月2020日より前の投稿は、オブジェクトストアへの移行と再ベイク後にアップロードが壊れています。アップロードは問題ないようですが、生のURLのフォーマットが間違っていたため、手動で修正しています。

# 注意: この方法で更新しても、投稿に改訂履歴が追加されないようです。念のため、実行前に手動でデータベースのバックアップを作成してください。

# https://rubular.com/
# キャプチャグループ: /uploads/..., sha1ファイル名
upload_regex = /(\/uploads\/[\/\\w]+\/)([0-9a-f]+)\.\w+/

def to_short_name(sha1)
  # Discourse Railsコンソールで実行する必要があります
  Upload.base62_sha1(sha1)
end

# サンリティチェック。すべての投稿を調べて、/uploads/ が何回出現するかを確認できます。
# 次に正規表現マッチを実行して、マッチの数がそれに等しいかどうかを確認します。
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/") # これは壊れています。カウントは文字数のみをカウントします。
    num_regex_match += post.raw.scan(upload_regex).count
  end

  puts "古いアップロードリンクの出現回数のサンリティチェック"
  puts "単純な文字列マッチ " + num_string_match.to_s
  puts "正規表現マッチ " + 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、gsubではないため、添付ファイルを1つずつ順番に置換します
    accumulator.sub(prefix, "upload://").sub(sha1, to_short_name(sha1))
  end

  if post.raw != fixed_raw
    # post.rawを更新すると、再ベイクもトリガーされるようです。しかし、念のため後で完全な再ベイクを実行したいと考えています。
    post.update(raw: fixed_raw)
  end

  puts "投稿ID #{post.id} を更新しました"
end

# 修正している問題は2020-9-5の終わりまで発生しますが、念のため数日追加します。
posts = Post.where("created_at < ?", Date.new(2020,9,7))

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

別の人がコメントしました

私のシナリオでは、upload_regex 変数はローカルではなくグローバルである必要があります。したがって、upload_regex$upload_regex に変更する必要があります。