다만, 이 해결책에 대해 특별히 "자부심"을 느끼지는 않습니다. 하지만 어차피 구글은 아무 말도 하지 않고 설명도 해주지 않으니까요. 결론은 다음과 같습니다:
첫째로, 중요한 교훈 하나: 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 코드를 읽으며 개선하려고 노력하고 있습니다.
Digital Ocean 관련해서는 도움을 드리기 어렵습니다. IPv6 지원이 부족해서 해당 서비스를 떠났거든요.
외부 요청을 처리하는 '스위치’에 IP를 계속 추가하고 있고, YouTube로 나가는 요청 시 IP를 번갈아 사용해서 차단되는 것을 피하려 하고 있습니다. 하지만 결국 IP가 차단되고, 이는 교착 상태를 만듭니다. '차단’된 상태의 IP가 계속 요청을 보내면 계속 차단 상태가 유지됩니다. YouTube가 '차단 해제’를 하려면 요청 없이 1시간에서 8시간 동안 기다려야 합니다. 사용자가 많아지고 그들이 올리는 YouTube 영상이 많아질수록 상황은 더 악화됩니다.
oneboxes의 최신 업데이트 덕분에 이제 429 오류를 더 쉽게 발견할 수 있게 되었습니다(영상이 제대로 표시되지 않아서 찾아다니지 않아도 Discourse 내에서 429를 바로 볼 수 있기 때문이죠). 하지만 제 제한된 이해 범위 내에서 YouTube 임베딩을 처리하는 더 나은 방법이 있는지 궁금합니다. 영상이 재생될 때는 요청이 클라이언트 IP에서 발생하는 것 같은데(추측입니다), 영상이 표시될 때는 사이트가 영상마다 요청을 보내고 있기 때문입니다.