Youtube embeds missing

@Iceman 님 안녕하세요

방금 DB를 검색해 보았지만, 해당 설정이 저장되어 있는 테이블이나 필드를 찾을 수 없었습니다(site_settings 테이블에도 없었음).

댓글에 대해 말씀드리자면:

… 그리고 5시간이 지난 후에도 Ban이 여전히 유지되고 있습니다

구글이 이러한 "Ban"을 어떻게 관리하는지에 대해 특별한 전문 지식이 있는 것은 아니지만, 알고리즘이 Ban을 트리거한 후 구글이 "Ban 해제"를 하는 데는 훨씬 더 긴 시간(수일 또는 심지어 수주)이 걸릴 수 있다고 추측합니다.

하지만 다시 말하지만, 이 Ban 처리 프로세스가 어떻게 "동작"하는지, 또는 이 Ban 프로세스의 "공식 구글 명칭"이 무엇인지에 대해 실질적인 지식이 없습니다.

혹시 아시는 점이 있으신가요?

이 주제에 대해 논의하는 구글 지원 페이지가 있나요? 말씀하시는 이 Ban 프로세스의 정확한 명칭은 무엇인가요?

구글이 DoS 방지 차단 또는 관련 시스템이 정확히 어떻게 작동하는지 설명하는 지원 페이지가 존재하지 않는 것은 분명합니다.

피와 땀과 눈물을 흘린 끝에, 이제 해결된 것 같습니다.

다만, 이 해결책에 대해 특별히 "자부심"을 느끼지는 않습니다. 하지만 어차피 구글은 아무 말도 하지 않고 설명도 해주지 않으니까요. 결론은 다음과 같습니다:

  • 첫째로, 중요한 교훈 하나: Discourse를 사용 중이라면 DigitalOcean에서 IPv6를 활성화하지 마세요. DigitalOcean의 IPv6 범위가 YouTube에 의해 차단되어 있기 때문입니다.

  • IPv6 문제를 수정한 후, 트래픽이 증가하면서(호스트를 몇 번이나 바꿨는지 모를 정도로 긴 여정이었습니다), 그 다음에는 YouTube가 제 Discourse 설치를 IP 차단했습니다. 사이트에서 게시된 YouTube 영상의 수량과 Discourse가 이를 로드하는 방식 때문에 발생한 문제였습니다.

  • 이 차단을 확인하려면 서버를 브라우저가 있는 서버의 프록시로 사용하거나, 단순히 curl을 사용해 다음 줄을 검색해야 합니다: “Sorry for the interruption. We have been receiving a large volume of requests from your network.” (참고로 이 토픽을 참고할 수 있습니다.)

  • @riking, @neounix, @Overgrow 님들의 도움으로 YouTube 임베드를 베이킹(bake)하는 속도를 멈추거나, 제한하거나, 변경하기 위해 일련의 명령어(위에서 읽을 수 있습니다)를 실행했습니다. 대부분의 사이트라면 이것이 충분했을 것입니다. 하지만 저는 호스트를 몇 군데 시도한 후 이주하는 과정에서 이전 게시물이 모두 베이킹되어야 하는 추가적인 곤란함을 겪었습니다. 사실, 1시간에 1회로 제한하자 처음에는 어느 정도 해결되었습니다. 하지만 제 커뮤니티는 정말 영상 공유를 좋아하는 것 같아서 그 효과는 오래가지 못했습니다.

  • 당연히 YouTube 측에서는 피드백이나 도움이 전혀 없었습니다. 그들의 포럼에서 해당 오류에 대한 몇 가지 스레드와 "나도 같은 문제가 있어"라는 댓글들만 있을 뿐, 해결책은 없었습니다.

  • 이런 상황에서 "다른 방법이 분명 있을 거야!"라는 인포머셜(광고)식 논리를 떠올리며, 저는 "람보"식 접근법을 선택했습니다. 다른 IP 주소를 하나 더 구매한 것입니다. 그리고 1시간마다 출구(outbound) IP 주소를 전환하는 cron 작업을 추가했습니다. 문제가 해결되었습니다.

  • 사이트가 계속 성장하고 사람들이 _YouTube 사랑_을 계속 공유한다면, 제3의 IP 주소를 추가로 확보해야 할 수도 있을 것으로 예상됩니다. 하지만 어쨌든, K8S나 다른 기술로 "분산된 Discourse"를 올바르게 구성하는 방법을 알아낼 때까지는, 이것이 최선의 방법입니다.

  • 가장 우아한 해결책은 아니라는 것을 잘 알고 있습니다.

  • 다시 한번 모든 도움(그리고 특히 인내심)에 감사드립니다. 저는 Rails/Sidekiq/RubyConsole 조합에 대해 매우 초보적인(n00bish) 수준이지만, Discourse 코드를 읽으며 개선하려고 노력하고 있습니다.

감사합니다!

정말 훌륭합니다!

창의적이고 효과적인, 상식을 뛰어넘는 문제 해결 방식이네요.

스타일과 정교함으로 문제를 해결해 주셔서 진심으로 축하드립니다!

권고 사항에 따라 며칠 전 Discourse의 AWS S3 버킷에 CloudFront CDN을 설정했습니다.

제어판에 S3 CDN URL을 추가한 후, 20만 개 이상의 게시물에 대해 rebake 명령을 실행했습니다.

당시에는 크게 신경 쓰지 않았습니다. 설정 후 약 12시간 동안 잘 작동하니까요.

