Let's Encryptとリバースプロキシなしでのマルチサイト設定

これらの手順はベータ版と見なされ、標準的なセットアップに精通しているユーザー向けです

ただし、現時点(2023.02.11)ではこれらの手順は機能しません!! (letsencrypt 設定を更新して fullpath 部分を追加する方法については、Set up Let’s Encrypt with multiple domains / redirects を参照してください。これはすぐに反映するように更新します。)

私は数週間前にこのハウツーを作成しましたが、誰かにテストしてもらい、他の人にとっても機能するかどうかを確認してもらう必要があります。試した場合は返信して、機能したかどうか、また不明な点がないか教えてください。

それでは、本題に入ります…

このハウツーでは、2つの追加ホスト(合計3つ)を持つマルチサイトセットアップをセットアップする方法を大まかに説明します。

これは、動作中のDiscourse公式標準インストールまたは2コンテナインストール (Move from standalone container to separate web and data containers)があることを前提としています。

プライマリサイトのドメイン名

2番目のサイトのサブドメイン

3番目のサイトのサブドメイン

データベースパスワード (DISCOURSE_DB_PASSWORD と同じ) または app.yml 内の discourse

簡略化のため、これは =domain= という名前のメインサイトと、2つの追加サイト =two=.=domain= および =three=.=domain= のためのものです。好きな名前を使用できますが、このテンプレートの目的では、異なる short name (データベース名とサブフォーラムのタイトル用) と full hostname を持たない方が少し簡単です。

app.yml または web_only.yml のプラグインの後に hooks に追加

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         =two=:
           adapter: postgresql
           database: =two=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =two=.=domain=
         =three=:
           adapter: postgresql
           database: =three=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =three=.=domain=

  after_db_migrate:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

  after_ssl:
   # tell letsencrypt what additional certs to get
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # do not redirect all hosts back to the main domain name
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \(\$http_host[^\\}]*\)/m
        to: ""

app.yml または data.ymlafter_postgres セクションに追加

  - exec: sudo -u postgres createdb =two= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =two= to discourse;
        cmd: sudo -u postgres psql =two=
        raise_on_fail: false

    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
    - exec: sudo -u postgres createdb =three= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =three= to discourse;
        cmd: sudo -u postgres psql =three=
        raise_on_fail: false
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'

その後、

./launcher rebuild app

または

./launcher rebuild data
./launcher rebuild web_only
「いいね!」 10

試してみました。実は、初めて試した際も問題なく動作したので信じられず、二度試しました :smile: 行ったのは、ファイルをコピーし、ドメインとパスワードを調整して、2 つのコンテナによる新規インストールのそれぞれのファイルに貼り付けただけです :ok_hand:

不明な点があればご意見をください。ただ、この段落については少し考えさせられました:

これでは、手順に従うために 2 コンテナ構成が必要だと示唆しているように見えますが、実際にはそうではありません。また、なぜトピックの最初の投稿ではなく、48 番目の投稿へのリンクが貼られているのかも理解できませんでした。

「いいね!」 2

ありがとうございます!確認させていただきます。どちらも、あなたが私に教えてほしかったような不注意な点のようですね!

編集:ありがとうございます。2 つのコンテナに関するトピックで、現在の場所を不注意にコピーしてしまっていたので、それを修正し、動作するすべてのインストールで機能することを示すように言語を変更しました。

ありがとうございます!

「いいね!」 2

こんにちは
DigitalOcean で標準的な Discourse インストールを開始し、同じ droplet にいくつかの Drupal サイトを配置したいため、この手順 を参考に nginx を設定しました。
別の Discourse インスタンスを運用したい場合、上記の手順に従うべきでしょうか?

それとも、こちらのガイドの方が適していますか?

よろしくお願いいたします
/Sifaan

これらの手順は、リバースプロキシを使用しない場合向けです。Docker によるマルチサイト構成の手順に従うことをお勧めします。リンク先の手順が機能する可能性もありますが、まずはここで紹介されている手順に従うことを推奨します。

「いいね!」 2

