こんにちは
Difyについて連続投稿となりますので、ご容赦ください
今回は表題の通りEC2上にセルフホストしているDifyへ特定のIPからのみアクセス許可とLet’s Encrypt のACMEチャレンジは通すようにしてみました
なお、ユースケースとしては、特定組織(特定IP)からのみ利用できるAIアプリをDifyを利用して作成する場合を想定しています
また、Difyの構築や設定は下記記事を参照してください
【Dify】Dify(OSS版)をEC2上に独自ドメインとHTTPSで公開してみた
■対応方針
まず最初に要件は下記となります
・Difyの画面へは特定IPからのみ許可
・SSL化はLet’s Encrypt を利用しているため、ACMEチャレンジはすべて通す
そのうえで、要件を満たすために下記方針とします
・ファイアウォール(SG)側は原則HTTP/HTTPSを全開放として、Nginxのconfで / へのアクセスは特定IPからのみ許可 + /.well-known/acme-challenge/ へのアクセスは全許可とする
■手順
対応方針が決まったので、docker-compose上のNginxのテンプレート用confファイル と docker-entrypoint.sh を修正します
1. /root/dify/docker/nginx/conf.d/default.conf.template の修正
location / {
proxy_pass http://web:3000;
include proxy.conf;
}
↓
location / {
allow xxxx.xxxx.xxxx.xxxx; ※許可したいIP
deny all;
proxy_pass http://web:3000;
include proxy.conf;
}
2. dify/docker/nginx/docker-entrypoint.sh の修正
ACMEチャレンジ側は default.conf.template 内で ACME_CHALLENGE_LOCATION のプレイスホルダーを利用していたので、dockerコンテナ起動時に実行される docker-entrypoint.sh 側を書き換えます
if [ "${NGINX_ENABLE_CERTBOT_CHALLENGE}" = "true" ]; then
ACME_CHALLENGE_LOCATION='location /.well-known/acme-challenge/ { root /var/www/html; }'
else
ACME_CHALLENGE_LOCATION=''
fi
export ACME_CHALLENGE_LOCATION
↓
if [ "${NGINX_ENABLE_CERTBOT_CHALLENGE}" = "true" ]; then
ACME_CHALLENGE_LOCATION='location /.well-known/acme-challenge/ { root /var/www/html; allow all; }' ※全許可を設定
else
ACME_CHALLENGE_LOCATION=''
fi
export ACME_CHALLENGE_LOCATION
dockerの再起動
docker-compose down
docker-compose up -d
3. 動作確認
まずは許可IPから / へブラウザアクセスしてみます
→問題なくdifyのログイン画面とログイン後にホーム画面が表示されることを確認しました
次に許可IPから /.well-known/acme-challenge/ へアクセスしてみます
→ 404 なのでIPブロックはされてなさそうです
次に許可されていないIPから / へアクセスしてみます
XXXX.XXXX.XXXX.XXXX - - [27/Jun/2026:10:49:08 +0000] "GET / HTTP/1.1" 403 153 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 26_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/425.6.927981711 Mobile/15E148 Safari/604.1" "-"
→ 403 Forbidden となったことを確認しました
最後に許可されていないIPから /.well-known/acme-challenge/ へアクセスしてみます
XXXX.XXXX.XXXX.XXXX - - [27/Jun/2026:11:03:01 +0000] "GET /.well-known/acme-challenge HTTP/1.1" 403 153 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 26_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/425.6.927981711 Mobile/15E148 Safari/604.1" "-"
→ こちらも403 Forbidden となりました
■最後に
いかがでしたでしょうか
インフラ運用をしていると割と遭遇する要件であるので、それを Dify でも実現可能かどうか試してみましたが、割と簡単にできてよかったです
また、Dify 自体がそれなりに閉じられた空間で利用されるものかなとも考えているので、もし IP制限は必要だが、Let’s Encrypt のためにHTTPやHTTPSは全開放する必要があれば参考にしてみてください

