Difyのローカルインストール手順

## はじめに

Difyをローカル環境にインストールする手順です。Difyはwebで動くようになっているため、Dockerでnginxを動かす環境をローカルに構築して、webで接続することになります。

## 環境

Ubuntu20.4　(Windows10 + Vagrant)

## 公式サイトの手順
https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose#difynokurn

## 手順

Difyのソースコードをローカルにクローンします。

```
$git clone https://github.com/langgenius/dify.git
```

ディレクトリに移動します。

```
$cd dify/docker
```

環境ファイルを作成します。

```
$cp .env.example .env
```

Docker composeがインストールされているか確認します。インストールされている場合、バージョンも確認します。

```
$docker compose -v
$docker compose version
Docker Compose version v2.32.4
```

Docker Compose を起動します。この後、多少時間がかかります。

※自分の環境は、Docker Compose V2なので、次のコマンドで起動しますが、Docker Compose Vの場合はコマンドが若干異なります。

```
$docker compose up -d
```

最後にこのようにコンテナの状態が表示されます。

```
[+] Running 10/11
 ✔ Network docker_ssrf_proxy_network  Created                                                                                      1.4s
 ✔ Network docker_default             Created                                                                                      0.2s
 ✔ Container docker-redis-1           Started                                                                                     11.5s
 ✔ Container docker-web-1             Started                                                                                     11.5s
 ✔ Container docker-weaviate-1        Started                                                                                     11.6s
 ✔ Container docker-sandbox-1         Started                                                                                     11.5s
 ✔ Container docker-db-1              Started                                                                                     11.5s
 ✔ Container docker-ssrf_proxy-1      Started                                                                                     11.7s
 ✔ Container docker-api-1             Started                                                                                      9.7s
 ✔ Container docker-worker-1          Started                                                                                      9.6s
 ⠼ Container docker-nginx-1            Starting
```

Docker composeで動作するプロセスをすべて表示して、正常に動作していることを確認します。

```
$docker compose ps
```

api / worker / web の3つがビジネスサービスで、weaviate / db / redis / nginx の4つが基礎コンポーネントとなります。

```
NAME                  IMAGE                              COMMAND                  SERVICE      CREATED         STATUS                   PORTS
docker-api-1          langgenius/dify-api:0.15.2         "/bin/bash /entrypoi…"   api          2 minutes ago   Up 2 minutes             5001/tcp
docker-db-1           postgres:15-alpine                 "docker-entrypoint.s…"   db           3 minutes ago   Up 2 minutes (healthy)   5432/tcp
docker-redis-1        redis:6-alpine                     "docker-entrypoint.s…"   redis        3 minutes ago   Up 2 minutes (healthy)   6379/tcp
docker-sandbox-1      langgenius/dify-sandbox:0.2.10     "/main"                   sandbox      3 minutes ago   Up 2 minutes (healthy)
docker-ssrf_proxy-1   ubuntu/squid:latest                "sh -c 'cp /docker-e…"   ssrf_proxy   3 minutes ago   Up 2 minutes             3128/tcp
docker-weaviate-1     semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   weaviate     3 minutes ago   Up 2 minutes
docker-web-1          langgenius/dify-web:0.15.2         "/bin/sh ./entrypoin…"   web          3 minutes ago   Up 2 minutes             3000/tcp
docker-worker-1       langgenius/dify-api:0.15.2         "/bin/bash /entrypoi…"   worker       2 minutes ago   Up 2 minutes             5001/tcp
```

ここで更に、Difyのソースコードをgitでpullします。

```
$cd dify/docker
$git pull origin main
```

downコマンドを実行してupされているDockerイメージを削除します。pullコマンドでDocker HubからDockerイメージを取得します。そして、upコマンドで再びDockerイメージを作成して起動します。

```
$docker compose down
$docker compose pull
$docker compose up -d
```

公式サイトにこのような記述があります。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/ed1d437f-4ca8-cabd-c3ba-5d4c8bc4aa63.png)

「えーっ！なにー！」と仰天しながら自分の環境を確認してみると、上記のコマンドを実行しても、初回に「git clone https://github.com/langgenius/dify.git」 したときから、「.env.example」のタイムスタンプは変わっていませんでした。

ブラウザでURLにこのように指定するとローカルのDifyが起動します。

```
http://your_server_ip/install
http://192.168.33.10:8080/install
```

このような画面が起動すればOKです。

![無題02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/04ef04b4-acd1-5ba1-9dbc-7947af428d33.png)

## トラブルシュート

Dockerの起動でNginxの起動がエラーになったためそのトラブルシュートです。

```
$docker compose up -d
```

上記のコマンドを実行すると、つぎのエラーが出ました。
nginxを起動しようとしたが、ポート80番が既に使われていますといった内容です。

```
Error response from daemon

: driver failed programming external connectivity on endpoint docker-nginx-1 
: failed to bind port 0.0.0.0:80/tcp
: Error starting userland proxy
: listen tcp4 0.0.0.0:80
: bind: address already in use
```

80番を握っているサービスを調べたところ、案の定、Apache2が握っていました。

```
$lsof -i :80
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2 1127     root    4u  IPv6  27713      0t0  TCP *:http (LISTEN)
apache2 1147 www-data    4u  IPv6  27713      0t0  TCP *:http (LISTEN)
apache2 1148 www-data    4u  IPv6  27713      0t0  TCP *:http (LISTEN)
```

nginxのポート番号をデフォルトの80番から別の番号（8080）にカスタマイズします。

>参考記事
https://zenn.dev/shimiyu/articles/f74b85f7c795a5#%E3%83%9D%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0

ポート番号をカスタマイズするには、dify/docker/docker-compose.yamlを編集します。

```dify/docker/docker-compose.yaml
 ports:
      - '8080:80'                                                # この１行を追加
      # - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
      # - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
```

編集の内容はこのようになります。

```
- '変更後ポート番号:変更前ポート番号'
```

ブラウザから接続するときは、ポート番号を明示的に指定する必要があります。

```
http://your_server_ip/install                  # ポート80で接続
http://your_server_ip:8080/install             # ポート8080で接続
```