rails 명령어나 rake task로 Rebake를 실행하면 작동하지 않지만 HTML 재구성은 작동합니다. 왜일까요?

안녕하세요!

BBcode가 포함된 가져온 게시글 중 깨진 이미지가 있는 게시글을 복구하려고 하고 있습니다.

이미지는 작성기 미리보기에서는 정상적으로 표시되지만, 최종 게시글 내용에는 깨진 이미지가 포함되어 있습니다:

일부 게시글에 “HTML 재구축” 기능을 사용해보니 프로덕션 포럼에서 해당 게시글이 복구되는 것을 확인했습니다. 이후 rake 작업을 통해 모든 게시글을 다시 구웠습니다(rebake).

하지만 깨진 이미지가 있던 게시글은 복구되지 않은 것을 보고 놀랐습니다.

그래서 테스트 포럼(같은 백업, 같은 데이터)에서 특정 게시글에 대해 rails 명령어와 rake 작업 두 가지 방식을 모두 실험해봤고, 그 동작은 다음과 같습니다:

  • 이미지가 1초 정도 표시되다가 게시글이 깨진 이미지가 있는 초기 상태로 빠르게 되돌아갑니다.

그러나 “HTML 재구축” 기능을 사용하면 완벽하게 작동하며, 사진이 다시 깨진 이미지로 돌아가지 않습니다. 몇 분 후 서버에 올바르게 업로드되기도 합니다.

따라서 누군가 이 현상을 설명해 주실 수 있을까요? rails 또는 rake 작업을 통한 rebake가 왜 이런 동작을 하는지, 그리고 HTML 재구축과 명령줄 rebake의 차이점이 무엇인지 궁금합니다.

영상 캡처:

  1. rails 콘솔에서:

  2. rake 작업에서:

매우 궁금하고 (여전히 모든 게시글의 이미지를 일괄 복구하고 있습니다).


HTML 재구축을 사용한 예시로, 이 게시글의 내장 이미지가 올바르게 표시되고 서버에 자동으로 업로드된 것을 보여주는 것입니다 (물론 casimages로 연결되는 원래 링크는 여전히 남아있지만, 이는 예상되는 동작입니다). 며칠 전 내용입니다: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper

그 rake 태스크가 재구성을 위해 마킹하고 썸네일 재구성을 트리거하는 것 같습니다. sidekiq에서 작업이 큐에 쌓여 있는지 확인해 보셨나요?

수정:

게시물에 대해 rake rebake 작업을 실행하면 4분 후 PullHotLinkedImages가 트리거되고, 처리된 작업 수가 즉시 1 증가하지만, 큐 탭에 추가된 내용은 확인되지 않았습니다.

수동으로 HTML 재구성을 수행한 몇몇 게시물의 이미지는 며칠 동안 완벽하게 표시되고 있으며(이미지는 제 서버에도 다운로드되어 있음).

관리자용 와rench와 콘솔에서 작동 방식이 다른 이유는 잘 모르겠지만, 비슷한 문제가 있는 이 주제를 발견했고, API를 사용하여 rebaking을 통해 해결했다는 것을 알게 되었습니다:

https://meta.discourse.org/t/some-linked-images-not-displaying-show-as-broken/142177/7

도움이 될지는 모르겠지만, 공유해 봅니다.:slightly_smiling_face:

수정: 한 게시물 더 읽었어야 했는데. Apparently 그것도 신뢰할 수 없다고 합니다. 죄송합니다, 제 실수입니다. 위화감입니다.

rake/rails의 rebake와 rebuild HTML 사이에 잠재적인 차이가 있을 수 있다는 걸 잠깐 엿본 Jay를 제외하고, 다른 아이디어가 있는 분이 계신가요?

이 두 작업 간의 차이점에 대한 공식적인 답변이 있다면 좋겠습니다. :slight_smile:

우리가 이 문제를 해결하지 못한다면, 이미지 관련 잠재적 문제가 있을 수 있는 40,000개 게시물의 "rebuild HTML"을 API 방식으로 시작해야 할 것 같습니다… 제게 잘 작동하길 바랄 뿐입니다. :confused: :person_shrugging:

혹시 rails를 사용하여 "rebuild HTML"을 실행할 다른 방법이 있을까요? :thinking:

HTML 재구축: post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)

