改めてはじめまして!花王株式会社の @masa-asa と申します。
少し前から個人的に記事を投稿していましたが、今回から「Kaoエンジニアコミュニティβ」のメンバーとしても参加します。よろしくお願いします!
本記事の本題ですが、DifyというOSSがあります。
DifyはAIアプリ開発のためのOSSです。Difyを用いるとGUIでAIチャットボットやエージェント、ワークフローの作成が可能で、OpenAIやGemini、Amazon Bedrockなどをはじめとして、多くのモデルを利用可能です。
さらに、Dockerを用いてローカルで動作することができるので、個人でAIについて学んだり、触ってみたいときにも簡単に使うことができる非常に便利なOSSです。
今回、Difyをローカルで使おうとしたところ、起動時に404エラーがでてしまう問題にあたってしまったので対策として共有します。
環境は以下の通りです。
- Difyへのアクセス環境:Windows11のブラウザ(Edge,Google Chrome)
- Difyの実行環境:wsl2上のDockerで起動
Difyのローカルでの実行方法
Difyをローカルで使えるようにするための作業は非常に簡単です。以下のリンクを参考に実施できます。
-
githubリポジトリのクローン
git clone https://github.com/langgenius/dify.git
-
所定のディレクトリに移動
cd dify/docker
-
環境変数ファイルのコピー
cp .env.example .env
-
dockerの起動
docker compose up -d
dockerコンテナ群がすべて正常に立ち上がったら準備完了です!
ブラウザからhttp://localhost/install
にアクセスするとDifyの初期画面に遷移します!
正常に起動すると↓のような画面になります。
404になった...
wsl2でdocker compose up -d
コマンドを打ってみます
12個のコンテナが正常に起動しました!それではブラウザでアクセスしてみます。
図のように404になってしまいます。コンテナは正常に起動しているのに...
原因
docker ps | grep nginx
コマンドで確認してみます。nginxは正常に起動していそうです。
またcurl -I http://localhost/
とcurl -I http://localhost/apps
を実行した結果です。
wsl2内でnginxは正常に起動して動作も問題なさそうです。
では、Windows側を確認してみます。「コマンドプロンプト」を起動して次のコマンド
netstat -ano | findstr :80
を実行します。
実行結果を見ると、Windows側でPID 4(System)が80番ポートを占有しています。このため、Docker(WSL2)のnginxが80番ポートで待ち受けできず、アクセスしてもDocker側に届いていないことがわかります。
対策
クローンしたリポジトリのdify/docker
ディレクトリ構成を見てみるとこのようになっています。
.
..
.env
.env.example
README.md
certbot
couchbase-server
docker-compose-template.yaml
docker-compose.middleware.yaml
docker-compose.png
docker-compose.yaml
elasticsearch
generate_docker_compose
middleware.env.example
nginx
pgvector
ssrf_proxy
startupscripts
tidb
volumes
.env
ファイルを開き、「nginx」などで検索するとポートを指定している箇所があります。
「EXPOSE_NGINX_PORT」の部分はデフォルトで80になっているかと思います。
こちらをwindows側で使用していないポートに変更します。下の例では8888になっています。
------------------------------中略------------------------------
# ------------------------------
# Docker Compose Service Expose Host Port Configurations
# ------------------------------
EXPOSE_NGINX_PORT=8888
EXPOSE_NGINX_SSL_PORT=443
------------------------------中略------------------------------
確認のため、Windows側でnetstat -ano | findstr :8888
を実行します。8888番ポートは使われていないので使えそうです。
それでは、もう一度dockerコンテナを再作成します。念のため強制的にコンテナを再作成するオプションを付けてdocker compose up -d --force-recreate
を実行します。
改めてdocker ps | grep nginx
コマンドを実行すると、ポートのマッピングが8888番に変更されていることがわかります。
Windows側もwsl2のDocker側と接続できているようです。
それでは、もう一度ブラウザからDifyにアクセスしてみます。http://localhost:8888/install
で8888ポートを指定します。
出ました!ここからは通常通り進めていけば、ローカルでDifyを動作させることができます。
おわりに
今回の原因は、Windows側で80番ポートが占有されていたことでした。
修正箇所は1か所で単純ですが、私は原因の特定にハマってしまい時間がかかってしまったので、同じ症状の方の助けになればと思います。
DifyはLLMを使いこなす上で便利なツールですので、活用していきたいです!