ステージングサーバーをセットアップする

ステージングサーバーをセットアップする際に役立ついくつかのヒントがあります。

ステージングサーバーとは?

ステージングサーバーは、基本的に本番サイトのクローンです。サーバー上に存在し、機能も同一です。通常のDiscourseサイトと同様に、Dockerコンテナ内で実行されます。

これは、リスクの高いものを試したり、ユーザーから簡単に隠せないものを試したりするための場所を提供します。Discourse Advertising Plugin (Ads) を使用して広告を試したり、フォーラムのインポートやマージのような何か面白いことをしたい場合に非常に役立ちます。

これは、開発者が安全にコードをいじることができるように、通常は簡単にアクセスできる(そしてサンドボックス化された)場所で実行される開発サーバーとは対照的です。

何が必要ですか?

  1. 標準的なセルフホスト型インストールに必要なすべて

  2. S3バックアップがセットアップされている場合、作業が大幅に楽になります

    • そうでない場合は、SSH経由でサーバーとの間で大きなファイルを移動する方法が必要になります

手順

サーバーを希望通りにセットアップする

通常はDigital OceanでホストされているUbuntu仮想サーバーで行いますが、使い慣れたもので構いません。

Discourseをインストールする

このガイド(またはdashboard.literatecomputing.com)から。メール認証は不要なので、「junk」メール認証情報を使用することをお勧めします(メールは機能する必要も、機能させたいわけでもありません)。

discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

インストールが機能していることを確認する:

管理者アカウントを設定する(必要な場合)

コマンドラインから管理者アカウントを設定します。これにより、メール経由での認証が不要になります。

./launcher enter app
rake admin:create

これは、コマンドラインからバックアップを復元できるため、インストールのテストを除いて厳密には必要ありません。

app.ymlを編集していくつかの調整を加える

  1. 元のapp.ymlのコピーを作成することをお勧めします(問題が発生した場合に元に戻せるように、私はそれを app.vanilla.yml と呼んでいます)。

  2. env セクションの下部にこれらの行を追加します:

      ## ステージングサーバー固有の設定
      DISCOURSE_AUTOMATIC_BACKUPS_ENABLED: false
      DISCOURSE_LOGIN_REQUIRED: true
      DISCOURSE_DISABLE_EMAILS: 'yes'
      DISCOURSE_S3_DISABLE_CLEANUP: true
      DISCOURSE_ALLOW_RESTORE: true
    
  3. S3(または類似のもの)バックアップが設定されている場合は、これらも追加します(メインサイトの設定を使用)。

      ## S3設定
      DISCOURSE_S3_ACCESS_KEY_ID: 'your_key'
      DISCOURSE_S3_SECRET_ACCESS_KEY: 'your_secret'
      DISCOURSE_BACKUP_LOCATION: 's3'
      DISCOURSE_S3_BACKUP_BUCKET: 'your_backups_location'
      DISCOURSE_S3_REGION: 'your_s3_region'
      DISCOURSE_S3_DISABLE_CLEANUP: true
    

    S3アップロードも行っている場合は:

      DISCOURSE_ENABLE_S3_UPLOADS: true
      DISCOURSE_S3_UPLOAD_BUCKET: 'your_uploads_location'
    
  4. 必要であれば、本番サイトと同じプラグインを追加することもできます。

  5. 再構築を実行します。

    • ./launcher rebuild app

ステージングサーバーの管理

これで、S3バックアップに接続されている(ただし上書きしない)、復元が簡単で、いかなる状況でも誰にもメールを送信できないステージングサーバーができました。完璧です!

ステージングサーバーに新しいバックアップを復元して、自由に操作できます。気に入らない場合は、再度復元するだけです。

オフ/オンの切り替え

ステージングサーバーを長期間「オン」のままにしておくと、Googleにインデックスされるリスクがあり、ユーザーが誤ってログインしてしまう可能性があります。それらは本番サイトのクローンであるため、これは非常に可能です。

これら2つの問題を軽減する簡単な方法は、Discourseをオフにすることです。

