Migrate_to_S3 échoue lors de la rebake

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 « J'aime »

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 « J'aime »

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 « J'aime »

Je rencontre le même problème : sur un total de 49 595 publications, seulement 17 sont responsables de l’arrêt du 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)

Je ne suis pas sûr de ce que je devrais rechercher dans la sortie de la commande Rails ci-dessus @gerhard — auriez-vous quelques pistes pour m’aider ?

Je rencontre la même erreur en raison de 3 publications :confused:

Mise à jour des URL dans la base de données...
Avertissement : aucun cast de type défini pour le type "name" avec l'oid 19. Veuillez caster explicitement ce type en TEXT pour être sûr en cas de modifications futures.
Suppression des anciennes images optimisées...
Marquage de toutes les publications contenant des lightboxes pour une nouvelle cuisson...
123456 publications ont été marquées pour une nouvelle cuisson
rake aborted !
FileStore::ToS3MigrationError : 3 publications n'ont pas été mappées vers la nouvelle URL de téléchargement S3. La migration S3 a échoué pour la base de données '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>'
Tâches : TOP => uploads:migrate_to_s3
(Voir la trace complète en exécutant la tâche avec --trace)

@gerhard - Si nous obtenons une erreur comme celle-ci, savez-vous si cela signifie “succès ! - sauf pour 3 publications” ou “échec majeur de la migration, à cause de 3 publications” ?

Pour tenter de reprendre, devrais-je exécuter à nouveau rake posts:rebake, rake posts:rebake_uncooked_posts ou rake uploads:migrate_to_s3 ?

Je vous serais reconnaissant de toute aide :slight_smile:

En exécutant cela, je ne vois rien qui semble commun à toutes ces publications. Le seul point commun est qu’elles sont toutes contenues dans des balises <p>, si cela a une signification.

Une chose étrange était la présence d’un lien vers un emoji du forum. Par exemple :
https://www.example.com/images/emoji/twitter/slight_smile.png?v=9


Lors de l’exécution manuelle de rake posts:rebake_uncooked_posts après l’erreur de migration mentionnée dans mon message précédent (je ne suis pas sûr que rebake soit la bonne action à entreprendre), cette erreur est apparue :

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

Suivie d’un tas de texte illisible. Cela continue de s’exécuter pour le moment.

1 « J'aime »

@gerhard As-tu une idée de la façon de résoudre le problème où tous les avatars personnalisés s’affichent comme des avatars par défaut après la migration vers S3 ?

Tout le reste s’affiche parfaitement sur S3 : images des publications, cartes utilisateur, images d’arrière-plan des utilisateurs. Seuls les avatars ne s’affichent pas. Il semble que les avatars d’origine aient bien été migrés : on peut les voir dans la base de données et les fichiers existent sur S3. Le problème semble donc concerner uniquement les versions optimisées. J’ai remarqué que beaucoup de personnes ont rencontré ce problème, mais je n’ai pas encore trouvé de solution. :sweat_smile:


Mise à jour / Édition :

Je vais donc tenter ma chance et terminer la migration sans que les avatars ne fonctionnent. Les nouveaux avatars téléchargés sont bien envoyés vers S3, mais ils ne s’affichent pas non plus :confused:

J’espère que cela pourra être corrigé ultérieurement.

En consultant les journaux (/logs), je vois des enregistrements comme celui-ci pour les URL des avatars :

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

Le fichier existe pourtant si je visite l’URL, et le chemin semble correct. J’ai une autre instance avec les mêmes paramètres (la seule différence étant le nom du bucket), et les avatars y fonctionnent très bien. Le chemin est également au format identique sur cette autre instance (d’après la recherche des téléchargements dans Rails).

J’espère que cela nous donnera un indice sur ce qui se passe.

1 « J'aime »

J’ai lancé une migration manuelle vers S3 et j’obtiens le même résultat, mais je trouve un dossier tombstone dans le bucket S3. Est-ce normal @gerhard ?

Pourquoi ces chemins ne sont-ils pas correctement remappés :

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

> Mise à jour des URL dans la base de données...
> Avertissement : aucun cast de type défini pour le type "name" avec l'oid 19. Veuillez caster explicitement ce type en TEXT pour être sûr face aux changements futurs.
> Suppression des anciennes images optimisées...
> Marquage de tous les posts contenant des lightboxes pour une rebake...
> 10855 posts ont été marqués pour une rebake
> rake aborted !
> FileStore::ToS3MigrationError : 1889 sur 6492 uploads n'ont pas été migrés vers S3. La migration S3 a échoué pour la base de données '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 « J'aime »

