血と汗と涙の末、解決したと思います。
ただし、この解決策に特に「誇り」を感じているわけではありません。しかし、相手はGoogleですから、何も話してくれず、何も説明してくれません。したがって、結論は以下の通りです。
-
まず第一に、重要な教訓:Discourseを使用している場合は、DigitalOceanでIPv6を有効にしないでください。YouTubeがDigitalOceanのIPv6アドレス範囲をブロックしているためです。
-
IPv6の問題が修正された後、トラフィックの増加に伴い(ホストは何度か変更しました、本当に大変な旅でした)、その後起こったのは、YouTubeが当サイトのDiscourseインスタンスをIPブロックしたことです。これは、サイトに投稿されたYouTube動画の量と、Discourseがそれらを読み込む仕組みが原因でした。
-
このブロックを確認するには、サーバーをブラウザ付きのサーバーへのプロキシとして使用する、またはcurlを実行して以下の行を検索する必要があります。「申し訳ありませんが、中断いたします。ネットワークから大量のリクエストを受信しています。」(参考:このトピック)
-
@riking、@neounix、@Overgrow のご支援により、YouTube埋め込みのバーク(画像生成)を停止、制限、または変更する一連のコマンドを実行しました(上記参照)。多くのサイトではこれで十分ですが、私は数回のホスト変更を試みた後、サイトが移行されたため、以前の投稿すべてを再バークする必要がありました。実際、1時間ごとに1回に制限することで、最初は「まあまあ」解決しました。しかし、私のコミュニティは「動画を共有するのが本当に大好き」なようで、その効果は長続きしませんでした。
-
もちろん、YouTubeからはフィードバックやサポートは一切ありません。公式フォーラムにはエラーに関するスレッドがいくつかあり、コメントには「私も同じ問題を抱えています」という声はありますが、解決策は提示されていません。
-
こうした状況下で、インフォマーシャルの「他にも方法があるはずだ!」というロジックを思い出し、「ラムボ」的なアプローチを選択しました。別のIPアドレスを購入し、1時間ごとに発信元IPアドレスを切り替えるcronジョブを追加しました。これで問題は解決しました。
サイトが成長し続け、人々が「YouTubeへの愛を共有し続ける」場合、3番目のIPアドレスを取得する必要があるかもしれません。しかし、K8Sなどで「分散型Discourse」を実現する正しい方法を見つけるまでの間は、これが最善策です。
最もエレガントな解決策ではないことは承知しています。
改めて、ご支援(そして何より忍耐)に感謝します。Rails/Sidekiq/RubyConsoleの組み合わせについては、私が非常に未熟であることを理解していただいていると思います。Discourseのコードを読みながら、改善に努めています。
ありがとうございました!