Discourse のアップグレード中に Discourse の静的サイトエクスポートを提供する

現在、私はそれぞれが独自のScalewayインスタンス上でホストされている2つのDiscourseフォーラムを運用しており、以下のようにアップグレードしています。

# Discourse Dockerセットアップの更新
cd /var/discourse
git pull origin master

# Discourseの再構築
/var/discourse/launcher rebuild app

これにより、フォーラムは毎回約5〜15分間ダウンします。

サイトの1つはCloudflareプロキシの背後にあり、オフラインキャッシュを問題なく提供しています。しかし、もう1つのサイトはCloudflareを使用しておりません。

Discourseが、匿名ユーザー向けの公開スレッドのみを静的サイトとしてエクスポートし、インタラクションボタンを無効化し、上部に「本ウェブサイトは現在アップグレード中のため、読み取り専用モードになっています」というバナーを表示し、フォーラムのアップグレード中にそれを提供し、フォーラムがオンラインに戻った後に静的キャッシュを削除することは可能でしょうか?

「いいね!」 1

DNS が Cloudflare によって管理されている場合(プロキシを使用していなくても)、通常は数秒以内に更新されます。更新中は、ドメインを別のサーバー(Netlify/Vercel/Firebase/Surge などのメンテナンスページなど、すべてのパスが index.html ファイルを指すようなサーバー)にリダイレクトすることも可能です。

まだ試していませんが、Cloudflare Worker(「サーバーレス」関数)の resolveOverride を使用して、一時的に別のバックエンドを提供することも可能かもしれません。

「いいね!」 1

はい、DNS の変更でも、同じポートでリッスンして何かを配信する一時的な Docker Nginx コンテナを起動するだけでも、それは簡単な部分です。

現在、最も難しいのは、トピック、投稿、カテゴリ、インデックスページ(検索はオフでも可)を尊重しつつ、インタラクションを無効化し、バナーを追加した静的エクスポートを作成することです。その後、この置換をアップグレードプロセスに統合することですが、それはそれほど難しくはありません。

フォーラムで「静的エクスポート」を検索しても、そのような機能があるようには見えません。以前のプロジェクトで Discourse API クライアントを作成したことがあるので、デザインの模倣をせずに何らかのコードを組むことは可能かもしれません。

この目的で静的エクスポートを提供するもう一つの要素は、静的ページがブラウザや検索エンジンによってキャッシュされないようにすることです。


How do I export the complete forum as static html pages? - #3 by wangerin で十分かもしれないと疑問に思いますが、それでもインタラクティブな要素を無効化し、バナーを注入する必要があるようです。

2コンテナ構成で実行する場合、ダウンタイムは1分未満で済みます。または、ロードバランサーを実行する用意があれば、ゼロにすることも可能です。それはあなたが説明しているものよりも簡単です。

「いいね!」 3

はい、そう思います。推奨される2コンテナオプションはどこですか?

(Move from standalone container to separate web and data containers) が必要になる場合がありますが、他を検索するためにドラッグする必要があるかもしれません。

また、SKIP_POST_DEPLOYMENT_MIGRATIONS=1 についても調べてください。簡単に言うと、既存のデータベースを壊さないようにするために、bed コンテナを再構築する際にこれを設定し、新しいコンテナが稼働した後、これなしでもう一度マイグレーションを実行します。

「いいね!」 2