Édition : Il semble que votre erreur soit différente de la mienne ; il semblerait que certaines de vos images n’aient pas été transférées vers S3. Désolé, je me suis trompé de lecture. Peut-être que certaines informations ci-dessous sont toujours utiles. Avez-vous configuré vos uploads S3 en suivant ce guide ? Configure an S3 compatible object storage provider for uploads

@evenif - Désolé d’apprendre que vous rencontrez des problèmes avec cela. Je comptais rédiger un guide à ce sujet pour les personnes confrontées aux mêmes difficultés, car il a fallu assembler pas mal d’informations provenant de différents fils de discussion. Mais j’attends d’espérer que les avatars soient corrigés, car comme vous pouvez le voir ci-dessus, je rencontre toujours des problèmes à ce sujet.

Si vous exécutez ceci dans Rails, obtenez-vous true ou false ?

SiteSetting.migrate_to_new_scheme

Si c’est false, vous pouvez essayer de le définir sur true ainsi :

SiteSetting.migrate_to_new_scheme = true

Ensuite, soit attendez un moment et revenez plus tard (je crois que cela s’exécute toutes les 15 minutes, si ma mémoire est bonne), mais si vous voulez l’exécuter immédiatement :

Jobs::MigrateUploadScheme.new.execute(nil)

Ensuite, vérifiez à nouveau plus tard si SiteSetting.migrate_to_new_scheme est maintenant false (cela signifie que cela devrait être terminé).

Ensuite, exécutez :
Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a

Cela devrait trouver les uploads qui posent toujours problème et qui n’ont pas pu être migrés. Dans mon cas, tous ces uploads existaient en tant qu’enregistrements dans la base de données, mais les images elles-mêmes n’existaient pas.

Selon la taille de la liste, vous pouvez copier la page, puis utiliser la fonction Rechercher et Remplacer pour créer une liste de commandes afin de supprimer ces enregistrements problématiques à l’aide des IDs d’upload.

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

En remplaçant 1, 2, 3, etc., par les IDs d’upload. Copiez et collez la liste entière dans Rails et appuyez sur Entrée. Cela devrait supprimer ces enregistrements problématiques.

Ensuite, quittez Rails (tapez exit) et tout ce que vous aurez à faire sera d’exécuter :

rake posts:rebake
ou
rake posts:rebake_uncooked_posts

L’option uncooked vous permet de reprendre le rebake en cas d’échec. Je recommande d’utiliser le rebake normal sauf si vous avez des milliers d’uploads.

Ensuite, tout devrait fonctionner correctement, espérons-le. Mais il y a de fortes chances que vos avatars optimisés soient cassés comme les miens, mais les versions originales devraient exister sur S3.

Vous pouvez vérifier si les avatars ont été transférés avec succès (du moins pour certains utilisateurs) en exécutant ceci dans Rails pour un utilisateur qui affiche un avatar par défaut :
User.find_by_username('username').uploaded_avatar

Vous pouvez également vérifier si les versions optimisées existent en utilisant ceci :
OptimizedImage.where(upload_id: upload_id).where(version: 2)

3 « J'aime »

@markersocial Merci pour votre aide. Je pense que mon problème vient du fait que j’ai utilisé le service S3 auparavant (depuis 2005), puis le stockage local, et à nouveau S3. Maintenant, lorsque je souhaite uploader mes images locales vers S3, cela cause beaucoup de problèmes. Mon bucket S3 ne contient pas /uploads/default.

Après avoir exécuté uploads:migrate_to_s3, j’ai constaté que certaines images /images/transparent.png étaient brisées. Lorsque j’utilise la commande rake uploads:recover_from_tombstone

j’obtiens :

Warning /t/topic/6216/4 had an incorrect 338c64ada8cbb0fb99bff79e833a4cc492ead00c should be c95e4b7c08702db4593332f29b40ca07fb1d9db1 storing in custom field ‘rake uploads:fix_relative_upload_links’ can fix this

Ensuite, rake a été interrompu avec :

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

Je suis maintenant confus.

2 « J'aime »

Ah :confused: Ce problème dépasse ma compréhension, j’espère que vous pourrez trouver un moyen de le résoudre ou qu’une personne plus compétente pourra intervenir.

Concernant l’absence de /uploads/default dans votre bucket, je pense que c’est normal et que ce n’est pas le problème. C’est le même cas pour mes buckets (sur les deux instances qui ont migré vers S3 et les instances qui utilisent S3 depuis le premier jour). Vous pouvez vérifier le chemin de votre image intégrée dans ce fil de discussion et constater que le chemin ne contient pas non plus /uploads/default.

1 « J'aime »

Je souffre moi aussi du même problème exact.