posts:rebake 레이크: post.rebake!(**opts) (여기서 opts는 일반적으로 비어 있습니다)

원박스(Oneboxes)의 경우 posts:refresh_oneboxes 작업을, 깨진 이미지의 경우 posts:invalidate_broken_images 작업을 시도해 볼 수 있습니다. 후자가 문제 해결에 도움이 될 수 있습니다.

몇 개의 게시물로 테스트해 본 결과, 정말 완벽하게 작동하는 것 같아요!
수천 개의 게시물에서 시도해 보고 어떻게 되는지 확인해 볼게요! 정말 감사합니다!

자, 현재 상황은 이렇습니다:

[img] 문자열을 포함하는 40,000개의 게시물 모두에 post.rebake!(invalidate_broken_images: true)를 실행해 보았더니 많은 이미지에서는 잘 작동했습니다… 하지만 같은 외부 이미지 호스팅 서비스를 사용했음에도 불구하고 모든 이미지에서 작동하지는 않았습니다.
예를 들어, 수천 개의 casimages 링크(유효한 이미지로 연결되고 편집 시 컴포저 미리보기에서 이미지가 표시되는 링크)는 제 스크립트 덕분에 서버에 올바르게 업로드되고 게시물의 cooked 버전에서 제대로 표시되었어야 했는데, 실제로는 깨진 상태로 남아 있었습니다. 또한 업로드가 전혀 작동하지 않은 다른 링크도 많이 있고, 그 이유를 알 수 없습니다.