ありがとうございます。その方法だと両方のサイトで同じSMTP設定を使ってしまうようですが、回避する方法はありますか?
それとも、他のガイドの方が良いでしょうか(既存のサイトをDockerネットワークに移すのに少し作業が必要そうに見えます)。
あるいは、別のコードベースを例えば/var/discourse2 にインストールすることは可能でしょうか?
(約500MBの容量が必要になりますが、頭を悩ませる手間を省けるならその価値はあります)。

はい。

マルチサイトを使用しないことです。

はい、可能です。ただし、2 コンテナ構成のインストールを作成し、web_only2.yml を用意する必要があります(2 つの app.yml 形式のファイルを持てるかもしれませんが、その場合、不要に 2 つの PostgreSQL インスタンスを実行することになります)。ただし、Redis インスタンスは 2 つ必要になると思います。

「いいね!」 3

ありがとうございます。データコンテナとウェブコンテナの分割について詳しくないため、こちらのガイド に従って、別のスタンドアロンコンテナを作成しました(certbot で作成された証明書も問題なく動作しているようです)。ただし、現在 Mailgun の設定に問題があるようです。Gmail へのアクティベーションメールは送信されますが、ドメイン登録業者(DreamHost)でホストされているメールへの送信は失敗しています :frowning:

追加の Postgres インスタンスによる負荷の増加はどの程度でしょうか?
分割に関するあなたの投稿を確認しました。もし節約効果が大きければ、試してみたいと思います。

おそらくそれほど大きくないでしょう。メモリが少し増える程度です。どのくらいかはあまりわかりません。

「いいね!」 1

最近、このガイドを試してみているのですが、いくつかの点で困っています:

  1. データベースのパスワードが見つかりません(あるいは、ファイル内でそれが何に使われているのかも分かりません)。
  2. 私の app.yml ファイルには当初、after_postgres セクションが含まれていませんでした。そのため、他のセクション(after_ssl、after_db_migrate など)に合わせるために、hooks の下に追加しました。もしこの配置が誤っている場合はお知らせください。私はこのような作業に全く慣れていません。
  3. http://www.yamllint.com/ で YAML ファイルの構文を確認すると、after_postgres セクションを hooks セクションの下に配置した行で (\u003cunknown\u003e): did not find expected key while parsing a block mapping というエラーが表示されます。

app.yml ファイルの編集手順についてご教示いただければ、大変助かります。

「いいね!」 2

シングルコンテナ構成を使用している場合は、パスワードが不要な場合もあるかもしれません(以前の投稿でその旨が示されています)。

ご提案のセクションを追加すれば、問題なく動作するはずです。

何が問題なのかは現時点ではっきりとしませんが、数日後にもう一度詳しく確認してみます。

「いいね!」 1

これを設定しようと考えています。友人とともに、より多くの投資を決定する前に、いくつかの異なるフォーラムをテストしたいと考えており、場合によっては別々のホスティングなども検討しています。

別々のドメインで運用することを考えていました。人々がメインのSMTPアドレスからのみメールを受信するため、多少の混乱が生じる可能性があることは理解していますが、別々のドメインが他にどのような問題を引き起こす可能性があるかご存知ですか?

Discourse には、ビジネスおよび標準顧客向けの単一ドメインがあります。通知メールアドレスは shortname@whatevermail.com のように自由に設定できます。

「いいね!」 2

それを聞いてとても嬉しいです、ありがとうございます!

「いいね!」 1

こんにちは、まずチュートリアルをありがとうございます。

残念ながら、単一のサーバー/IPで追加のDiscourseを実行する際に問題が発生しています。
まず、ドキュメントに従ってスタンドアロンサイトを起動しましたが、それは成功しました。
(例:test.john.com - 単一IPへのリダイレクトサブドメイン)
次に、さらにDiscourseを追加しようとしました(例:test.joe.comtest.doe.com - 他のサイトからの他のサブドメイン)。
あなたの手順に従おうとしましたが、うまくいかず、今は途方に暮れています。

