복원 후 깨진 링크와 자산 수정 또는 정리

서버가 충돌하여 새 서버를 생성하고 백업에서 복원해야 했습니다. 그 과정은 정말 고생스러웠습니다. 무슨 일이 있었고 어떻게 복원했는지에 대한 세부 사항은 여기 있습니다.

복원 후(S3 업로드를 비활성화하는 것이 핵심이었습니다), 게시물 내 첨부 파일에 대한 모든 링크가 깨졌습니다(404 오류). 포럼을 검색해 보았지만 해결책을 찾을 수 없어 누군가 올바른 방향으로 안내해 주기를 바랍니다.

저에게는 두 가지 옵션이 있습니다.

  1. 게시물에 내장된 첨부 파일로 연결되는 이 깨진 short-url 링크를 수정할 수 있을까요? (깨진 링크는 모두 게시물 내 첨부 파일에 대한 것이며, 내장된 이미지는 정상적으로 렌더링되고, 다른 내부 링크도 정상 작동합니다).

예를 들어, 포럼 게시물에서 첨부 파일의 URL은 https://XYZ.com/uploads/short-url/phu1HOLvkE8LWpkKYfnMPSWsvHh.zip으로 표시됩니다. 게시물에서 첨부 파일 링크를 클릭할 때(404로 이어짐) 로그에서 확인되는 내용은 다음과 같습니다.

Message (5 copies reported)

Failed to process hijacked response correctly : Errno::ENOENT : No such file or directory @ rb_sysopen - /XXXXX.s3.dualstack.us-east-1.amazonaws.com/optimized/1X/46728e07f9819907d1b18387bf02ea7fc25c7981_2_32x32.ico

Backtrace

/var/www/discourse/app/controllers/static_controller.rb:160:in read' /var/www/discourse/app/controllers/static_controller.rb:160:in block (2 levels) in favicon’
/var/www/discourse/lib/distributed_memoizer.rb:16:in block in memoize' /var/www/discourse/lib/distributed_mutex.rb:33:in block in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:29:in synchronize' /var/www/discourse/lib/distributed_mutex.rb:29:in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:14:in synchronize' /var/www/discourse/lib/distributed_memoizer.rb:12:in memoize’
/var/www/discourse/app/controllers/static_controller.rb:138:in block in favicon' /var/www/discourse/lib/hijack.rb:56:in instance_eval’

백업에서 서버를 복원할 때 S3 업로드 옵션을 비활성화한 후에도 이 short-url 링크를 수정할 수 있는 방법이 있기를 정말로 희망합니다. 게시물 재베이킹(re-bake)은 문제를 해결하지 못했습니다.

  1. 만약 어떤 이유로든 이것이 해결 불가능한 사각지대이고 일괄적으로 수정할 수 없다면, 현재 S3 클라우드에 수천 개의 고아(orphaned) 첨부 파일이 남아 있습니다. 이들을 정리하고 공간을 확보할 수 있는 방법이 있을까요? Discourse가 S3 업로드 버킷을 스캔하여 모든 고아 자산(orphaned assets)을 삭제할 수 있는 방법이 있을까요?

그 링크들을 어떻게 수정해야 하는지 알아내는 것이 가능했을 수도 있지만, 포럼에서 실현 가능한 범위 내에서 해결 방법을 파악하는 것은 불가능합니다.

Upload.sha1_from_short_url('phu1HOLvkE8LWpkKYfnMPSWsvHh.zip')
=> "b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7"

업로드 폴더나 S3 버킷 어딘가에 b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7.zip라는 이름의 파일이 있는지 확인해 보세요. 만약 해당 파일이 있다면, 쉬운 작업은 아니지만 문제를 수정할 수 있을 것입니다.

실제 포럼 이름이나 버킷 이름을 포함하지 않으셨기 때문에, 여기서 정확한 판단을 내릴 수 없습니다.

네, 다음 경로에서 찾았습니다:

original/2X/b/b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7.zip

링크/상세 정보를 개인 메시지로 보내드릴 수 있습니다.

재미있는 점은 첨부 파일(예: 파일)만 깨져 있다는 것입니다. 임베드된 이미지는 모두 정상적으로 표시됩니다.

그럼 자료는 모두 있는 거고, 이제 게시글을 어떻게 다시 작성해야 하는 문제만 남았네요. 왜 안 되는지는 모르겠지만, 파일들은 존재합니다.

콘솔이나 UI에서 일괄적으로 실행하거나, S3에서 이 파일들을 로컬로 "다운로드"하는 방법이 있나요?

그렇다고 생각합니다. 다만, discourse와 rails에 익숙한 사람이 작성해야 할 것 같습니다. 질문자님의 문제에 대한 기존 솔루션은 제가 알기로는 없습니다. S3 버킷 간 이동에 관한 몇 가지 주제들이 힌트를 줄 수 있을지 모르지만, 질문자님의 특정 문제는 이전에 해결된 적이 없다고 생각합니다.

복원 후 S3 업로드 옵션을 다시 활성화하셨어야 합니다. 그걸 하지 않으신 것 같네요?

그리고 app.yml에 설정되어 있을 수 있어서 어렵습니다.

그렇게 하면 문제가 해결될까요? 시도해 보는 것이 안전한지 궁금해서요.

음, 네, 처음부터 제가 추천드린 방법이잖아요…
S3 업로드를 다시 활성화하지 않으면 short-url 함수가 해당 업로드를 로컬에서 찾으려 하지만, 실제로는 S3에 올라가 있는 상태입니다.

한 번 시도해 보겠지만, 다른 한편으로 이 기능을 활성화했을 때 복원이 깨지는 문제가 있었습니다(제 다른 토픽 참고). 제이(Jay)의 도움으로 업로드를 비활성화하는 방법을 찾아내야 겨우 복원할 수 있었습니다. 이 옵션을 활성화한 상태에서 서버를 성공적으로 복원해 보신 적이 있으신가요?

다음 단계를 수행해야 합니다.

  • 설정 비활성화
  • 복원
  • 설정 활성화

지난주 PM(개인 메시지)에서 설명드린 대로입니다.