Post.where('raw LIKE ?', '%[img]%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
end

다른 이미지 호스팅 서비스에서 가져온 이미지 링크 중에는 업로드가 성공한 것도 있고, 그렇지 않은 것도 있습니다.

이 게시물들과 이미지 링크 사이에 어떤 차이점을 찾지 못했습니다. 모두 유효한 이미지를 가지고 있었고, 동일한 이미지 호스팅 서비스를 사용했다는 점이 제게는 의아했습니다.

여러 번 작업을 시도해 보았지만, 외부 호스팅 서비스와 관계없이 결과가 일관되지 않았습니다… 일부 이미지는 업로드되고 일부는 업로드되지 않았습니다. 마치 무작위인 것처럼 보였습니다.

이는 @Amethi가 겪었던 문제와 조금 비슷합니다: Some linked images not displaying/show as broken - #8 by Amethi 이 문제에서는 설명 없이 일부 이미지에서만 작동했습니다.


:information_source: 저는 여기서 casimages에 대해서만 이야기할 것입니다. 다만, 제가 가져온 포럼은 다양한 다른 이미지 호스터를 사용했습니다.

그래서 저는 아마도 casimages가 제 서버에서 너무 많은 이미지를 가져오려고 하면 제 IP를 일시적으로 블랙리스트에 올린 것일지도 모른다고 생각했습니다. 이는 모든 이미지에서 작동하지 않은 사실과 이미지 업로드 성공의 무작위성을 모두 설명할 수 있습니다.
심지어 Rebuild HTML 옵션이 처음에는 작동하여 깨진 이미지 아이콘 대신 이미지가 표시된 경우조차 있었습니다(이미지는 여전히 외부 호스팅 서비스에 호스팅된 상태였지만), 외부 이미지 가져오기 Sidekiq 작업이 트리거되면 이미지가 깨졌습니다.
rebake!(invalidate_broken_images: true)를 사용하는 레일 스크립트도 마찬가지였습니다.
:weary:

그래서 저는 현재 더 느린 접근 방식을 시도하고 있습니다. 각 레일 rebake! 명령 사이에 5초를 기다리는 방식입니다:

total = Post.where('lower(raw) LIKE ?', '%[img]https:%').count
i = 0
Post.where('raw LIKE ?', '%[img]https:%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
    print "#{i}/#{total}"
    print "\r"
    i +=1
    sleep(5)
end

약 60시간 후에 더 나아졌는지 확인할 예정입니다…

여기서 제 문제의 근본적인 원인과, (만약 casimages에 의해 일시적으로 블랙리스트에 오르지 않았다면) 왜 “정상적인” rebake가 이미지를 서버에 업로드하지 못하는지 이해하고 싶습니다.

참고로 이번에는 casimages 서버의 인증서가 정상인 것 같습니다 :smile:

또한 invalidate_broken_images가 실제로 무엇을 하는지 이해하지 못하겠습니다. 저는 Discourse 코드에 익숙하지 않습니다.

코드를 살펴보고 invalidage_broken_images의 발생 위치를 확인했는데, 다음과 같은 파일들을 발견했습니다:

왜 특별히 <img 문자열을 검색하는 것일까요? 제 게시물은 가져온 phpBB에서 온 것이며, raw 버전에는 [img] bbCode만 있고 <img> 태그가 없습니다. 그렇다면 제 게시물에 어떻게 영향을 미칠 수 있을까요(그리고 실제로 영향을 미쳤습니다, 이전 메시지를 참고하세요)? :thinking:

또한 이 두 메서드 사이의 차이점도 잘 이해하지 못하겠습니다 (?):

rebake는 기본 인수를 false로 설정하고, rebake!은 기본 인수를 true로 설정하는 것처럼 보입니다.

이 두 메서드는 어떻게 관련되어 있나요(ruby에서 ! 문자의 용도는 알고 있습니다) 그리고 왜 다른 파일에 있는 것일까요?

제 목표는 외부 이미지가 왜 때로는 업로드되고 때로는 업로드되지 않는지 이해하고, 이를 적절하고 자동으로 업로드하는 신뢰할 수 있는 방법을 찾는 것입니다(시간당 이미지를 하나씩 업로드해야 하더라도). :sweat_smile:
거의 2주 동안 이 문제에 매달리고 있으며, 저(그리고 제가 서버를 이전해 준 사람들)를 미치게 만들고 있습니다. :woozy_face:

또한, Discourse 로그에는 아무것도 없고, 대신 여러 개의 Sidekiq is consuming too much memory (using: 592.25M) 메시지만 있습니다. 참고로 저는 Windows 10에서 WSL을 통해 Ubuntu로 작업하고 있지만, 작동하는 솔루션을 찾으면(찾을 수 있다면…) VPS에서 사용할 의도가 있습니다.

아래쪽, 716번째 줄에서 이 코드가 무엇을 하는지 확인할 수 있습니다. 해당 코드는 이미지를 삭제하여 다시 다운로드하도록 시도합니다. (최소 첫눈에 그렇게 보입니다.)

이 설명에 대해 감사합니다. :slight_smile:


지금 제 레일스 스크립트로 40,000개의 게시물 중 [img] 태그가 포함된 게시물을 5초 간격으로 다시 베이킹(rebaking)하는 작업을 거의 55시간째 수행하고 있습니다.

현재까지 확인한 바로는 이전보다 훨씬 잘 작동하는 것 같습니다. 대부분의 유효한 이미지(불규칙한 동작을 보이는 Imageshack는 제외)는 첫눈에 봐도 제 포럼에 완벽하게 업로드된 것으로 보입니다. 다만 100% 확신을 위해 더 자세히 살펴볼 예정입니다. 확실한 것은 결과가 훨씬, 훨씬 더 좋아졌고 일관성이 있다는 점입니다.

따라서 제가 겪었던 문제(그리고 아마도 @Amethi 님의 문제도)는 invalidate_broken_images를 통한 원격 이미지 다운로드 시 발생하는 무작위성, 즉 다양한 이미지 호스팅 제공업체의 일종의 속도 제한(rate limit)과 관련이 있었던 것 같습니다…? :thinking: 이상한 점은 다른 가져온 포럼에서는 이러한 문제를 눈치채지 못했다는 것입니다… :face_with_raised_eyebrow:


그럼에도 불구하고, 결과가 충분히 만족스럽고 지연 시간이 원격 이미지 다운로드를 실제로 개선한다면, 프로덕션 포럼에도 동일한 방법을 적용할 것입니다. 다만 각 게시물 재베이킹 사이의 시간을 5초에서 10초 또는 15초(심지어 더 길게)로 늘릴 예정입니다. 서두를 상황이 아니며, 모두 꽤 오래된 게시물들이고, VPS 사양이 제 개인 컴퓨터보다 훨씬 낮기 때문입니다.

너무 빨리 결론을 내리고 싶지는 않지만, 제 초기 문제에 대한 해결책은 Richard 님이 제안한 해결책을 적용하는 것 AND 각 게시물 재베이킹 사이에 지연 시간을 추가하는 것 두 가지를 모두 사용하는 것일 수도 있습니다.