いくつか質問があります。

  1. この2つのサイトはどのようにインストールされますか? /standalone.ymlcontainersディレクトリにコピーして名前を変更するようなものですか?そして、通常のインストールを行いますか?(例:./launcher rebuild joe
  2. あなたの指示では、変更はapp.ymlで行われ、上記のすべてのコードが追加されると記載されています。これは、最初に正常にインストールされたファイル(test.john.com)に追加されると想定していますか?

containerディレクトリ内のもの以外に、config/multisite.ymlを作成し、コードは以下のようになっています。

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# そして3番目のサイトの設定

他に設定する必要があるものがあるかどうかはわかりませんが。

どのような応答でも感謝します。ありがとうございます!

いいえ。説明されているとおりに app.yml に追加してください。これにより、コンテナ内に mutlisite.yml が作成されます。単一のインスタンスがあり、DNS がすべてそこを指している限り、すべてのドメインで機能します。これは、ドメイン名ごとに複数の Discourse コンテナを持つためのものではありません。

最後に確認したとき、それらの指示は記述どおりに機能しました。 app.yml に行を追加するだけで機能するはずです。他のファイルに触れる必要はありません。

「いいね!」 1

シングルサイトのノーマルセットアップは完璧に機能します。問題ありません。
しかし、マルチサイトのために多くの組み合わせを試しました。単一の app.yml 設定、または web_only.yml、data.yml などで分離しました。Docker でのマルチサイト設定や、スタンドアロンコンテナから Web およびデータコンテナへの移行に関する他のヒントも試しました。

移行部分に関しては、すべての組み合わせで常に失敗しました。

bundle exec rake multisite:migrate

**********************プロセスの最後の部分**************************
2023-02-11 17:50:43.853 UTC [61] LOG: シャットダウン中
162:M 11 Feb 2023 17:50:43.866 # ユーザーからのシャットダウン要求...
162:M 11 Feb 2023 17:50:43.866 * 終了前の最終RDBスナップショットを保存中。
162:M 11 Feb 2023 17:50:43.881 * DBはディスクに保存されました
162:M 11 Feb 2023 17:50:43.882 # Redisは終了準備ができました、さようなら...
2023-02-11 17:50:44.007 UTC [57] LOG: システムはシャットダウンされました。


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate はリターンコード #&lt;Process::Status: pid 582 exit 1&gt; で失敗しました
失敗場所: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec はパラメータ "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate" で失敗しました
ブートストラップは終了コード 1 で失敗しました
**ブートストラップに失敗しました** 上にスクロールして、以前のエラーメッセージを探してください。複数ある可能性があります。
./discourse-doctor が問題を診断するのに役立つかもしれません。

失敗するまでに作成されたものと作成されなかったものを確認しました。
サブドメインのデータベースは作成されましたが、移行は失敗しました。overlay2 フォルダーやその他の場所を確認したところ、サブドメインの nginx 設定や multisite.yml は作成されませんでした。

./launcher bootstrap、destroy、start、stop、rebuild、または fresh setup を何度も試しました…すべてのコマンドを試しましたが、何も起こりませんでした… :slight_smile:

このチュートリアルは v3.1.0.beta 2 でも有効ですか、それとも私が何か見落としていることはありますか?
何かアイデアがあれば教えてください。

「いいね!」 1

いいえ。Let’s Encrypt に関して、いつの間にか何かが変更されました。コンテナ内で複数のドメインを処理するために変更する必要があるすべての項目を詳しく見ていきましょう。

「いいね!」 1

このメソッドを使用しており、うまく機能しています。現在HTTPSを有効にしていないため、Let’s Encryptの難しさについてはコメントできません。

長年、ステージングサーバーでこのセットアップを使用しています。しかし、3.5.0.beta5-devにアップデートしてから、サブドメインを入力するとプライマリサイトにリダイレクトされるようになりました。

証明書の件で手間をかけずに済んでいたので、とても満足していましたが、今はかなり困っています。何が起こっているのかデバッグするためのツールはありますか?

「いいね!」 1