Discourse の読み取り専用モード

:bookmark: このガイドでは、Discourse で利用可能な各種の読み取り専用モードについて、それらを有効化・無効化する方法、および各モードを使用するべきシナリオを説明します。

:person_raising_hand: 必要なユーザーレベル:管理者

Discourse 上で活発なオンラインコミュニティを管理する際、管理者が一時的にユーザーの活動を制限する必要がある場合があります。このような状況には、サーバーメンテナンスの実施、バックアップの促進、サーバーの移行などが含まれます。そのような時期には、ユーザーのアクセスを完全に遮断することなく、フォーラムの活動を制限することが不可欠です。

Discourse では、サイト内のさまざまなタイプの相互作用を一時的に凍結するために、管理者が有効化できるさまざまな読み取り専用モードを提供しています。

このガイドでは、これらのモード、特にそれらを有効化および無効化する方法、また特定のモードが交差する状況への対処法に焦点を当てて探求します。

読み取り専用モードの理解

Discourse は、さまざまな管理ニーズに合わせて調整された 2 つの異なるレベルの読み取り専用モードをサポートしています。これらは以下の通りです:

  1. 完全な読み取り専用モード
  • フォーラム内のすべての書き込み操作を制限し、投稿、コメント、いいねなどのコンテンツの作成や変更をすべてのユーザーから禁止します。
  • フォーラムを現在の状態で事実上「凍結」し、ユーザーが既存のコンテンツを読み、ナビゲートできるようにしながら、データベースへの影響を防ぎます。
  • 現在のデータベースの状態を維持するため、管理者サイト設定やサイトのカスタマイズの変更を無効にします。
  • 一般ユーザーによる新しいフォーラムへのログインを無効にします。管理者は、管理者用メールログインフロー(/u/admin-login)を使用してログインできます。
  1. スタッフ書き込み専用モード
  • フォーラム内の書き込み操作(投稿、コメント、いいねなど)を一般ユーザーに制限します。一般ユーザーは読み取り専用操作に限定されますが、アカウントへのログインは引き続き可能です。
  • 管理者およびモデレーターの活動は通常通り続行されます。管理者はサイト設定を変更でき、スタッフユーザーは投稿、いいね、プロフィール変更などの書き込み操作を実行できます。

これらのモードにより、重要な管理期間中のフォーラムの運用性を柔軟に管理することが可能になります。

読み取り専用モードの有効化・無効化方法

:warning: 管理者は、異なる読み取り専用モード間の移行を慎重に管理する必要があります。どの読み取り専用モードも有効化する前に、以前にアクティブ化されたものが無効化されていることを確認してください。

完全な読み取り専用モード

Rails コンソール経由

Discourse インストールにアクセスできる場合は、./launcher enter appで Docker コンテナに入り、次に rails cでrails コンソールに入ってから、以下のコマンドを実行するためにDiscourse rails コマンドラインインターフェースを使用してください。

Discourse.enable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)

管理パネル経由

Web インターフェースを介して管理者アクセスがある場合は、Admin > Backups > Enable Read-Only Mode に移動して読み取り専用モードを有効化できます。

読み取り専用モードを無効化するには、以下の rails コマンドを実行してください。

Discourse.disable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)

または、管理パネルを使用して Admin > Backups > Disable Read-Only Mode に移動してください。

スタッフ書き込み専用モード

:discourse: スタッフ書き込み専用モードの有効化・無効化は、Discourse rails コンソールからのみ行うことができます。サイトが Discourse によってホストされている場合、このモードの有効化または無効化を希望する場合は team@discourse.org までお問い合わせください。

スタッフ書き込み専用モードを有効化するには、以下の rails コンソールコマンドを使用してください。

Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)

無効化するには:

Discourse.disable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)

ベストプラクティス

  • タイムリーなコミュニケーション: 適切な期待値を設定するために、スケジュールされた読み取り専用期間について事前にコミュニティに通知してください。
  • テスト: 重要な操作中にこれらのモードを実装する前に、トラフィックの少ない時間帯にテストを行い、その影響を理解してください。
  • ドキュメント: 将来の運用計画を支援するために、各モードがいつ、なぜ有効化または無効化されたかについて詳細な記録を保持してください。

