Let's EncryptとリバースプロキシなしでのMultisite Configurationセットアップ

These instructions should be considered beta and for those familiar with a standard setup

But right now (2023.02.11) these instructions do not work!! (See Set up Let’s Encrypt with multiple domains / redirects for how to update the letsencrypt setting to add the fullpath part. I’ll update this to reflect those changes Real Soon Now.)

I developed this howto a couple weeks ago but need someone to test and see if this works for someone else. Please reply if you try and let me know whether it works and if anything is unclear.

And on with the show. . .

This howto documents broadly how to set up a multisite setup with 2 additional hosts (3 total).

It assumes that you have a working Discourse official Standard Installation or 2-container installation (Move from standalone container to separate web and data containers).

Domain name for primary site

subdomain for the 2nd site

Suddomain for the 3rd site

Database password (same as DISCOURSE_DB_PASSWORD) or discourse in app.yml

For the sake of simplicity, this is for a main site called =domain=, with two additional sites =two=.=domain= and =three=.=domain=. You can use whatever names you want, but for the sake of this template, not having a different short name (for the database name and title for the sub-forum) and full hostname is a bit easier.

add in hooks after the plugins in app.yml or web_only.yml

  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: ""

Add to the after_postgres section in app.yml or data.yml

  - 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;"'

After that,

./launcher rebuild app

or

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

I just tried it out, in fact I tried it twice because I couldn’t believe it just worked without any problems the first time already :smile: All I did was copying, adjusting the domains and password and then pasting into the respective files of a fresh installation with 2 containers. :ok_hand:

Regards feedback whether anything is unclear, I only had to mull a bit over this paragraph:

It seems to suggest a 2-container setup is necessary to follow along, but then it isn’t. And I didn’t understand why it links to post 48 of the topic, rather than the initial post.

「いいね!」 1

Thanks! I’ll take a look. Those both seem like the kind of careless things I was hoping you’d let me know about!

EDIT: Thanks! I’d carelessly copied my current location in the 2-container topic, so I fixed that, and changed the language to say that it’ll work with any working installation.

Thanks!

「いいね!」 2

Hi
I started with a standard Discourse install (at DigitalOcean), then setup nginx (using these instructions) because I wanted a couple of Drupal sites on the same droplet
If I want to have another instance of Discourse should I follow the above?

Or would this guide be better?

Thanks!
/Sifaan

These instructions are for not using a reverse proxy. I’d recommend that you follow Multisite configuration with Docker. The instructions that you linked might work, but I’d recommend that you first follow what’s here.

「いいね!」 1

Thanks; I notice that with that both sites would use the same SMTP config :frowning:
is there a way to bypass that?
or would the other guide be better (looks like it might require some work to put the existing site on the docker network)

alternately, is it possible to install another codebase, say /var/discourse2 ?
(it will cost me ~500MB but worth it if it saves me the brain damage)

Yes.

Don’t use multisite.

Yes, but you just need to create a 2-container installation and then have a web_only2.yml. (I think that you can have 2 app.yml-style files, but then you’re needlessly running two postgres instances). I think, though, that you do need two redis instances.

「いいね!」 3

Thanks; because I am not too familiar with splitting the data and web container I just created another standalone container following these guidelines (and certificates created by certbot seem to be working). However currently there seems to be an issue with mailgun config - it sends activation emails to gmail but anything mail hosted at my registrar (dreamhost) is failing :frowning:

How much of a extra load would the extra Postgres instance causing?
I looked at your post about splitting and will try it if the savings were significant.

Probably not that much. Just a bit of RAM. I have little idea how much.

「いいね!」 1

Recently I’ve been giving this a try, but I’m having trouble with a couple of things in the guide:

  1. I can’t seem to find the Database password (or what it is even used for in the file)
  2. My app.yml file did not originally contain an after_postgres section, so I added one under hooks to match the others (after_ssl, after_db_migrate, etc.). If this is placed in the wrong section, please let me know, I’m completely new to working with this type of stuff.
  3. When I check the syntax of the YAML file on http://www.yamllint.com/ I get (<unknown>): did not find expected key while parsing a block mapping on the line where I put the after_postgres section under the hooks section.

If you could clarify the steps for editing the app.yml file, that would be greatly appreciated.

「いいね!」 2

Maybe you don’t need a password if you’re using a single container setup (an earlier post suggests that).

Adding the section as you suggest should work.

I can’t quite the what might be wrong. I’ll try to take a closer look on a couple of days.

「いいね!」 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にアップデートしてから、サブドメインを入力するとプライマリサイトにリダイレクトされるようになりました。

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