AWSのEC2環境でのDifyアップグレード手順

# はじめに

Difyって、頻繁にアップデートが行われますね！都度魅力的な機能が加わりますので、毎回ワクワクしちゃいます。ここでは、Amazon Linux 2環境にインストールされたDifyをアップグレードする手順を示します。このガイドは、以下の記事でご紹介したインストール手順に従ってDifyを導入された方向けです。（他の環境に入れられた方も参考になると思います）

https://qiita.com/daishiro_jp/items/3d679131bbd48882a250

# 事前準備

アップグレードを始める前に、以下の点を確認してください

1. 現在のデータのバックアップを取得していること
2. 十分なディスク容量があること
3. メンテナンス時間を確保していること
4. ローカルでの変更内容を把握していること（特にdocker-compose.yamlの修正）

# アップグレード手順（Docker Compose環境）

### 1. ローカルの変更確認

まず、現在の環境での変更状況を確認します。

```bash
$ cd ~/dify
$ git status
```

どのファイルを変更しているのかを確認しておきましょう。

### 2. バックアップの作成

現在の設定とデータのバックアップを取得します。

```bash
$ cd ~/dify/docker
$ cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
$ cp .env .env.$(date +%s).bak
$ tar -cvf volumes-$(date +%s).tgz volumes
```

### 3. ローカルの変更の退避

変更されているファイルを一時的に退避させます。

```bash
$ cd ~/dify
$ git stash
Saved working directory and index state WIP on (no branch): 4b0d2bf57 chore: update build-push.yml to remove unnecessary tags
```

### 4. 最新のコードを取得

```bash
$ git checkout main
Previous HEAD position was 4b0d2bf57 chore: update build-push.yml to remove unnecessary tags
Switched to branch 'main'
Your branch is behind 'origin/main' by 264 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
  
$ git pull origin main
（多々出力あります。略です）
```

### 5. サービスの停止

```bash
$ cd docker
$ docker-compose down
Stopping docker-nginx-1      ... done
Stopping docker-worker-1     ... done
Stopping docker-api-1        ... done
Stopping docker-db-1         ... done
Stopping docker-ssrf_proxy-1 ... done
Stopping docker-web-1        ... done
Stopping docker-weaviate-1   ... done
Stopping docker-sandbox-1    ... done
Stopping docker-redis-1      ... done
Removing docker-nginx-1      ... done
Removing docker-worker-1     ... done
Removing docker-api-1        ... done
Removing docker-db-1         ... done
Removing docker-ssrf_proxy-1 ... done
Removing docker-web-1        ... done
Removing docker-weaviate-1   ... done
Removing docker-sandbox-1    ... done
Removing docker-redis-1      ... done
Removing network docker_default
Removing network docker_ssrf_proxy_network
Removing network docker_milvus
WARNING: Network docker_milvus not found.
Removing network docker_opensearch-net
WARNING: Network docker_opensearch-net not found.

```

※ 「Network docker_milvus not found」や「Network docker_opensearch-net not found」といったワーニングが表示される場合がありますが、これらは問題ありません。これらは未使用のネットワークに関する通知です。

### 6. 設定ファイルの更新

ローカルの設定を新しい環境に反映します。

```bash
# バックアップした設定と新しい設定を比較
$ diff docker-compose.yaml.*.bak docker-compose.yaml
$ diff .env.*.bak .env.example

# 必要な変更を新しいファイルに適用
$ vi docker-compose.yaml
$ vi .env
```



### 7. サービスの再起動

