会社員が社内向けにプライベート環境の Dify を簡単に立ち上げる方法

こんにちは、皆さん！今日は社内向けにプライベート環境のDifyを立ち上げる方法を、ちょっと簡単に、理解重視ではなく、今後振り返って作業をしやすい形で、まとめてみました。


### やりたいことはコレ！

社内で自分たち専用のDify環境を立ち上げたい。LLMサービスの公式な利用などはまだまだ会社で禁止されている、もしくは利用の方向性が定まっていないところがあるので、プライベート環境で、ちょっと手を動かして、少し知恵を絞れば、いろいろ試せる環境を社内に使って他の方々、先輩たちに実験してもらえるようにします。


### 全体の手順サマリー

1. **AzureでOpen AIのAPIを作成**
   - AIの頭脳部分を用意します。AzureポータルでAPIを作成し、必要な設定を行います。

2. **Azureで仮想マシンを作成**
   - AIアプリやデータベースを動かすための仮想マシンを作成します。Ubuntuを選ぶのがオススメです。

3. **Dockerをインストール**
   - 仮想マシンにDockerをインストールし、Difyを動かすためのコンテナ環境を準備します。

4. **DifyのGitHubからDockerイメージをダウンロードし、Compose**
   - Difyの公式GitHubからDockerイメージを取得し、Docker ComposeでDifyを立ち上げます。

5. **AzureのNSGでIPフィルタを設定**
   - セキュリティを強化するために、IPフィルタを設定し、不正アクセスを防ぎます。必要に応じてVPN接続の設定も検討します。

6. **AzureのOpenAI ServiceとDifyを連携**
   - Difyの設定画面から、AzureのOpenAI Serviceと連携させ、APIキーを設定します。

7. **Difyを使用開始**
   - さっそくDifyを使って、AIの力を活用したワークフローを社内で展開します。



---


### 1. AzureでOpen AIのAPIを作成

まずは、AIの「頭脳」にあたるOpenAI APIを作成します。Azureポータルにログインして、手順に従ってOpenAIリソースを作成しましょう。これは、プロジェクトの土台となる重要なステップです。Azure上でモデルを展開し、APIキーを取得することで、Difyと連携する準備が整います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/25b59c92-688d-a6a9-87ca-709fac407dd5.png)


リージョンについては、展開モデルの準備状況があるので、最新の情報をチェック。文章中にガイドがありますが、最新の、 **GPT-4o 2024-08-06** をテストするにはAzure AI 早期アクセス プレイグラウンド (プレビュー) にサインインしてください。


Azure 公式ドキュメント
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models#model-summary-table-and-region-availability


Azure OpenAIサービスを利用するためには、以前はプレビュー申し込みが必要でしたが、現在では特に追加の申請は不要です。具体的には、GPT-4の利用に関しては、2023年10月の時点で別途のアクセス申請が不要となっています。

自分は、4o-miniを使いたいので、EastUSにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/7b8dc0bb-dfd5-9890-d79c-5ba8b73ddcf5.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/da903d33-1e28-64e0-6e40-1560b0019b52.png)



### 2. Azureで仮想マシンを作成

次に、Difyを動かすための「家」にあたる仮想マシンを用意します。ここでは、Ubuntuの仮想マシンを使います。どの仮想マシンサイズを選ぶかは、使用するリソース量に応じて決めましょう。後からサイズ変更もできるので、初期設定は無理のない範囲で。

ポイント:
- Azureポータルで「仮想マシン」を作成。
- Ubuntu 22.04 LTSを選択し、推奨されるVMサイズを選びます。
- セキュリティグループやディスクの設定を行い、作成を完了。


自分は以下のものにしました。


```
オペレーティング システム:  Linux (ubuntu 22.04)
サイズ: Standard E2s v5 (2 vcpu 数、16 GiB メモリ)
```

サイズは後で気軽に？変えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/3766a27a-ead0-aa7a-552f-a0d0dd6da405.png)



### 3. Dockerをインストール

