몇일 전부터 (Discourse 2.5 beta 5로 업데이트한 직후라고 생각되며, beta 6에서도 계속되고 있지만 우연일 수도 있습니다) YouTube 동영상 임베딩이 간헐적으로 작동합니다. 몇 시간 동안 작동하지 않다가 갑자기 다시 정상적으로 임베딩이 시작됩니다.
어제부터는 완전히 작동이 중단되었습니다.
헤더 등을 예상대로 전달하면서 간단한 GET 호출을 /onebox?url=… 에 반복하면 단순히 HTML 404 오류만 반환됩니다.
서버에서 youtube_onebox.rb의 Ruby 코드에서 복사한 onebox가 수행하는 요청을 반복하면, 즉 임베드되지 않은 비디오 중 하나에 대해 curl 'curl 'https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=Xl-PTTeRsik'를 실행하면, 완벽하게 정상 동작하는 것 같습니다.
실제로 호출 결과는 다음과 같습니다: {"author_name":"AstronautiCAST","version":"1.0","height":270,"author_url":"https:\/\/www.youtube.com\/user\/AstronautiCAST","provider_name":"YouTube","provider_url":"https:\/\/www.youtube.com\/","thumbnail_height":360,"width":480,"html":"\u003ciframe width=\"480\" height=\"270\" src=\"https:\/\/www.youtube.com\/embed\/Xl-PTTeRsik?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c\/iframe\u003e","type":"video","thumbnail_width":480,"title":"Loading cargo into HTV-9 Konutori","thumbnail_url":"https:\/\/i.ytimg.com\/vi\/Xl-PTTeRsik\/hqdefault.jpg"}root@fait-2020:/var/discourse#
여기에는 임베딩에 필요한 모든 것이 포함되어 있습니다.
@Falco 번거롭게 해서 정말 죄송합니다. 하지만 YouTube 원박싱(oneboxing) 기능이 없으니 우리 포럼의 사용자 경험이 정말 많이 저하되고 있어요.
어제 저는 원박싱이 404를 반환하는 조건과 단계가 무엇인지 이해하기 위해 소스 코드를 읽어보는 것부터 시작해서, 현재 프로덕션 포럼을 새로운 Digital Ocean 드롭렛(droplet)으로 클론하는 시도까지 여러 가지를 해보았습니다.
코드를 읽는 것만으로는 큰 도움이 되지 않았는데, 주로 플랫폼에 대한 실질적인 지식이 부족했기 때문입니다.
이와 관련해 아직 해결되지 않은 질문이 하나 있습니다. 원박싱 프로세스가 어딘가에 로깅되고 있을까요? 원박싱이 실패하여 404를 반환하게 만드는 에러를 이해하는 데 매우 유용할 것 같습니다.
클론 드롭렛은 프로덕션 서버의 IP가 YouTube에 의해 차단되었는지, 그리고 우리가 사용하는 도메인 이름과 관련이 있는지 확인하려는 시도였습니다.
잘못된 점은, IP 주소와 도메인 이름이 달랐음에도 YouTube 원박싱은 작동하지 않았습니다.
정말 누군가가 원박싱이 어떤 작업을 수행하는지 추적할 수 있는 방법을 최소한 하나라도 제안해 주셨으면 좋겠습니다.
제 스크린샷에 보이는 요청(curl 'https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=Xl-PTTeRsik' )을 수행하기 전에, 429 오류를 유발하는 다른 요청을 Onebox가 보내고 있는 건가요?
말할 필요도 없이, 이 요청들은 Discourse가 실행 중인 서버(즉, 동일한 외부 IP)에서 전송되었습니다.
이 스레드에 마침표를 찍기 위해 다시 돌아왔습니다.
어제 YouTube가 우리의 계정 정지를 해제했고, 다시 정상적으로 운영되고 있습니다.
제 생각에 어떤 경우에도 이해할 가치가 있는 몇 가지 점이 있습니다:
원박스(oneboxing)가 실패할 경우 세부 정보를 로그로 기록할 수 있을까요? 원박싱이 왜 실패하는지 정확히 이해하는 데 매우 도움이 될 것입니다.
YouTube 비디오를 원박싱하는 데 필요한 유일한 요소는 비디오 ID이므로, 404를 반환하기 전에 3가지 URL 유형 각각에서 데이터를 가져오려 시도하는 것이 좋은 아이디어가 아닐까요? (위에서 언급했듯이, /embed/ URL은 정지 상태였음에도 불구하고 어떻게든 계속 작동했습니다.)
여기서 과제의 일부는 대상이 og 태그가 없는 페이지를 반환하는 경우, Onebox가 이것이 리다이렉트 때문이었는지 알 수 없다는 점일 것입니다. 그러나 이를 로깅할 수 있습니다(“ONEBOX: og 태그를 찾을 수 없음”?) 그리고 빈 onebox로 이어지는 모든 오류는 반드시 로깅되어야 합니다.
요약: 여기서는 같은 문제로 보이는 현상을 겪고 있다고 덧붙이고 싶습니다. 최근 변경 사항으로 인해 레이트 리밋(rate limit) 문제가 발생했다면, 마이그레이션 중이나 게시글 재처리(re-baking) 시, 혹은 단순히 포럼이 매우 바쁜 상황에서 다른 사용자들도 이 문제를 겪기 시작할 것이라고 생각합니다. 원박스(onebox)가 겉보기에는 조용히 실패한다는 사실 때문에, 사용자가 유튜브 원박스가 사라졌다고 불평하기 전까지는 이러한 문제가 눈에 띄지 않습니다.
배경
현재 2.6.0.beta 1 버전을 사용하고 있습니다.
사용자들이 보안이 되지 않는 콘텐츠(non-secure content)에 대한 메시지를 받고 있었습니다. 조사 결과, Chrome이 HTTP 사이트에서 링크된 이미지 때문에 오류를 보고하는 것으로 보였습니다. 그래서 Discourse 설정을 변경하여 모든 이미지/미디어를 다운로드하고 HTTPS로 서빙하도록 했습니다.
이 설정을 변경한 후, 과거 게시글에 대한 재처리(re-bake)를 수행해야 했습니다. 해당 재처리 이후, 이전에 원박스로 표시되던 유튜브 영상 중 큰 부분이 다시 링크된 URL로 돌아가 버렸습니다.
유튜브 영상 답변만으로 구성된 10,000개의 게시글이 있는 스레드가 하나 있는데, 모든 게시글이 원박스가 아닌 URL로만 표시되고 있습니다.
재처리 동안 큐에 있던 모든 작업이 유기적으로 처리되었으므로, 삭제된 작업이 쌓인 큐에 작업이 막혀 있는 상황이 아닙니다.
@marcozambi 님이 설명한 것과 동일한 오류 메시지는 확인되지 않았지만, 우리도 레이트 리밋에 걸린 것으로 믿습니다.
시도해 본 것들
이 레이트 리밋 가설을 뒷받침하기 위해, 게시글을 재처리하기 위해 작성한 소규모 코드는 스레드 내 첫 80개 이상의 유튜브 영상은 정상적으로 작동(원박싱)했으나, 나머지 영상은 변환에 실패했습니다.
그 시점 이후로, 게시글을 편집하여 작은 수정을 하고 다시 저장해도 URL이 원박스 ‘확장’ 형태로 변하지 않았습니다. 동시에, 예상대로 모든 큐가 비어 있거나 소량의 작업만 즉시 처리되고 있었습니다.
30분 동안 해당 코드를 재실행하여 링크의 원박싱을 강제하려 했으나 실패했습니다. 80이라는 숫자가 마법의 숫자는 아니고, 단순히 우리가 가진 쿼터에서 사용 가능한 양이었을 뿐이라고 생각합니다.
@marcozambi 님은 다른 링크가 실패할 때 /embed/ 형식의 유튜브 링크가 작동한다고 언급했으므로, 유튜브 링크를 /embed/ 형식으로 변환하기 위해 정규식(regex) 기반 검색 및 치환을 사용하는 방식으로 코드를 수정했습니다.
코드가 작동했습니다.
다시 게시글만 재처리하기 위해 코드를 재실행했을 때, 원박스 표현으로 변환되지 않았습니다.
제 계획은, 큰 스레드 내 모든 유튜브 링크를 /embed/ 유튜브 형식으로 변환하는 작업을 실험해 보는 것입니다. 만약 실패하거나 더 높은 레이트 리밋에 걸린다면, @merefield 님의 Onebox Assistant를 살펴볼 것입니다.