3.3.0beta1 업데이트 후 커스텀 아바타가 사라졌습니다

안녕하세요,

최근 테스트 포럼을 3.3.0beta1로 업데이트했습니다. 이 테스트 포럼은 운영 중인 포럼의 내용을 기반으로 하되, 일부 구형 상태를 유지하고 있는 복사본입니다. 업데이트와 새 기능을 테스트하는 용도로 사용하며, 업로드에는 운영 포럼과 동일한 Amazon S3 연결을 사용합니다.

호스트 OS를 최신 Ubuntu 24.04. LTS로 업데이트하고 포럼을 3.3.0beta1로 업데이트한 후, 모든 사용자 지정 아바타가 사라지고 흰색/회색 머리 이미지가 표시되고 있습니다.

로그를 확인해 보니 다음과 같은 메시지가 발견되었습니다:

Could not find file in the store located at url: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/6/9/69ca9110f27d91561axyz52a9cd9485a970fe9.jpeg

하지만 실제로 해당 URL에는 이미지가 존재하며 정상적으로 작동합니다. 서버에서 파일을 wget으로 받아와서 DNS 문제나 로컬 아바타 프록시가 파일을 가져오는 것을 방해할 수 있는 기타 문제가 있는지 확인해 보았지만, 그런 문제도 아닌 것으로 확인되었습니다.

여기서 무슨 일이 일어나고 있는지 혹시 아시는 분이 있을까요?

테스트 포럼뿐만 아니라 라이브 포럼에서도 동일한 로그 오류와 함께 아바타가 조각조각 사라지는 현상이 발생하고 있는 것 같습니다.

테스트 포럼이 s3 버킷에 예상하지 못한 항목들을 정리하고 있는 건 아닌지 의문이 듭니다. 하지만 버킷에 해당 항목들이 있다고 하셨으니, 그 문제는 아닌 것 같네요. 테스트 환경에 데이터베이스를 복원한 후 uploads 모델에 무엇이 있는지 확인해 보세요.

문제는 로그의 오류 메시지가 특정 이미지를 로드할 수 없다고 표시하고 있지만, 해당 이미지는 실제로 존재한다는 점입니다. 그래서 아마도 포럼/아바타 프록시가 이미지를 가져오는 것을 막고 있는 무언가가 있는 것 같습니다.

테스트 서버(3.3.0beta1 실행 중)에 새로운 아바타 이미지를 업로드했습니다. 업로드 자체는 성공했고 미리보기에도 표시되었지만, 다시 로드하지 못했습니다.

/var/www/discourse/app/models/optimized_image.rb:81:in `block in create_for' 
/var/www/discourse/app/models/optimized_image.rb:19:in `block (2 levels) in lock' 
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize' 
/var/www/discourse/app/models/optimized_image.rb:19:in `block in lock' 
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize' 
/var/www/discourse/app/models/optimized_image.rb:18:in `lock' 
/var/www/discourse/app/models/optimized_image.rb:73:in `create_for' 
/var/www/discourse/app/models/upload.rb:130:in `get_optimized_image' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:218:in `get_optimized_image' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:136:in `show_in_site' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:89:in `block (2 levels) in show' 
/var/www/discourse/lib/hijack.rb:64:in `instance_eval' 
/var/www/discourse/lib/hijack.rb:64:in `block in hijack' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve' 
/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work' 
rails_multisite-5.0.1/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-5.0.1/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work' 
/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread' 

이것은 로그에서 가져온 내용입니다.

해당 로그 메시지는 다음과 같습니다:

Could not find file in the store located at url: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/0/2/02832e36e27bbad791fda46e2290df31e5ee2dda.jpeg

(URL을 수정하여 실제 URL은 작동하지만 위 URL은 작동하지 않도록 했습니다)

‘block in hijack’ 부분이 가장 의아합니다.

실제 시스템은 Cloudflare 뒤에 실행되고 있습니다. 테스트 시스템은 “DNS only” 설정이므로 당연히 Cloudflare를 통해 필터링되지 않습니다. 최근 메인 사이트에서 봇 관련 문제가 있어 Cloudflare 필터를 꽤 많이 조정해 보았습니다.

그런데 amazonaws.com URL에서 가져오는 것이 왜 문제가 되며, 게다가 테스트 사이트는 Cloudflare를 전혀 거치지 않고 실행되고 있습니다.

솔직히 지금은 좀 혼란스럽습니다.

그 문제로 정말 막혀 있습니다. 라이브 포럼과 테스트 포럼 모두에 영향을 미치는 것 같습니다. 라이브는 아직 이전 버전을 사용 중이며, 문제는 업데이트로 인해 시작된 것이 아니라 몇 일 전 아무런 눈에 띄는 변경 사항 없이 갑자기 발생한 것으로 보입니다.

즉, Discourse는 새로운 사용자 지정 아바타를 S3에 올바르게 업로드하고, 제가 볼 수 있는 한 ACL도 올바르게 설정하며, Discourse가 아바타 프록시로 가져오려고 사용하는 URL을 통해 파일도 공개적으로 접근 가능합니다. 그럼에도 불구하고 가져오는 데 실패합니다(위 스택 트레이스 참조).

아바타 프록시가 어떻게 작동하는지에 대해 잘 아시는 분이 이 문제에 대해 아이디어를 주실 수 있거나, 해당 스택 트레이스에서 어떤 정보를 추출해 내실 수 있을까요?

서버에서 이미지 URL에 대해 wget을 실행해 보았는데 모두 정상적으로 작동합니다. 따라서 해당 URL 접근을 차단하는 요인은 없는 것으로 보입니다.

브라우저에서 가져올 수 있나요?

아 네, 명확하지 않아서 죄송합니다. 브라우저에서 접근할 수 있습니다(따라서 공개적으로 사용 가능하다고 가정했습니다) 그리고 서버에서도 접근할 수 있습니다(서버가 이를 가져오는 데 문제가 있는 것을 배제하기 위함입니다). 실제로는 어떤 이유에서인지 Discourse가 이를 가져오지 못하는 것뿐입니다(위 스택 트레이스를 참조하세요).

문제를 해결하셨나요? 저희도 버전 3.2.1에서 정확히 동일한 문제를 겪고 있습니다. 버킷의 모든 공개 접근이 차단되어 있음에도 불구하고, 사전 서명된 URL(Presigned URL)을 통해 여전히 작동하고 있었습니다. 그런데 이제 정확히 동일한 오류가 발생합니다:

Could not find file in the store located at url: