S3로 업로드를 마이그레이션할 수 없습니다

안녕하세요, Backblaze에 업로드 호스팅을 설정했습니다 (S3 설정 사용).
x-amz-checksum-crc32 헤더 수정 후 새 업로드는 정상적으로 작동하지만, uploads:migrate_to_s3로 기존 업로드를 마이그레이션하려고 하면 즉시 실패합니다.

이것은 최신 Discourse 버전(3.5.0.beta5-dev)에서 발생하는 문제입니다.
전체 출력은 다음과 같습니다:

root@goactuary-app:/var/www/discourse# rake uploads:migrate_to_s3 --trace                                                                                                                  
** Invoke uploads:migrate_to_s3 (first_time)                                                                                                                                               
** Invoke environment (first_time)                                                                                                                                                         
** Execute environment                                                                                                                                                                     
** Execute uploads:migrate_to_s3                                                                                                                                                           
Please note that migrating to S3 is currently not reversible!                                                                                                                              
[CTRL+c] to cancel, [ENTER] to continue                                                                                                                                                    
                                                                                                                                                                                           
Migrating uploads to S3 for 'default'...
Some uploads were not migrated to the new scheme. Running the migration, this may take a while...
rake aborted!                                                                                                                                                                              
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'       
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'                                                                                                                       
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'                                                                                                                           
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'                                                                                                        
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'                                                                                                                 
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'                                                                                                                         
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke' 
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load' 
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

업로드용 S3 호환 객체 스토리지 제공자 구성에 설명된 대로 app.yml에 해당 설정을 입력해야 합니다.

Backblaze와 호환되는 버전으로 aws 라이브러리를 되돌리는 코드를 app.yml에 추가했다는 뜻인가요?

네, app.yml에 추가했고 앱을 다시 빌드했습니다.
새로 업로드된 파일이 해당 위치로 전송되는 것을 확인했습니다.

그렇지 않습니다. 다음 환경 변수를 사용했습니다:

  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

이 설정 덕분에 설정 변경 후 새 파일을 업로드할 수 없었던 문제가 해결되었습니다.

이것들을 직접 찾아야 할 가능성이 높습니다.

Rails에서는 다음을 사용할 수 있습니다.

 Upload.pluck(:url)

그런 다음 어떤 업로드가 문제인지 확인하면 됩니다.

제 경험상으로는 그것이 충분하지 않았던 것 같습니다. 하지만 귀하에게는 작동한다고 하시네요.

컨테이너에서 aws gem을 수동으로 다운그레이드했을 때 uploads:migrate_to_s3 작업이 실제로 이미지를 업로드하는 것으로 확인되었습니다. 즉, 지적해 주셨듯이 환경 변수만으로는 충분하지 않았던 것입니다.

그러나 프로세스는 나중에 다른 지점에서 실패했습니다:

FileStore::ToS3MigrationError: 2 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'. (FileStore::ToS3MigrationError)

이것은 별도의 문제 해결 모험이 될 것입니다.

그 이유는 로컬 게시물에 대한 onebox가 하나 있는 것일 수 있습니다. 이 주제에 대해 토픽을 만들긴 했지만, 세부 사항을 정확히 기억하지는 못합니다.

단 2개뿐이라면 무시해도 될 수 있지만, Rails를 사용하면 새 버킷이 포함되지 않은 모든 업로드를 찾을 수 있습니다. 아마도 비어 있을 것입니다?

기다려야 하는 문제는 cooked post에 예상치 못한 경로가 있는 2개의 게시물이 있다는 것입니다.

찾았어요!
Discourse onebox 링크가 포함된 백업은 복원할 수 없음

수정: 로컬 onebox가 있는 2개의 게시물이 있는 것 같습니다. 해당 게시물을 찾아서 다시 bake(처리)하면 될 것 같습니다.

@stanski 이 방법으로 문제가 해결되었나요?

죄송합니다. 다른 일에 정신이 팔려 업데이트를 깜빡했습니다.
모든 게시물을 다시 처리(rebake)한 후, 마이그레이션을 다시 시도했을 때 다른 오류 메시지가 나타났습니다.
불행히도 이제 백트레이스를 찾을 수 없습니다.

오류가 발생했음에도 불구하고 업로드된 파일이 Backblaze로 마이그레이션되고 게시물이 업데이트된 것으로 보였습니다.
로컬 업로드 파일을 아카이브로 이동한 후 다른 곳으로 옮겼고, 그 이후로 불평을 듣지 못했습니다.

결론적으로, 제 문제는 해결되었습니다.
계속해서 조언을 주신 @pfaffman님께 감사드립니다.

이제 Backblaze 호스팅 업로드가 여러 방화벽에 의해 차단된다는 불만이 있지만, 그것은 별개의 문제입니다.

정말 CDN을 사용해야 한다고 생각합니다.