1PanelでデプロイされたDiscourseにおいて、すべてのユーザーのIPがCloudflareから来ていると表示され、ブラウザの実際のIPが反映されない問題を解決する

VPS に 1Panel をインストールし、Discourse(コンテナデプロイ)をインストールしました。さらに OpenResty(コンテナデプロイ)を使用してリバースプロキシを設定しています。ドメインは Cloudflare でホスティングされており、CDN(黄色の雲アイコン)を有効化しています。以下は、ユーザーの IP が Cloudflare 経由ではなく、ユーザーのブラウザの実際の IP として表示されるようにするための解決策です。

1. 1Panel でスケジュールタスクを作成し、毎週最新の Cloudflare IP リストをダウンロードして OpenResty の設定ディレクトリに保存する

  1. 1Panel の左側メニューバーで 「スケジュールタスク」 をクリックします。

  2. 右上の 「スケジュールタスクを作成」 をクリックします。

  3. 以下のパラメータに従って入力します(そのままコピー&ペーストしてください):

  • タスクタイプShell スクリプト を選択します。

  • タスク名:例 Cloudflare の IP セグメントを自動更新

  • 実行サイクル毎週 を推奨します(例:毎週土曜日 午前 03:00)。

  • スクリプト内容:以下のコード全体をそのままコピーして貼り付けてください(注意:コードの最上部にあるコンテナ名と設定ディレクトリパスを先に修正してください):

#!/bin/bash
# 設定エリア
CONTAINER_NAME="1Panel 内の openresty コンテナ名"
# 指定されたウェブサイトの proxy ディレクトリに変更してください
CONF_DIR="/opt/1panel/www/sites/www.あなたのウェブサイトドメイン.club/proxy"

echo "[$(date)] Cloudflare 公式から最新の IP セグメントをプル開始..."
TEMP_DIR=$(mktemp -d)

# IP リストをプルして Nginx が認識できる形式に変換
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v6.conf

# ファイルをチェックして移動
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
    mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
    mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
    echo "[$(date)] 設定ファイルが $CONF_DIR に正常に更新されました。"
else
    echo "[$(date)] エラー:Cloudflare IP のプルに失敗しました!"
    rm -rf $TEMP_DIR
    exit 1
fi
rm -rf $TEMP_DIR

# Nginx のテストとリロード
echo "[$(date)] Nginx 設定のテストを実行中..."
if docker exec $CONTAINER_NAME nginx -t; then
    docker exec $CONTAINER_NAME nginx -s reload
    echo "[$(date)] 成功!OpenResty 設定のリロードが完了しました。"
else
    echo "[$(date)] 失敗!Nginx 設定テストに合格しませんでした。"
    exit 1
fi

タスクが作成できたら、土曜日まで待つ必要はありません。すぐにテストできます。「スケジュールタスク」リストで先ほど作成したタスクを見つけます。

右側の 「レポート」 ボタンをクリックします。表示されるログウィンドウを確認してください。最後の数行に 成功!OpenResty 設定のリロードが完了しました と表示されていれば、1Panel 内でのプロセスは完全に正常に実行されたことを意味します!

2. OpenResty に realip 設定を追加する

ホストマシンの /opt/1panel/www/sites/www.あなたのウェブサイトドメイン/proxy/ ディレクトリ内に、新しいファイルを作成します(ファイル名は任意ですが、.conf で終わる必要があります。メイン設定の include *.conf によって自動的に読み込まれます):realip.conf

# コンテナ内のパスを使用
include /www/sites/www.あなたのウェブサイトドメイン/proxy/cf-ips-v4.conf;
include /www/sites/www.あなたのウェブサイトドメイン/proxy/cf-ips-v6.conf;

real_ip_header CF-Connecting-IP;
real_ip_recursive on;

3. OpenResty をリロードする

docker exec 1Panel 内の openresty コンテナ名 nginx -t
docker exec 1Panel 内の openresty コンテナ名 nginx -s reload

4. OpenResty が実際の IP を取得しているかを確認する

OpenResty の access log を確認します:

tail -f /opt/1panel/www/sites/www.あなたのウェブサイトドメイン/log/access.log

設定が正しければ、ログ内の最初の IP は Cloudflare の 173.245.x.x などのセグメントではなく、あなたの実際のグローバル IP に変わっているはずです。

5. Discourse 側

app.yml を編集し、run: コードブロック内に以下内容を追加します:

  # docker で discourse をデプロイした後、以下の 3 つのセクションを追加して、フォーラムユーザーの実際の IP が渡されるようにします
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-docker.conf
      chmod: 644
      contents: |
        set_real_ip_from 172.16.0.0/12;
        set_real_ip_from 127.0.0.1;
  
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
      chmod: 644
      contents: |
        real_ip_header x-forwarded-for;
  
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
      chmod: 644
      contents: |
        real_ip_recursive on;

これにより、Discourse 組み込みの Nginx は以下を行います:

  1. Docker ネットワークセグメント(172.16.0.0/12)を信頼します
  2. x-forwarded-for から実際の IP を読み取ります
  3. 複数のプロキシ階層を再帰的に解析します

6. 備考

Discourse の app.yml に - "templates/cloudflare.template.yml" を追加することは、Discourse が直接 Cloudflare に接続されている場合のみ有効です。中間に OpenResty リバースプロキシが追加されているため、Discourse コンテナが認識するソース IP は実際には Docker ゲートウェイ(例:172.17.0.1 または 172.18.0.1)となります。そのため、このテンプレート内の set_real_ip_from <CloudflareIP> は一致しません。

したがって、Discourse の app.yml に - "templates/cloudflare.template.yml" を追加する必要はありません。


2026-07-03 更新

「いいね!」 2

参照

処理するエンドユーザーの実際のIPの「信頼チェーン」 - ドキュメント / セルフホスティング - Discourse Meta

トピック投稿を更新する。