ウェブサービスを作っています。

Rails + Kamal + Cloudflare で訪問者の IP アドレスを取得する

Cloudflare を使っていると、Rails の request.remote_ip に訪問者の IP アドレスではなく、Cloudflare の IP アドレスが入ってきてしまいます。

cloudflare-rails という gem でこの問題が解消されるはずなのですが、なぜかうまくいかず悩んでいました。

原因は、Kamal が使っている Traefik が、Rails に X-Forwarded-For ヘッダを渡していないためのようでした。

というわけで、対応策を書いていきます。Kamal のバージョンは 1.3.1、Traefik のバージョンは 2.9 です。


まず、cloudflare-rails gem を入れます。

Gemfile

group :production do
  gem 'cloudflare-rails'
end

次に、Traefik が X-Forwarded-* ヘッダを渡すように、Kamal で起動オプションを設定します。

信頼できない IP アドレスの除去は cloudflare-rails gem がやってくれます。

config/deploy.yml

traefik:
  args:
    entrypoints.http.address: ':80'
    entrypoints.http.forwardedHeaders.insecure: true

Traefik を再起動して、デプロイします。

kamal traefik reboot
kamal deploy

以上で、request.remote_ip が訪問者の IP アドレスを返すようになるはずです。