よくある質問 (FAQ)

  • 読み取り専用モードの有効化・無効化にどのくらい時間がかかりますか?

    • 変更は即座に反映されます。ただし、ユーザー体験は移行期間中のアクションによって若干異なる場合があります。
  • 助けて!読み取り専用モードのためにサイトからロックアウトされてしまいました。サイトに再度アクセスするにはどうすればよいですか?

  • discourse/lib/discourse.rb に他の READ-ONLY モードがリストされていることに気づきましたが、これらのモードは何をするものですか?

    • READONLY_MODE_KEY は主にバックアップとリストアのプロセスに使用され、アプリケーション自体によってトリガーされます。このモードは、Discourse コマンドラインインターフェースから discourse enable_readonly および discourse disable_readonly を使用して有効化または無効化することもできます。ただし、このキーはコンテナの再起動後に生存しません。
    • USER_READONLY_MODE_KEY は、管理者が管理インターフェースで読み取り専用ボタンをクリックしたときに使用されます。このキーの特別な点は、ユーザーによって有効化された読み取り専用状態がコンテナの再起動後も維持される必要があるため、期限付きキーとして設定されていないことです。他のキーには TTL(READONLY_MODE_KEY は 60 秒、PG_READONLY_MODE_KEY は 300 秒)が設定されており、アプリが読み取り専用モードで停止しないようにするために、30 秒ごとに期限延長を行うスレッドがあります。
    • PG_READONLY_MODE_KEY および PG_FORCE_READONLY_MODE_KEY は PG フェイルオーバーに使用されます。前者は期限付きキーとして設定され、後者は期限なしキーです。
「いいね!」 9

違いがわかりません!もし違いがある場合、これらの説明を調整していただけますか?

「いいね!」 1

ガイドを更新し、ここでいくつかの追加の明確化を行いました。読み取り専用モードについて、まだご不明な点がございましたらお知らせください。 :slightly_smiling_face:

「いいね!」 1

しかし、

discourse enable_readonly

は何をするのでしょうか?

READONLY_MODE_KEY を使用しており、ttl を 60 に設定するため、ある時点でオフに戻ります。さて、

このコマンドのデフォルトの動作には何か理由があるのでしょうか?ウェブインターフェイスの読み取り専用モードとは完全に異なるコマンドであることに気づくのに、何年もかかりました。そして、誰かがかつてこれらのキーについて教えてくれようとしたことを思い出しましたが、その重要性を理解できませんでした。

私の意見では、discourse enable_readonly が行うべきは、Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY) のようなことだと思います。ずっと前に気づいていればよかったです!

このような PR を提出できますか?

  desc "enable_readonly", "Enable the readonly mode, allowing staff writes"
  def staff_writes_only
    load_rails

    Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)
    puts 'The site is now in readonly mode with staff writes permitted.'
  end

これにはあまり詳しくありませんが、enable_readonly_mode がサイトを staff_writes_only_mode に設定するのは混乱を招くと思います。これらは異なるモードであり、特定の操作を実行する際には、スタッフがデータベースへの書き込みを許可されないようにしたい場合があります(たとえば、復元中は削除されます)。

代わりに、ここでいくつかのことを行うことができるかもしれません。

  1. リードオンリーモードがそのタスクの説明にTTLを設定することを明確にする
  2. keep_readonly_mode を呼び出すタスクを追加して、60分以上に延長できるようにする
  3. enable_staff_writes_only および disable_staff_writes_only タスクを追加する
「いいね!」 2

同意しますが、「しばらくの間読み取り専用モードを設定する」よりはるかに混乱が少ないでしょう。

復元スクリプト自体が読み取り専用モードを設定するため、このコマンドの影響を受けないと思います。

設定されたときにX分間設定されていることを宣言する方が良いでしょう。説明を見つけるのはそれほど簡単ではありません。

たぶん。誰がそれを使用するのかはっきりしません。

それは素晴らしいでしょう!

また、rakeタスクとdiscourseコマンドから利用可能なコマンドを混同していないことを明確にする必要があります。

「いいね!」 2

なるほど。これをPRとして提出する可能性はありますか? enable_staff_writes_only および disable_staff_writes_only コマンドについても、可能であれば同様にお願いします。ありがとうございます!

「いいね!」 3

読み取り専用を開始した後、どのクロックが停止するのか知りたいのですが?読み取り専用を設定した後、トピックのバンプは発生しますか?

Web UIで読み取り専用モードが設定されている場合、アップデートも動作しないようです。