После крови, пота и слёз, я думаю, проблема решена.
Однако я не особенно «горжусь» этим решением, но что поделать — это Google, они ни с кем не разговаривают и ничего не объясняют, так что… выводы:
-
Прежде всего, важный урок: не включайте IPv6 на DigitalOcean, если вы используете Discourse, так как их диапазон IPv6 заблокирован YouTube.
-
После исправления проблемы с IPv6, из-за растущего трафика (независимо от хостинга — я несколько раз менял провайдера, какое путешествие!), произошло следующее: YouTube начал блокировать по IP мою установку Discourse из-за большого количества загружаемых на сайт видеороликов и способа их загрузки через Discourse.
-
Чтобы проверить эту блокировку, нужно либо использовать свой сервер как прокси для машины с браузером, либо выполнить curl и найти следующую строку: «Извините за неудобства. Мы получаем большой объём запросов из вашей сети». (вот тема для справки)
-
Благодаря помощи от @riking, @neounix и @Overgrow я выполнил ряд команд (их можно прочитать выше), чтобы попытаться остановить, ограничить или изменить скорость рендеринга встраиваемых видео YouTube. Для большинства сайтов этого было бы достаточно, но у нас была дополнительная сложность: после миграции на несколько хостов требовалось заново обработать все предыдущие посты. Фактически, ограничение в одно видео в час вроде бы сначала решило проблему. Но, видимо, мое сообщество просто очень любит делиться видео, потому что это не продлилось долго.
-
Очевидно, что от YouTube никакой обратной связи или помощи нет, кроме нескольких тем на их форуме с описанием ошибки и комментариев вроде «да, у меня тоже эта проблема», но без решений.
-
Учитывая обстоятельства и помня логику рекламных роликов «Должен быть другой способ!», я выбрал подход «Рэмбо»: купил дополнительный IP-адрес. Затем настроил cron-задачу, которая каждые час меняет исходящий IP-адрес. Проблема решена.
Ожидается, что если сайт продолжит расти, а люди будут продолжать делиться любовью к YouTube, возможно, потребуется приобрести третий IP. Но пока я не найду правильный способ реализации «распределённого Discourse» в K8S или подобной среде, это лучшее, что можно сделать.
Не самое элегантное решение, я знаю.
Ещё раз спасибо за всю помощь (и в основном за терпение, потому что я знаю, что я очень нуб в связке Rails/Sidekiq/RubyConsole, но я стараюсь улучшаться, читая исходный код Discourse).
Спасибо!