./launcher stop app

そして、使用できるようにオンに戻すには:

./launcher restart app

アップデート

プラグインやコードの観点から整合性を保つためには、ステージングサーバーと本番サーバーの両方を同時に更新/再構築する必要があります。app.ymlの変更も同様です。

S3を使用しない場合は、サーバー間でバックアップを手動で移動する必要があります。そして、それらは大きいです!

テストサーバーへのシード

ステージングサーバーが必要な場合は、Restore を介して実際のフォーラムから実際のデータでそれを populate する必要があります。問題の原因が特定のデータである場合があり、他のデータセットでフォーラムをテストすると、誤った安心感を得られる可能性があります。

しかし、Discourseがどのようなものかを確認するためのテストサーバーが必要な場合は、偽のデータで確認することをお勧めします。その場合は、次のようにします。

./launcher enter app
ALLOW_DEV_POPULATE=1 bundle install
ALLOW_DEV_POPULATE=1 rake dev:populate

これにより、フォーラムに偽のデータがシードされ、希望するテーマやプラグインでどのように見えるかを確認できます。まだフォーラムを開始していない場合は、これがどのように見えるかのアイデアを得ることができます。

2要素認証の管理

メインサイトのアカウントのユーザー名/パスワードはステージングサイトでも問題なく機能するはずですが、2FAの場合はそれほど簡単ではありません。問題が発生した場合は、2FAをオフにします。

./launcher enter app
rake users:disable_2fa[<USERNAME>]
「いいね!」 32

ネイサン、このガイドをまとめるのは素晴らしいアイデアですね。

見落としたかもしれませんが、この手順のどれがメールを無効にするのでしょうか?

「いいね!」 5

良い質問ですね。ジャンクSMTP認証情報を入力すると完全に防止できますが、次のようにメールをオフにするのも理にかなっています。

DISCOURSE_DISABLE_EMAILS = yes

また、リストアすると自動的にオンになるため、実際には必要ありません。

「いいね!」 8

OPにアプリをオフにするための手順を追加しました。

「いいね!」 2

はい、ログインリンクを取得できると便利な場合も多いため、次をお勧めします。

 DISCOURSE_DISABLE_EMAILS = 'non-staff'
「いいね!」 6

偽のユーザーを作成するセクションはどうでしょうか?ステージングサーバーに個人を特定できる情報を含めたくない管理者もいるかもしれません。大規模に偽のユーザーを作成したり、PIIを削除したりするために、皆さんは何を使用していますか?

本番環境からインポートしてから、それぞれに匿名化ジョブを実行することを考えましたが、それではステージングサイトが非常に退屈な見た目になってしまいます!

OPをWikiにすることは提案できますか?

いくつかのリンク:

https://hackernoon.com/ruby-on-rails-and-the-complexity-of-fake-user-profiles-made-simple-mf4j31gv

ウィキにしました。

一般的に、ステージングサイトには本番サイトと同じデータを使用して、実際のデータで問題なく動作するかをテストできるようにしたいものです。しかし、人々はDiscourseが何ができるかを見るために、使い始める前に偽のデータを使いたいと思うかもしれませんか?(ああ、それらのリンクにはもっと洗練された解決策があるようですね。)

どこかから名前のリストを取得して、ループでUser.createを実行できると思います。

「いいね!」 2

私の専門ではありませんが :slightly_smiling_face:、これは rake dev:populate を使用する良い機会でしょうか?

cd /var/www/discourse
ALLOW_DEV_POPULATE=1 bundle install
ALLOW_DEV_POPULATE=1 rake dev:populate

これは、ステージング環境/テストサイトのような本番サイトでも機能すると思います。

「いいね!」 4

それは障害にならないようです!

それは素晴らしい提案です:

タスクコード:discourse/populate.rake at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse (github.com)

ユーザー固有のアクション:

「いいね!」 1

素晴らしい!確かに、誰かがすでにこの問題について考えていました!

編集:そして、試しに最近インストールしたテストサイトでこれを試してみました。あなたの bundlerake タスクを貼り付けたところ、次のようになりました。