仮想マシンができたら、Dockerをインストールしてコンテナ環境を整えます。Dockerを使うことで、Difyを簡単にセットアップし、管理することができます。インストール手順はシンプルで、数行のコマンドで完了します。

### 手順 1: Dockerのインストール

まず、UbuntuサーバーにDockerをインストールします。

1. **パッケージの更新と依存関係のインストール**

   Ubuntuのパッケージリストを更新し、必要なパッケージをインストールします。

   ```bash
   sudo apt-get update
   sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
   ```

2. **Dockerの公式GPGキーを追加**

   Dockerの公式GPGキーをシステムに追加します。

   ```bash
   sudo mkdir -p /etc/apt/keyrings
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
   ```

3. **Dockerリポジトリをセットアップ**

   DockerのリポジトリをAPTソースに追加します。

   ```bash
   echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
   ```

4. **Dockerのインストール**

   リポジトリを追加したら、Docker Engine、CLI、コンテナランタイムをインストールします。

   ```bash
   sudo apt-get update
   sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
   ```

5. **Dockerサービスの起動と自動起動の設定**

   Dockerサービスを起動し、自動起動するように設定します。

   ```bash
   sudo systemctl start docker
   sudo systemctl enable docker
   ```

6. **インストールの確認**

   Dockerが正しくインストールされているか確認します。

   ```bash
   docker --version
   ```

#### おまけ: Docker リモートアクセスの有効化

リモートのMacからDockerを操作するために、DockerデーモンがTCP接続を許可するように設定します。

1. DockerデーモンがTCPポートで接続を受け付けるように設定します。

   ```bash
   sudo nano /lib/systemd/system/docker.service
   ```

   `ExecStart`の行を次のように変更
   
   ```bash
   ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
   ```

   
   
2. 設定変更を反映させるために、Dockerデーモンを再起動します。

   ```bash
   sudo systemctl daemon-reload
   sudo systemctl restart docker
   ```

3: セキュリティを確保するために、リモートアクセスのためのポート設定

通常は、 UFW（Uncomplicated Firewall）を使用している場合、Ubuntu コマンドにて、ポート2375を開放しますが、Azure なので　Azure の NSG で設定します。

4: MacからリモートDockerに接続

MacのDocker CLIを使用して、リモートのUbuntuサーバー上のDockerを操作します。

### 4. DifyのDockerイメージをダウンロードして、Compose


以下のように改行を追加し、読みやすくしました。また、最後にDifyのためのNSG設定についても加えました。

---

さて、ここからが本番です！

Difyを動かすためには、まずDifyのGitHubリポジトリから必要なコンポーネントをダウンロードしてくる必要があります。Difyは単一のアプリケーションではなく、**複数のコンポーネント**から成り立っています。

具体的には、**ウェブサーバー**、**Redis**、**MySQL**などのサービスが含まれています。これらを個別にセットアップし、それぞれが連携して動作するようにする必要があります。

通常、これらのコンポーネントを手動でインストールし、設定していくのはかなり手間がかかりますが、ここで便利なのが**Docker Compose**です。

Docker Composeは、これらのコンポーネントを一括でセットアップして管理できるツールです。

Docker があるだけでも、ブロックを組み立てるだけで簡単なのですが、さらに、コンテナの構築、ネットワークの設定、各コンポーネントの起動を自動で行ってくれるので、まるで**レゴブロックを組み立てる作業そのものも自動で行ってくれるのでみてるだけ**みたいな感じで環境を構築できます。（例えが悪い・・）

次のコマンドを実行して、Difyを立ち上げてみましょう。

```bash
git clone https://github.com/username/dify.git
cd dify
docker-compose up -d
```

これで、Difyがバックグラウンドで起動します。このコマンドにより、**ウェブサーバー**や**Redis**、**MySQL**などのコンテナがすべて自動でセットアップされ、相互に接続されて動作するようになります。

