ToS3MigrationError: 업로드가 S3로 마이그레이션되지 않아 첨부 파일이 손상되었습니다. 이 오류를 수정하는 방법은?

FileStore::ToS3MigrationError: 21,512개 업로드 중 182개가 S3로 마이그레이션되지 않았습니다. ‘default’ DB의 S3 마이그레이션에 실패했습니다.

‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, 'block in migrate_to_s3_all_sites’에서 발생한 스택 트레이스 일부

uploads:migrate_to_s3 태스크를 실행할 때 이 오류를 두 번 마주쳤습니다. 파일의 약 1%가 성공적으로 마이그레이션되지 않아, rebake 후 사이트에서 첨부 파일 링크가 깨졌습니다. 모두 이 Discourse 인스턴스를 처음 생성한 초기 몇 달 동안의 오래된 파일인 것 같습니다.

S3 버킷을 조사해 보니 파일은 S3에 성공적으로 업로드된 것으로 보이지만, rebake 이후 링크가 올바르게 연결되지 않은 상태입니다.


어떤 이유인지 모르겠지만, 재실행(또 다른 rebake 전)을 통해 문제가 해결된 것처럼 보입니다. migrate_to_s3 태스크 실행 중에는 동일한 오류가 여전히 발생합니다.

하지만 rebake를 다시 실행하면 첨부 파일 링크가 다시 깨집니다.

이것들은 오류가 아니라고 생각하지만, rebake 중 출력 내용을 포함하겠습니다.

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

rake posts:missing_uploads 또는 PostCustomField.where(name: Post::MISSING_UPLOADS)를 실행해도 문제가 나타나지 않으므로, 이는 무관한 것으로 보입니다.

제 문제는 이 이슈와 관련이 있을 수 있습니다: Migrate_to_S3 Fails on Rebake - #12 by evenif

무엇을 알게 되는지 확인해 보고, 이 이슈를 닫고 대화를 저기로 옮길 수도 있습니다.

이전부터 깨져 있던 첨부 파일/업로드 항목은 게시글의 원시 텍스트(raw text)에서 [{file name}|attachment](/uploads/default/original/2X/6/{sha1 hash + extension}) 형태로 표시됩니다. 이는 href="/uploads/default/original/2X/6/{sha1 hash + extension}"로 변환(cooked)되며, 이미지에는 문제가 없지만 파일 첨부 기능을 깨뜨립니다.

나중에 정상 작동하던 첨부 파일은 [{file name}|attachment](upload://{sha1 to base62 + extension}) 형태로 나타나며, href="/uploads/short-url/{sha1 to base62 + extension}로 변환됩니다.

저는 문제 발생 시기의 모든 게시글을 순회하며 모든 구식 업로드 URL을 최신 버전으로 교체하는 작은 Ruby 코드를 작성했습니다. Upload 모델의 base62_sha1 함수를 활용하여 sha1 해시를 Discourse의 짧은 URL(short url)이 기대하는 파일 이름으로 변환했습니다.

이로써 첨부 파일이 정상 작동하게 되었습니다. 이후 수정 사항을 확인하기 위해 다시 한 번 rebake를 실행했는데, 여전히 정상적으로 작동하는 것으로 보입니다. 문제는 단순히 Post.raw에 존재했을 뿐, Upload와는 무관했던 것 같습니다.