저희 Discourse에는 수많은 수많은 영상이 내장되어 있습니다. 저희는 드론/UAV 커뮤니티이며, 사람들이 하루 종일 사진과 영상을 게시하고 공유합니다. 저희 Discourse 게시물에는 수만 개의 YouTube 영상이 있습니다.

돌이켜 보면…? CDN URL을 추가한 후에는 *.jpg 패턴 또는 유사한 패턴에 해당하는 게시물만 rebake하면 되었을 것입니다. :man_facepalming:t2: :cry:

그런데 무슨 일이 일어났을까요?

YouTube가 저희 서버의 IP 주소를 차단했습니다. :pensive:

더 이상 YouTube 링크를 onebox할 수 없으며, 커뮤니티에서는 다음과 같은 메시지가 표시됩니다:

429 Too Many Requests

:pensive:

(서버 자체에서 간단한 curl / wget을 실행해도 동일한 결과가 반환됩니다)

반드시 rebake 과정에서 차단된 것으로 보입니다. 기존 게시물 중 작동하던 영상이 있는 절반의 게시물도 이제 작동하지 않습니다. :sob:

이 차단이 영구적이라고 가정하고 있지만, 아시다시피 YouTube에서 연락할 사람을 찾아서 용서를 구하는 것은 불가능합니다.

혹시 영구적인 경우를 대비해 @Iceman님께 질문드립니다. Digital Ocean에서 두 번째 IP 주소를 확보하는 방법과, 해당 IP로 “나가는” 트래픽을 라우팅하되 들어오는 트래픽은 기존 IP에 유지하도록 설정한 변경 사항을 공유해 주실 수 있을까요?

그리고 모두에게 질문드립니다. 이 차단이 일시적인 것일 가능성이 있는지 아는 분이 계신가요? :crossed_fingers:t2: 그리고/또는 이제 완전히 깨져버린 YouTube 게시물을 수정하기 위해 제가 할 수 있는 일이 있을까요?

미디어 중심의 커뮤니티인 저희에게 이는 상당히 치명적인 상황입니다.

영구적일 가능성은 낮으며, 시간이 지나면 사라질 가능성이 큽니다.

같은 변경 사항을 찾고 있다면, 재베이킹 대신 Remap을 사용할 수 있습니다. 이 방식은 거의 즉시 처리되며 외부로 요청을 보내지 않습니다.

늦게 답장드려 죄송합니다.

Digital Ocean 관련해서는 도움을 드리기 어렵습니다. IPv6 지원이 부족해서 해당 서비스를 떠났거든요.

외부 요청을 처리하는 '스위치’에 IP를 계속 추가하고 있고, YouTube로 나가는 요청 시 IP를 번갈아 사용해서 차단되는 것을 피하려 하고 있습니다. 하지만 결국 IP가 차단되고, 이는 교착 상태를 만듭니다. '차단’된 상태의 IP가 계속 요청을 보내면 계속 차단 상태가 유지됩니다. YouTube가 '차단 해제’를 하려면 요청 없이 1시간에서 8시간 동안 기다려야 합니다. 사용자가 많아지고 그들이 올리는 YouTube 영상이 많아질수록 상황은 더 악화됩니다.

oneboxes의 최신 업데이트 덕분에 이제 429 오류를 더 쉽게 발견할 수 있게 되었습니다(영상이 제대로 표시되지 않아서 찾아다니지 않아도 Discourse 내에서 429를 바로 볼 수 있기 때문이죠). 하지만 제 제한된 이해 범위 내에서 YouTube 임베딩을 처리하는 더 나은 방법이 있는지 궁금합니다. 영상이 재생될 때는 요청이 클라이언트 IP에서 발생하는 것 같은데(추측입니다), 영상이 표시될 때는 사이트가 영상마다 요청을 보내고 있기 때문입니다.

고맙습니다 @Iceman :+1:t2:

이 정보는 정말 유용합니다.

금요일에 onebox assistant 플러그인을 설치하고 모든 onebox를 embed.rocks 프록시를 통해 라우팅했습니다.

오늘, 서버 콘솔에서 YouTube 비디오에 대한 무작위 wget을 시도해 보았습니다.

정말, 우리는 차단이 해제되었습니다!

오늘 오후에 다시 onebox assistant를 비활성화했고, 지금까지 문제 없이 직접 가져오고 있습니다.

그렇게 하지 않았다면, 사람들이 계속 새로운 영상을 올리기 때문에 몇 시간마다 YouTube를 계속 요청하게 되어 영원히 차단이 해제되지 않았을 것 같다고 생각합니다 :grimacing:

다시 한번 감사합니다 :smiley:

@Iceman님과 @Richie님, 추가 정보를 주셔서 감사합니다. 최근 이 주제가 꽤 많이 언급되고 있어서, YouTube가 레이트 리미팅(rate limiting)을 어떻게 다루는지에 대한 추가 정보는 정말 큰 도움이 됩니다.

또한, 이러한 "차단"이 양방향으로 자동 적용된다는 점을 안심시켜 드리고 싶습니다. 인내심을 갖고 사이트에서 YouTube에 보내는 요청 횟수를 줄인다면, 며칠 안에 산타의 "나쁜 아이 목록"에서 제외될 것입니다. :santa_claus::page_with_curl:

이 방법의 변형 버전을 사용하여 많은 게시물을 부드럽게 처리했습니다. 위험이 적으면서 시간을 크게 절약해 주는 제안, @riking님 감사합니다!

참고로 진행 상황을 추적하기 위해 다음을 사용했습니다:

Post.where(baked_version: nil).count