まるで**複雑な機械**が一斉に動き始めるように、Difyが一つのシステムとして動作を始めます。これでDifyがすぐに使える状態になります。複数のコンポーネントが連携し、システムとして機能するようになった今、あなたの環境はしっかりと整いました。

### 5. AzureのNSGでIPフィルタを設定

Difyを安全に運用するために、Azureのネットワークセキュリティグループ（NSG）を設定して、外部からのアクセスを制御します。

1. Azureポータルにログインし、Difyを稼働させている仮想マシンの**ネットワークセキュリティグループ（NSG）**を選択します。

2. **インバウンドセキュリティルール**を開き、新しいルールを追加します。

3. 以下の設定を行い、**HTTP (80)** や **HTTPS (443)**、**カスタムポート（Difyのアクセスに必要なポート）**を開放します。

   - **プロトコル**: TCP
   - **ポート範囲**: 80, 443, 必要なカスタムポート
   - **送信元**: 任意（または特定のIPアドレス）
   - **送信先**: 任意
   - **アクション**: 許可
   - **優先度**: 1000（他のルールと競合しないように設定）


セキュリティを強化するために、送信元を任意にせず、会社のネットワークからのアクセスだけに制限することも可能です。

さらに、セキュリティの観点からNSGを開けずに、VPN接続を使用してリモートアクセスを許可する設定も推奨されます。

これらの設定は、各社のセキュリティポリシーや要件に合わせて、柔軟に対応してください。



これで、会社からDify の画面にアクセスできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/4df58882-6870-2dee-fabe-155f687f8977.png)








### 6. Azureの OpenAI　Service と、Dify を繋ぐ。

最後に、AzureのOpenAI ServiceとDifyを連携させます。Difyの設定画面から、モデルプロバイダーとして「Microsoft OpenAI Services」を選び、APIキーを設定します。これでDifyからOpenAIを利用できるようになります。 手順としては、 Dify の画面で、モデルプロバイダーとして、Microsoft OpenAI Services を選んでキーを設定するだけです。1箇所だけ迷うのはAPIバージョンですが、（ちゃんと調べてませんが、APIバージョンは新しいものにしたら普通に動きました。 LLMはAPIの仕様がまだ変わりやすいので、動かなくなったら、変えればいいのかなくらいに考えていてちゃんと調べてません。）



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/80e21913-2f97-5887-39a7-6885b2d4d86b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/0bb86689-1cb4-5c23-845b-c9c0e82e5c3d.png)


### 7. Dify を使う！

Difyを使ってみたところ、AIアプリ開発が驚くほどスムーズに進みました。
元々、サービス版と、内容は被りますが、あらためて、Dify について、印象的だったのは、次の3つのポイントです。

直感的なUIと豊富なテンプレート
設定がサクサク進むのはもちろん、テンプレートも充実していて、すぐにプロジェクトを始められる点が非常に便利でした。

ナレッジ機能で高度な情報検索
Difyのナレッジ機能を使うと、複雑な情報検索も簡単にこなせます。これで、AIがより賢く応答できるようになります。

柔軟なワークフロー
ワークフローが簡単に組めるので、大きなタスクも小さく分解して処理できます。これなら、4o-miniのような小さなモデルでも、しっかりと成果を出せるはずです。

Difyのおかげで、AI開発のハードルがグッと下がった気がします。これからも活用していきたいツールです！




---

### おわりに
Difyを使って社内向けのプライベート環境を立ち上げる手順は、驚くほど簡単でした。直感的なインターフェースのおかげで、操作に迷うことなくスムーズに進めることができました。

プライベート環境を活用することで、社内でAIを試しながら使うハードルが一気に下がり、チーム全体の効率化が進んでいます。今後もDifyのさらなる機能追加が楽しみです！

特に、このプライベート環境で、Dify が Docker 環境ですぐ作れる、というのがポイントです。
社内の実験やプロジェクトでAIを導入する際に、安全かつ柔軟に試行錯誤できる場を提供してくれるDifyは、これからも頼れるツールになりそうです。