```bash
$ docker-compose up -d
Creating network "docker_default" with the default driver
Creating network "docker_ssrf_proxy_network" with driver "bridge"
Creating network "docker_milvus" with driver "bridge"
Creating network "docker_opensearch-net" with driver "bridge"
Creating volume "docker_dify_es01_data" with default driver
Pulling web (langgenius/dify-web:0.11.0)...
0.11.0: Pulling from langgenius/dify-web
4abcf2066143: Already exists
9f16480e2ff5: Already exists
092226d52cac: Already exists
0493dfb2ff9c: Already exists
32cdc670699a: Pull complete
8b3c0aa85eca: Pull complete
af3000ec4d41: Pull complete
5d6f0ea61668: Pull complete
b169f7bdc92a: Pull complete
035dcc618757: Pull complete
0b201a402996: Pull complete
1ab40d49a6cb: Pull complete
b8b6ee54ae2c: Pull complete
Digest: sha256:de03800b1960117011f8d510fcd02570dc68f7ab4bcdc3278d5fd756be87c1a6
Status: Downloaded newer image for langgenius/dify-web:0.11.0
Pulling worker (langgenius/dify-api:0.11.0)...
0.11.0: Pulling from langgenius/dify-api
a480a496ba95: Pull complete
9555349e8380: Pull complete
1c161e44b06b: Pull complete
417516d8bb61: Pull complete
d197aa066fee: Pull complete
2e3a189d6ded: Pull complete
4f4fb700ef54: Pull complete
a85ccdde7f53: Pull complete
33fbb0aac3f9: Pull complete
16a8041c47d4: Pull complete
fd8313391acd: Pull complete
94bc503e60f9: Pull complete
Digest: sha256:1b82b9376c1e6175a97bb92178f609b6965fbd93e7be230559570c20fa061d40
Status: Downloaded newer image for langgenius/dify-api:0.11.0
Pulling sandbox (langgenius/dify-sandbox:0.2.10)...
0.2.10: Pulling from langgenius/dify-sandbox
302e3ee49805: Pull complete
eeec0daa4c1f: Pull complete
9374269b22c3: Pull complete
e9e6580aad05: Pull complete
81825055f7ad: Pull complete
41316c558183: Pull complete
808156f66bdf: Pull complete
31fca5fdfe1e: Pull complete
7f6a9ac15091: Pull complete
03982c40e7d4: Pull complete
Digest: sha256:6c69b6e379255d5865dd9ac25b588942dc4a7a5e8f57afcf736080414459e8dd
Status: Downloaded newer image for langgenius/dify-sandbox:0.2.10
Creating docker_db_1         ... done
Creating docker_ssrf_proxy_1 ... done
Creating docker_redis_1      ... done
Creating docker_web_1        ... done
Creating docker_sandbox_1    ... done
Creating docker_weaviate_1   ... done
Creating docker_worker_1     ... done
Creating docker_api_1        ... done
Creating docker_nginx_1      ... done
```

### 8. アップグレードの確認

ブラウザでDifyの管理画面にアクセスし、正常に動作することを確認します。

```
http://[your-domain-name]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245400/4dc84bc6-4175-aa80-adc5-7f05ed614c6f.png)

おぉ！ちゃんとアップグレードできましたね！めでたしめでたしです。ワークフロー類も残っていました。良かった！

# トラブルシューティング

アップグレード後に問題が発生した場合は、以下の手順で対処できると思います。未検証ですが、参考までにメモを残します。

ログの確認
```bash
$ docker-compose logs -f
```

バックアップからの復元
```bash
# サービスを停止
$ docker-compose down

# バックアップしたファイルを復元
$ cp docker-compose.yaml.*.bak docker-compose.yaml
$ cp .env.*.bak .env

# バックアップしたvolumesを復元
$ rm -rf volumes
$ tar xvf volumes-*.tgz

# サービスを再起動
$ docker-compose up -d
```

# 自動起動設定の確認

アップグレード後、自動起動の設定が正常に機能することを確認します。

```bash
# systemdサービスの状態確認
$ sudo systemctl status dify.service

# 必要に応じてサービスの再起動
$ sudo systemctl restart dify.service
```

# まとめ

Difyのアップグレードは、適切な手順を踏めば安全に実行できます。ただし、重要なデータを扱うシステムのアップグレードでは、必ず事前にバックアップを取得し、十分なテストを行うことをお勧めします。また、アップグレード作業は、システムの利用が少ない時間帯に実施することをお勧めします。

特に注意が必要なのは、カスタマイズした設定（docker-compose.yamlやポート設定など）の移行です。アップグレード後に、これらの設定が正しく反映されているか必ず確認しましょう。

定期的なアップグレードにより、新機能の利用や安全性の向上が図れます。ぜひ、計画的なアップグレードを実施していきましょう。この手順がどなたかのお役に立てれば！