インターネットにつながらない環境にDifyを構築するメモ

# はじめに

インターネットにつながらない(インターネットから隔離された)環境にDifyを構築するメモです。
DifyからOllamaのLLM(Elyza-JP-8B)とEmbeddingモデル(mxbai-embed-large)を使用できる状態にします。

# 構成

インターネットにつながった(インターネットへ接続された)環境(Windows 10)にDify、Ollamaが動作する環境を構築します。
次にインターネットにつながらない(インターネットから隔離された)環境(CentOS 7.9)にファイル(Docker packageやimage)を持ち込んで構築します。

![スクリーンショット 2024-12-17 17.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/136acf26-411a-c629-2baa-7bb79b62caec.png)

# 準備

## Windows 10 環境

以下をインストールします。

- <A HREF="https://docs.docker.com/desktop/">Docker Desktop</A>
- <A HREF="https://gitforwindows.org/">git</A>
- <A HREF="https://ollama.com/">Ollama</A>

コマンドプロンプトから操作します。

### Dify

```bash
git clone https://github.com/langgenius/dify.git
cd dify
cd docker
cp .env.example .env
docker compose up -d
```

### Ollama

```bash
ollama run huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
ollama pull mxbai-embed-large
```

Llama-3-ELYZA-JP-8B-GGUFのダウンロードがうまく行かない場合、エラーが出力される。

```
verifying sha256 digest 
Error: digest mismatch, file must be downloaded again: want sha256:224a200d5ad8cdbe1848f48e0e75cca587c188905db6b560b6a7d4728a818cb7, got sha256:475211637354ce4c14b9c3dacccbefbaba735fe1b0db97d6c4fd11cd1356819f
```

Llama-3-ELYZA-JP-8B-q4_k_m.ggufファイルをダウンロードして、Modelfileを作成して、Modelfileからollamaのモデルを作成します。

¥¥Users¥ユーザー名¥.ollama ディレクトリにモデルファイルが保存されます。

### 持ち込むイメージファイルの作成

¥¥Users¥ユーザー名 ディレクトリで作業を行う前提で説明します。

difyのgitレポジトリをファイル保存します。

```bash
tar cvf dify.tar dify
zip dify.tar
```

difyのdockerイメージをファイル保存します。
dockerイメージをファイル保存する時のポイントは、IMAGE IDではなく、REPOSITORY:TAGを指定します。
(dockerイメージをロードしたときにREPOSITORYとTAGが<none>になります)

```
cd dify
cd docker
docker compose down
docker save -o dify_docker_image.tar langgenius/dify-web:0.13.1 langgenius/dify-api:0.13.1 nginx:latest postgres:15-alpine langgenius/dify-sandbox:0.2.10 redis:6-alpine ubuntu/squid:latest semitechnologies/weaviate:1.19.0
zip dify_docker_image.tar
```

ollamaのモデルをファイル保存します。

```bash
tar cvf ollama_model.tar .ollama
zip ollama_model.tar
```

ollamaのdockerイメージをファイル保存します。

```bash
docker save -o ollama_docker_image.tar ollama/ollama:latest
zip ollama_docker_image.tar
```

### Docker Engine(Linux用)のパッケージファイル

以下のパッケージファイルをダウンロードします。

- containerd.io-1.6.33-3.1.el7.x86_64.rpm
- docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm
- docker-ce-26.1.4-1.el7.x86_64.rpm
- docker-ce-cli-26.1.4-1.el7.x86_64.rpm
- docker-ce-rootless-extras-26.1.4-1.el7.x86_64.rpm
- docker-compose-plugin-2.27.1-1.el7.x86_64.rpm

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/


## CentOS 7.9 環境

Windows環境からCentOS環境へファイルをすべて転送します。

### Docker環境の構築

Docker Engineをインストールします。

```bash
sudo yum install ./containerd.io-1.6.33-3.1.el7.x86_64.rpm ./docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm ./docker-ce-26.1.4-1.el7.x86_64.rpm ./docker-ce-cli-26.1.4-1.el7.x86_64.rpm ./docker-ce-rootless-extras-26.1.4-1.el7.x86_64.rpm ./docker-compose-plugin-2.27.1-1.el7.x86_64.rpm
```

dockerのイメージデータを保存するディレクトリを変更する場合など、/etc/docker/daemon.jsonファイルを作成します。

```json:daemon.json
{
  "data-root": "/mnt/docker-data",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1g",
    "max-file": "5"
  }
}
```

dockerを起動します。

```bash
sudo systemctl start docker
```

### dify

difyのgitレポジトリを展開します。

```bash
tar xvzf dify.tar.gz
```

difyのdockerイメージをロードします。

```bash
sudo docker load < dify_docker_image.tar.gz
```

difyを起動します。

```bash
cd dify
cd docker
sudo docker compose up -d
```

### ollama

ollamaのモデルを展開します。

```bash
tar xvzf ollama_model.tar.gz
```

ollamaのdockerイメージをロードします。

```bash
sudo docker load < ollama_docker_image.tar.gz
```

ollamaを起動します。
difyからollamaへアクセス可能とするため、difyと同じdockerネットワーク(docker_default)を指定します。
また、展開したollamaのモデルを参照可能とするため、ホストのパス(/home/ユーザー名/.ollama)をコンテナのパス(/root/.ollama)にマウントします。

```bash
sudo docker run -d -v /home/ユーザー名/.ollama:/root/.ollama -p 11434:11434 --net=docker_default --name ollama ollama/ollama
```

dockerコマンドでコンテナの起動状態(コンテナが起動しているか)とdockerネットワークの内容(同じネットワーク内にコンテナが存在するか)を確認します。

```bash
sudo docker ps
sudo docker network inspect docker_default
```

### 参考(トラブルシューティング)

dockerイメージ(REPOSITORYとTAGが登録されているか)を確認します。

```bash
sudo docker images
```

ollamaのコンテナからホストのモデルを参照できるか確認します。

```bash
sudo docker exec -it ollama bash
ollama list
```

difyとollamaが通信できない場合(ollamaの起動時にdockerネットワークを指定しないとdifyと異なるdockerネットワーク(bridge)に接続されます)、一時的にiptablesを停止して問題を解消します。

```bash
sudo systemctl stop iptables
```

iptablesを停止(再起動)すると、dockerの設定がリセットされるため、dockerを再起動します。

```bash
sudo systemctl restart docker
```

# Difyの動作確認

ブラウザからDifyにアクセスしてログイン画面が表示されることを確認します。

![スクリーンショット 2024-12-17 19.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1ff7e6fc-3651-a501-9116-5c06372dfebc.png)