Cloudflareでのサブフォルダ設定

すでにメインサイトが稼働中で、ルートドメインを一時的であってもフォーラムサーバーに向けることができない場合に、Cloudflareとサブフォルダーをセットアップした手順を共有したいと思います。

主要なポイント

  • 既存の mywebsite.com は現在 1.1.1.1 を指しており、稼働中です。
  • mywebsite.com/forum(およびそのサブディレクトリ)を 2.2.2.2 にルーティングする必要があります。
  • Discourseのインストール中、ドメインが現在のサーバーを解決しているかを確認するLetsEncryptの検証をパスできないため、DNS検証を使用する必要があります。

app.yml の変更

Letsencrypt の更新

新しいLetsEncryptテンプレートを作成し、このトピックに従って app.yml に設定します: LetsEncrypt DNS Validation Template Using Cloudflare

ただし、その投稿から issue_cert メソッドのみをコピーし、残りのコンテンツは元の web.letsencrypt.ssl.template.yml から取得するようにしてください(トピック投稿後に変更されたため)。

LETSENCRYPT_CF_TOKEN: ""
LETSENCRYPT_CF_ACCOUNT_ID: ""
LETSENCRYPT_CF_ZONE_ID: ""
LETSENCRYPT_DNS_PROVIDER: "dns_cf"
  • Cloudflareトークンは、CFのマイプロファイル → 「APIトークン」ページから作成できます。
  • アカウントIDとゾーンIDは、ドメインの概要ページに表示されます。
  • DNSプロバイダーの値は上記のように設定してください。

サブフォルダーの更新

このトピックに従って Serve Discourse from a subfolder (path prefix) instead of a subdomainenv: の下に DISCOURSE_RELATIVE_URL_ROOT: /forum を設定し、run: セクションを更新します。
ユーザーIPに関するこの投稿を参照してください: Serve Discourse from a subfolder (path prefix) instead of a subdomain - #111 by varun21

再構築

app.yml を変更した後、再構築コマンドを実行する必要があります。Discourseはドメインが現在のサーバーのIPを解決しているかを確認するため、このチェックをスキップする必要があります(mywebsite.com はすでに 1.1.1.1 を指しており、Discourseはルートドメインをチェックします)。そのため、次を実行します:

./launcher rebuild app --skip-connection-test

Cloudflare のセットアップ

/forum2.2.2.2 にルーティングするためにWorkersを使用することを推奨する人もいますが、私はロードバランシングでより簡単に実現できることを見つけました。Workersでは、ロケットローダーやその他の類似設定を無効にしても、CSS/JS関連の問題を解決できませんでした。したがって、

  • ロードバランシングを有効にします(トラフィックの下)。
  • 「プールを管理」->「作成」を選択します。
  • 2つのプール(メインサイト用とフォーラム用)を作成します。それぞれに1つのエンドポイントのみを含める必要があります。

  • ホスト名が mywebsite.com になるようにロードバランサーを作成します。
  • エンドポイントセクションで、両方のプールを選択します。
  • モニターをスキップします(サーバーのヘルスを監視する必要はありません。メインサイトは常に 1.1.1.1 を指し、フォーラムは 2.2.2.2 を指す必要があります)。トラフィックステアリングをスキップします(デフォルトはオフです)。
  • カスタムルールで、パス条件を /forum として1つ作成し、フォーラムのエンドポイントにポイントします。

  • 保存/デプロイします。

注意点

  • 何らかの理由で、サンプル app.yml をコピーして再構築しても機能しませんでした(おそらく私が何か間違っていたのでしょう)。そのため、解決策として、最初に別のドメインで discourse-setup を実行し、その後、上記の他の app.yml の変更とともにホスト名を変更し、最終的な再構築を実行しました。
  • DiscourseはLetsEncryptから2つの証明書(RSA certECDSA cert)を生成します。LetsEncryptは、1つの正確なドメインあたり週に5つの証明書という制限があります。2回連続で何か間違えると、3回目の試行では1つの証明書しか発行されず、フォーラムは機能しません(このスクリプト GitHub - sahsanu/lectl: Script to check issued certificates by Let's Encrypt on CTL (Certificate Transparency Log) using https://crt.sh で現在の制限を確認できます)。
  • CFロードバランシングは無料ではありませんが、(現時点では)500k DNSリクエストあたり5ドルのコストを考慮すると、Nginxなどでの手間と比較して、それだけの価値があると思います。