이미지 최적화 실패: 원인 불명

여러분 안녕하세요 :wave:

우리는 최근 포럼 중 하나를 하나의 서버에서 다른 서버로 마이그레이션하면서 도메인도 동시에 변경했습니다.

새 설치 환경에서 로그에 이러한 오류가 많이 발생하고 있습니다.

lib/discourse.rb:810:in `block in warn'
lib/discourse.rb:804:in `each'
lib/discourse.rb:804:in `warn'
/var/www/discourse/app/models/optimized_image.rb:329:in `rescue in convert_with'
/var/www/discourse/app/models/optimized_image.rb:311:in `convert_with'
/var/www/discourse/app/models/optimized_image.rb:305:in `optimize'
/var/www/discourse/app/models/optimized_image.rb:289:in `resize'
/var/www/discourse/app/models/optimized_image.rb:97:in `block in create_for'
/var/www/discourse/app/models/optimized_image.rb:19:in `block in lock'
/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/app/models/optimized_image.rb:18:in `lock'
/var/www/discourse/app/models/optimized_image.rb:68:in `create_for'
/var/www/discourse/app/models/upload.rb:167:in `rescue in get_optimized_image'
/var/www/discourse/app/models/upload.rb:161:in `get_optimized_image'
/var/www/discourse/app/models/upload.rb:147:in `create_thumbnail!'
/var/www/discourse/lib/cooked_post_processor.rb:281:in `convert_to_link!'
/var/www/discourse/lib/cooked_post_processor.rb:487:in `block in post_process_images'
nokogiri-1.13.3-x86_64-linux/lib/nokogiri/xml/node_set.rb:233:in `block in each'
nokogiri-1.13.3-x86_64-linux/lib/nokogiri/xml/node_set.rb:232:in `upto'
nokogiri-1.13.3-x86_64-linux/lib/nokogiri/xml/node_set.rb:232:in `each'
/var/www/discourse/lib/cooked_post_processor.rb:486:in `post_process_images'
/var/www/discourse/lib/cooked_post_processor.rb:44:in `block in post_process'
/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/cooked_post_processor.rb:40:in `post_process'
/var/www/discourse/app/jobs/regular/process_post.rb:26:in `block in execute'
/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/app/jobs/regular/process_post.rb:10:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
sidekiq-6.4.1/lib/sidekiq/processor.rb:196:in `execute_job'
sidekiq-6.4.1/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.4.1/lib/sidekiq/processor.rb:163:in `block in process'
sidekiq-6.4.1/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.4.1/lib/sidekiq/job_retry.rb:114:in `local'
sidekiq-6.4.1/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.4.1/lib/sidekiq.rb:40:in `block in <module:Sidekiq>'
sidekiq-6.4.1/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.4.1/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.4.1/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.4.1/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.4.1/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.4.1/lib/sidekiq/job_retry.rb:81:in `global'
sidekiq-6.4.1/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.4.1/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.4.1/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.4.1/lib/sidekiq/processor.rb:162:in `process'
sidekiq-6.4.1/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.4.1/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.4.1/lib/sidekiq/util.rb:56:in `watchdog'
sidekiq-6.4.1/lib/sidekiq/util.rb:65:in `block in safe_thread'

코드를 살펴보면, 오류 메시지에 convert: 가 포함되지 않은 경우 이 일반적인 오류 메시지가 사용되어 실제 근본적인 오류가 숨겨지는 것으로 보입니다.

이것이 우리 측에서 누락된 필수 라이브러리 문제이거나, 마이그레이션 과정에서 일부 파일이 제대로 복사되지 않은 것일 수도 있지만, 오류 메시지가 없으니 파악하기 어렵습니다. 어디서부터 살펴봐야 할지 조언을 주실 수 있으신가요?

여기서는 ImageMagick이 오래된 버전일 가능성이 높습니다.

공식 세팅을 사용하고 계신지 확인해 주실 수 있나요? ./launcher rebuild를 실행할 때마다 기본 이미지의 최신 버전을 항상 가져옵니다.

샘, 네, 우리는 ./launcher를 사용하고 있으며 지난 한 주 동안 여러 번 다시 빌드했습니다.

그 스크립트를 빠르게 monkey patch해서 근본적인 오류를 출력할 수 있는 방법이 있을까요? 제 Ruby 실력이 좀 녹슬어서, 파일을 그냥 수정하면 되는 건지, 아니면 캐싱/컴파일 과정이 관련이 있는지 궁금합니다.

사실 로그를 확인해 보니, 이 에러는 그제 이후로 나타나지 않았습니다. 아마도 마이그레이션 과정에서 발생한 일시적인 문제였을 것 같습니다 :thinking:

제 생각에는 업로드 파일이 그 시점에 없었던 것 같습니다. 이미지 최적화와 변환을 시도했을 때 해당 파일이 존재하지 않았습니다.

에러 메시지는 확실히 개선할 필요가 있습니다.

디버깅이 필요하시다면, 컨테이너 내부의 파일을 편집하고 Discourse.warn 호출(기본적으로 로그에 출력하는 printf와 유사합니다)을 곳곳에 삽입해 보세요. 파일을 수정한 후에는 컨테이너를 재시작해야 합니다.