Avez-vous par hasard trouvé au moins une solution !!!???

Si ce n’est pas le cas, je vous prie de bien vouloir me partager toute solution que vous pourriez éventuellement trouver. Je vous en serais très reconnaissant.

J’ai rencontré un problème similaire, probablement dû à une migration de AWS S3 → local → DO Spaces. J’ai fini par écrire du code Ruby pour remplacer manuellement les anciennes URLs de téléchargement cassées par le nouveau format fonctionnel, et cela semble avoir résolu mon problème.

Dans mon cas, tous les fichiers avaient été déplacés avec succès vers DO Spaces lors de ma première migration, mais migrate_to_s3 les avait enregistrés comme des échecs. Cela n’a pas immédiatement cassé les pièces jointes, mais l’exécution d’un rebake les a rendues inaccessibles. Plus de détails dans le sujet lié.

1 « J'aime »

Je rencontre également cette erreur après avoir importé une base de données smf2, activé S3 et exécuté rake --trace uploads:migrate_to_s3

Migration des fichiers vers S3 pour 'default'...
Téléchargement des fichiers vers S3...
 - Répertorier les fichiers locaux
.. => 2244 fichiers
 - Répertorier les fichiers S3
... => 2383 fichiers
 - Synchronisation des fichiers vers S3
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mise à jour des URLs dans la base de données...
Suppression des anciennes images optimisées...
Marquage de tous les posts contenant des lightboxes pour une régénération...
454 posts ont été marqués pour une régénération
rake aborted !
FileStore::ToS3MigrationError : 7165 des 9554 uploads n'ont pas été migrés vers S3. La migration S3 a échoué pour la base de données '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>'
Tâches : TOP => uploads:migrate_to_s3

markersocial, lorsque j’exécute Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/uploads/default/original/_X/%'").to_a, la sortie est [].

Je suppose que cela signifie que mon problème est différent du vôtre ?

ipoopfool, je pense que je rencontre le même problème que vous. Pourriez-vous partager votre code Ruby qui a résolu cela pour vous ? :blue_heart:

Merci.

Lorsque j’exécute le script, j’obtiens cette erreur :

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'

Des suggestions ?

Désolé pour le déterrage, je supprime le lien que j’avais partagé précédemment, alors j’ai pensé copier-coller le code directement ici

Les publications d'avant septembre 2020 ont des téléchargements cassés après la migration vers les magasins d'objets et le re-cuisson. Il semble que les téléchargements soient corrects, les URL dans le brut étaient juste mal formatées, je les corrige donc manuellement.

# Remarque : une mise à jour de cette manière ne semble pas ajouter d'historique de révision aux publications. Faites une sauvegarde manuelle de la base de données avant d'exécuter, juste au cas où.

# https://rubular.com/
# Groupes de capture : /uploads/..., nom de fichier sha1

upload_regex = /(\/uploads\/[\/\\w]+\/)([0-9a-f]+)\.\w+/


def to_short_name(sha1)
  # NÉCESSITE L'EXÉCUTION DANS LA CONSOLE RAILS DE DISCOURSE
  Upload.base62_sha1(sha1)
end

# Une vérification de bon sens. Vous pouvez parcourir toutes les publications et extraire le nombre de fois où /uploads/ apparaît.
# puis exécutez la correspondance d'expression régulière pour voir si le nombre de correspondances lui est égal.
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/") # CECI EST CASSÉ. LE COMPTE NE FONCTIONNE QUE POUR LES CARACTÈRES.
    num_regex_match += post.raw.scan(upload_regex).count
  end

  puts "Vérification du nombre d'anciennes liens de téléchargement qui apparaissent"
  puts "Correspondances de chaînes simples " + num_string_match.to_s
  puts "Correspondances d'expressions régulières " + 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, pas gsub, donc nous remplaçons séquentiellement chaque pièce jointe une par une
    accumulator.sub(prefix, "upload://").sub(sha1, to_short_name(sha1))
  end

  if post.raw != fixed_raw
    # La mise à jour de post.raw semble également déclencher une re-cuisson. Mais je veux toujours faire une re-cuisson complète plus tard par mesure de sécurité.
    post.update(raw: fixed_raw)
  end

  puts "Publication mise à jour id #{post.id}"
end

# Le problème que je corrige se produit jusqu'à la fin du 2020-9-5, mais j'ajouterai quelques jours supplémentaires par mesure de sécurité.
posts = Post.where("created_at < ?", Date.new(2020,9,7))

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

Et une autre personne a commenté

Dans mon scénario, la variable upload_regex doit être globale, pas locale. Donc, upload_regex doit être changé en $upload_regex.