S3/spaces의 이미지 외 업로드를 로컬로 마이그레이션

다음 페이지를 읽었습니다:

그래서 lib/taks/uploads.rake:migrate_from_s3를 살펴보니 다음과 같은 코드가 있었습니다:

    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")

하지만 비디오 업로드에는 upload:// 유사 프로토콜이 붙지 않고, 대신 스토리지 제공업체(제 경우 Digital Ocean Spaces)로 직접 연결되는 리터럴 링크가 생성된다는 것을 알게 되었습니다.

이 작업을 성공적으로 수행하려면 이 태스크를 수정해야 할 것 같습니다.

아마존에 대한 리터럴 참조 대신, 또는 그와 함께 SiteSetting.s3_endpoint와 SiteSetting.s3_upload_bucket을 확인하는 것이 더 합리적인 방법일까요?

태스크에 대한 테스트가 있나요? 보이지 않네요. 명백한 수정 사항이 될 수 있는 것이 하나 있긴 하지만, 기존 테스트를 보완할 방법이 없고, 파괴적이지 않게 테스트할 쉬운 방법도 없습니다. 그래서 불안하네요…

index 0761c4712a..63f49155f3 100644
--- a/lib/tasks/uploads.rake
+++ b/lib/tasks/uploads.rake
@@ -129,12 +129,12 @@ def migrate_from_s3
 
   Post
     .where("user_id > 0")
-    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
+    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%#{SiteSetting.Upload.absolute_base_url}%' OR raw LIKE '%(upload://%'")
     .find_each do |post|
     begin
       updated = false
 
-      post.raw.gsub!(/(\/\/[\w.-]+amazonaws\.com\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
+      post.raw.gsub!(/(\/\/[\w.-]+(amazonaws\.com|#{Regexp.quote(SiteSetting.s3_endpoint)})\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
         begin
           if filename = guess_filename(url, post.raw)
             file = FileHelper.download("http:#{url}", max_file_size: max_file_size, tmp_file_name: "from_s3", follow_redirect: true)

또한, 경험상 모든 이미지가 이미 최적화되었음에도 불구하고, 파일을 이동하는 동안 50GB(원본+최적화 파일 총 96GB)의 모든 이미지를 다시 최적화해야 한다고 판단하여 10일 동안 그 작업을 수행할 것 같고, 그 동안 우리 사이트 전체의 이메일 알림이 꺼질 것 같습니다. 좋은 테스트 방법이 없어서, 그것이 사실인지 여부에 대해 질문했습니다. 만약 사실이라면, 이미 최적화된 이미지를 단순히 복사하는 우회 방법이 있는지 알고 싶습니다.

MinIO Client를 사용하여 모든 파일을 로컬 시스템으로 쉽게 복사할 수 있습니다. 모든 이미지를 다시 최적화하지 않고 파일을 제자리에 놓고 데이터베이스를 새 위치를 가리키도록 수정하는 것이 얼마나 어려운지 궁금합니다…

아직 테스트해 보지는 않았지만, 적어도 메타 포스트로만 올리는 것이 아니라 PR로 공유했다는 점이 좋습니다.

실제 마이그레이션 프로세스를 통해 검증된 관련 수정 사항이 담긴 새로운 PR