root@test2-app:/var/www/discourse# ALLOW_DEV_POPULATE=1 rake dev:populate
OK
カスタム `config/dev.yml` ファイルは検出されませんでした。デフォルトを変更できるファイルを作成します。
9件のグループレコードがあります。さらに6件作成します。
......
3件のユーザーレコードがあります。さらに27件作成します。
...........................
4件のカテゴリレコードがあります。さらに26件作成します。
..........................
'Recipes' (12) カテゴリで discourse-solved が有効になりました。
30件のサンプルタグレコードを作成します。
..............................
6件のトピックレコードがあります。さらに24件作成します。
........................
root@test2-app:/var/www/discourse# 

「いいね!」 3

これの大きな問題は、データセットがライブデータを表さなくなることです。

ステージングサーバーはライブを代表するものでなければなりません。そうでなければ、計画されている変更を本番環境に移行する前にすべてをテストすることはできません。

代表的でないテストが、ライブ環境で後に発生した問題を特定できなかった、かなり印象的な失敗をいくつか観察しました。ほとんどの場合、それらはデータの品質の問題によって発生しました。

たとえば、二重姓(ハイフンありとなし)やアクセント文字は、多大な問題を引き起こしました。

それが真のステージングサーバーである場合、ライブを正確に模倣する必要があります。コピーは通常のユーザーには表示される必要はなく、スタッフ以外のメールを無効にすることは非常に賢明ですが、それ以外の場合は問題を引き起こすだけです。

「いいね!」 5

ええ、同意します。私の質問は、ステージング環境に実際のクライアントのIDが含まれることを懸念していたクライアントからのものでした。

理想的には、名前とメールアドレスをランダム化し、それ以外はすべて同じにするスクリプトを用意すべきです。

「いいね!」 1

それはかなり簡単な会話のように聞こえます。代表的なコピーがない場合、ステージングサイトはありません。

ライブと同じように展開および保護されている場合、彼らの認識されるリスクは何ですか?

「いいね!」 2

スティーブンと一緒です。クライアントは、ステージングサイトに実際のデータがあることをより心配していますか、それとも実際のデータをテストしていないステージングサイトがないことを心配していますか?

本番環境の実際のライブデータでテストしていない場合、ライブデータを使用するとどうなるかわかりません。

そして、この議論は元の投稿から大きく逸れています。 :slight_smile:

「いいね!」 2

投稿は30日またはそれ以降に削除されるように設定すべきだと思います。OPに追加しました。偽のデータが役立つこともあります。私たちの中で最も疑い深い人(私自身を含む)は、実際のデータでテストされていないステージングサーバーを信頼しない現実的な理由があります。

「いいね!」 4

サイトで2FAを実装した後にいくつか問題が発生したため、以下を追加しました。

「いいね!」 1

すごい――それは最高でした!バダ・ビン・バダ・ブーム!

ダミーデータをインポートした後、とても生産的になった気分です…突然、テストフォーラムにたくさんのユーザー、投稿、タグ、カテゴリ、グループが自動的に表示されました…なんてことでしょう!

@nathank@pfaffman@merefield@JammyDodger@Stephen、本当にありがとうございます…なんてことでしょう!

Happy So Excited GIF

「いいね!」 5

コマンドライン経由でポップポーリングを無効にする方法について、おすすめを教えていただけますでしょうか。

DISCOURSE_pop3_polling_enabled=false という環境変数を設定するのが最善の方法です。

変数名はすべて大文字にする必要がありますが、携帯電話ではそれができません。

「いいね!」 2

本番フォーラムをS3とCloudFrontに移行しました。ステージングサーバーはすでに稼働していましたが、現在、本番環境やS3と同期が取れていません。別個のバケットとCDN接続が必要かどうかわかりません。ステージングサーバーのためだけに、追加のAWSコストをかけたくありません。おそらく、両方のサーバーを同じS3バケットに向けることは推奨されませんか?正しい方法は?

「いいね!」 1