生成AIアプリ開発 DifyをローカルPCに構築してみる

## はじめに
Difyは、エンジニアが生成AIを活用したアプリケーションを迅速に構築・運用できるオープンソースのプラットフォームです。ChatGPTやClaude、Geminiなど複数のLLMに対応し、RAG（検索拡張生成）によって社内に閉じた情報も加えて高精度な回答システムを実現できます。ノーコードでチャットボットやQ&Aシステムを構築可能なほか、ドキュメントやWebページなどをインポートしてナレッジベース化し、業務システムと連携できます。さらに、REST APIを通じた外部連携もでき、業務効率化などに活用することができます。

Difyの技術がどのようなものなのか学ぶため、概要を把握した後、構築してみることにしました。

## Difyの導入形態

Difyを利用するには大きく分けて2つの形態があり、[クラウドサービス版、セルフホストサービス版](https://dify.ai/jp/pricing)があります

#### クラウドサービス版　3つのプラン
| プラン        | 月額料金   | メッセージ数/月 | チームメンバー数 | アプリ数 | 知識文書数 | ストレージ容量 | ナレッジリクエスト制限 | 注釈クォータ | ログ履歴   |
|----------------|------------|------------------|------------------|----------|-------------|----------------|------------------------|---------------|------------|
| SANDBOX        | 無料       | 200              | 1人              | 5個      | 50件        | 50MB           | 10回/分                | 10件          | 30日間     |
| PROFESSIONAL   | $59        | 5,000            | 3人              | 50個     | 500件       | 5GB            | 100回/分               | 2,000件       | 無制限     |
| TEAM           | $159       | 10,000           | 50人             | 200個    | 1,000件     | 20GB           | 1,000回/分             | 5,000件       | 無制限     |

#### セルフホストサービス版　3つのプラン

| プラン      | 料金         | 特徴                                                                 |
|---------------|--------------|----------------------------------------------------------------------|
| COMMUNITY     | 無料         | 個人ユーザー、小規模チーム、または非営利プロジェクト向け|
| PREMIUM       | AWS利用料金  | AWS Marketplace経由でのデプロイ。ロゴやブランドカスタマイズが可能。         |
| ENTERPRISE    | 要問い合わせ | 大企業向け。エンタープライズグレードのセキュリティ、コンプライアンス、拡張性、制御、およびより高度は機能を必要とする企業むけ。                    |

**今回の構築対象は、Difyのシステム的な仕組みを知るためにセルフホストサービス版とします。また、無料のCOMMUNITY版とします。**

## 構築前の確認

COMMUNITY版を[ローカルPCに構築する方法](https://docs.dify.ai/getting-started/install-self-hosted)には、「Docker Composeによるデプロイ」「ソースコードからビルド」の2つがあります。今回はとても手軽なDocker Composeの方で進めました。

#### 最小システム要件
[公式ページより引用](https://github.com/langgenius/dify/blob/main/README_JA.md#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88)
>Difyをインストールする前に、お使いのマシンが以下の最小システム要件を満たしていることを確認してください：
>
>CPU >= 2コア
>RAM >= 4GB

#### 私の環境
- MacBook Air 2022
    - Apple M2
    - メモリ 16GB
    - mac OS Sequoia 15.4
        - Docker Engine v28.0.4
        - Docker Desktop 4.40.0 (187762) 

## ローカルPCでの構築手順
[githubからコードをダウンロード](https://github.com/langgenius/dify)
<br>
https://github.com/langgenius/dify
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/9590f51f-5cda-476c-af18-cb94635f4793.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/b784b130-e913-4fc4-8c25-a5bcac2e1203.png" width="60%">
<br>
<br>

dify-main.zip がダウンロードされますので、ホームディレクトリなどに保存し、解凍します。
また、解凍された内容にdockerディレクトリがあるので、そこへ移動します

```
% cd dify-main/docker/
```
<br>

dockerディレクトリの中身。docker-compose.yamlが存在することを確認
```
% ls -al
total 496
drwxrwxr-x@ 20 XXXXXX  staff    640 Apr 16 18:13 .
drwxrwxr-x@ 41 XXXXXX  staff   1312 Apr 16 18:03 ..
-rw-rw-r--@  1 XXXXXX  staff  35075 Apr 16 18:03 .env.example
-rw-rw-r--@  1 XXXXXX  staff   7014 Apr 16 18:03 README.md
drwxrwxr-x@  5 XXXXXX  staff    160 Apr 16 18:03 certbot
drwxrwxr-x@  4 XXXXXX  staff    128 Apr 16 18:03 couchbase-server
-rw-rw-r--@  1 XXXXXX  staff  25019 Apr 16 18:03 docker-compose-template.yaml
-rw-rw-r--@  1 XXXXXX  staff   7948 Apr 16 18:03 docker-compose.middleware.yaml
-rw-rw-r--@  1 XXXXXX  staff  63694 Apr 16 18:03 docker-compose.png
-rw-rw-r--@  1 XXXXXX  staff  52259 Apr 16 18:03 docker-compose.yaml
drwxrwxr-x@  3 XXXXXX  staff     96 Apr 16 18:03 elasticsearch
-rwxr-xr-x@  1 XXXXXX  staff   4097 Apr 16 18:03 generate_docker_compose
-rw-rw-r--@  1 XXXXXX  staff   4815 Apr 16 18:03 middleware.env.example
drwxrwxr-x@  8 XXXXXX  staff    256 Apr 16 18:03 nginx
drwxrwxr-x@  3 XXXXXX  staff     96 Apr 16 18:03 pgvector
drwxrwxr-x@  4 XXXXXX  staff    128 Apr 16 18:03 ssrf_proxy
drwxrwxr-x@  4 XXXXXX  staff    128 Apr 16 18:03 startupscripts
drwxrwxr-x@  4 XXXXXX  staff    128 Apr 16 18:03 tidb
drwxrwxr-x@ 12 XXXXXX  staff    384 Apr 16 18:17 volumes
```
<br>

dockerディレクトリの中の .env.example を .env にコピー
このファイルにはDifyの動作に必要な設定情報が含まれており、docker-compose.yamlから参照される
```
% cp .env.example .env
```
<br>

docker composeする
```
% docker compose up -d
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/097853cb-d701-4990-adc0-fa506eefc907.png)
<br>

数分待つと、エラーや警告も無く終了しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/423522cd-8081-4474-bd2d-9130aa63546f.png)
<br>

ブラウザでローカル http://localhost/install にアクセスすると、Difyの初期設定画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/a012fa46-2263-40ca-9f36-e89cc69b08ba.png)
<br>

メールアドレスとパスワードを入力して、サインインします。
ちなみに入力したメールアドレスにメールは届いていませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/5f3bcafa-7c7f-4270-ac09-91224ad5da10.png)
<br>

あっけなくスムーズに、構築完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/7055b8dd-e8cb-4e56-ac52-d72d9150ff1b.png)
<br>

## dockerの状況確認
#### 起動中のdockerコンテナ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/5fb6d2f0-5b73-4c60-9066-43b902934a24.png)
<br>

#### dockerイメージ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/e9c5b698-963d-4fde-8754-8c6f25c379b9.png)
<br>

#### ボリューム一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/fc2a8130-9d53-4816-8b9b-10eae187c119.png)
<br>

ボリュームの中身をちょっと覗いてみると、access.log が見受けられる
```
%  docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
71daa2c787b0: Pull complete 
Digest: sha256:00cd074b40c4d99ff0c24540bdde0533ca3791edcdac0de36d6b9fb3260d89e2
Status: Downloaded newer image for debian:latest

sh-5.2# 
sh-5.2# ls /var/lib/docker/volumes/
a59b38899b0a92eb729dcc170ef50b2c0b6704237401439c849c826e464f6344  backingFsBlockDev  bda4a2c0a7f39bd029cc0600ba9648d1a12c7408335a5c2fb68ee38a0762f1de  metadata.db


sh-5.2# cd /var/lib/docker/volumes/a59b38899b0a92eb729dcc170ef50b2c0b6704237401439c849c826e464f6344/_data/
sh-5.2# 
sh-5.2# 
sh-5.2# cat access.log 
1744797823.999   1752 172.18.0.8 TCP_TUNNEL/200 326100 CONNECT marketplace.dify.ai:443 - HIER_DIRECT/172.67.71.187 -
sh-5.2# 
sh-5.2# exit

```

## 再起動手順
```
% docker compose down
% docker compose up -d
```
<br>

## おわりに
今回、Difyのコミュニティ版を使用し、mac osのローカルにdocker composeで構築を行いました。
特に詰まる部分はなく、すんなり構築できました。

次回は、この環境でOpenAIのAPIと連携する設定を行う予定です。
<br>

以上です。