Dify-1.0.0へのアップグレード

作成日：2025年3月22日(土)

## １．はじめに

近年、生成AIの発展により、多くの企業がAIを活用したビジネス変革を模索しています。しかし、AIアプリケーションの開発には専門的な知識やスキルが必要とされ、その恩恵を受けられる人材は限られていました。

私の会社では、AIの民主化を重要な経営課題と位置づけ、非エンジニアでも容易にAIアプリケーションを開発できる環境の整備を進めてきました。その取り組みの一環として、ノーコードチャットボット開発プラットフォーム「Dify」を導入し、社内での活用を推進しています。

このたび、Difyの最新バージョンv1.0.0がリリースされ、より高度な機能と使いやすさが実現されました。本記事では、v1.0.0へのアップグレードの意義と手順について解説し、非エンジニアの方々がより効果的にAI開発に取り組めるよう、その道筋を示していきます。

## ２．Dify-v1.0.0とは

Dify-v1.0.0は、2024年3月にリリースされた最新バージョンです。このバージョンでは、LLMのオーケストレーション機能が強化され、より柔軟なAIアプリケーションの構築が可能になりました。また、UIの刷新やセキュリティの向上など、多くの改善が施されています。

特筆すべき新機能として、プラグインシステムの導入があります。このプラグインシステムにより、開発者は独自の機能拡張を作成し、Difyプラットフォームに統合することができるようになりました。これにより、カスタムツールの開発やサードパーティサービスとの連携が容易になり、より多様なAIアプリケーションの開発が可能となっています。

## ３．バージョンアップ計画

Difyのバージョン0.15から1.1への直接アップグレードはできません。そのため、まずバージョン1.0.0へアップグレードする必要があります。

以下が私の環境でのバージョンアップ手順です。

![dify-upgrade-path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/693ed412-338f-4ddd-8c8f-f13a33366074.png)

## ４．GitHub公式のリリースノートに注意

Dify-v1.0.0へのバージョンアップ手順は[langgenius/dify](https://github.com/langgenius/dify)の[Release/1.0.0](https://github.com/langgenius/dify/releases/tag/1.0.0)に記載されていますが、情報が不十分なため、その手順だけでは正しくアップグレードできません。

Difyのドキュメントにある「[**コミュニティ版を v1.0.0 に移行する**](https://docs.dify.ai/ja-jp/development/migration/migrate-to-v1)」ページを参照してバージョンアップすることを推奨します。

[Release/1.0.0](https://github.com/langgenius/dify/releases/tag/1.0.0)に記載されていない重要な注意点

- **最新版のfetch**
git fetch originコマンドをgit checkout 1.0.0の前に実行する必要があります。このコマンドを実行しないと、ローカルリポジトリに1.0.0のタグが存在せず、checkoutに失敗します。

```bash
git fetch origin
git checkout 1.0.0 
```

- **.envファイルの再作成**
.envファイルの再作成は、v1.0.0に特有の要件ではありませんが、.env.exampleが定期的に更新されるため、最新の.env.exampleから.envを新しく作成することをお勧めします。
企業プロキシなどで.envファイルをカスタマイズしている場合は、その設定を新しい.envファイルに反映してください。

```bash
mv .env .env_250322_bak
cp -p .env.example .env
```

- **docker-compose.override.yamlの整合性確認について**
docker-compose.yamlファイルを直接修正した場合、Difyのバージョンアップ時のgit pullで毎回コンフリクトが発生してしまいます。この問題を回避するため、多くのユーザーはdocker-compose.override.yamlでオーバーライドする方法を採用しています。docker-compose.yamlは頻繁に更新されるため、override.yamlとの整合性を必ず確認してください。
なお、docker-compose.yamlの詳細については、@TKDSさんの「[docker compose override入門](https://qiita.com/TKDS/items/e0b7a2c7af149f1974ad)」をご参照ください。
- データマイグレーションツールの実行環境について
Dify-1.0.0には各種データマイグレーションツールが同梱されていますが、[Release/1.0.0](https://github.com/langgenius/dify/releases/tag/1.0.0)には実行環境の記載がありませんでした。「[**コミュニティ版を v1.0.0 に移行する**](https://docs.dify.ai/ja-jp/development/migration/migrate-to-v1)」を参照することで、これが明確になりました。extract-plugins —workers=20、install-plugins —workers=2、migrate-data-for-pluginの各ツールは、docker-api-1コンテナ内で実行する必要があります。実行手順としては、まずdocker compose up -dでDifyを起動し、その後docker exec -it docker-api-1 bashコマンドでdocker-api-1コンテナ内のbashを起動して実行します。

```bash
[root@localmotion docker]# docker compose -f docker-compose.yaml up -d
[root@localmotion docker]# docker exec -it docker-api-1 bash

root@b2f93e7305c8:/app/api# poetry run flask extract-plugins --workers=20
root@b2f93e7305c8:/app/api#
root@b2f93e7305c8:/app/api# cat plugins.jsonl
{"tenant_id": "1a551d58-5fc9-44cf-b4fd-3825b05c5880", "plugins": ["langgenius/openai", "langgenius/google", "langgenius/azure_openai", "langgenius/openrouter"]}
root@b2f93e7305c8:/app/api#
root@b2f93e7305c8:/app/api# poetry run flask install-plugins --workers=2
2025-03-21 20:21:56.151 INFO [MainThread] [utils.py:162] - NumExpr defaulting to 4 threads.
2025-03-21 20:21:59.797 INFO [MainThread] [_client.py:1038] - HTTP Request: GET https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json "HTTP/1.1 200 OK"
Input file [plugins.jsonl]:
Output file [installed_plugins.jsonl]:
Starting install plugins.
2025-03-21 20:22:07.983 INFO [MainThread] [plugin_migration.py:304] - Extracting unique plugins from plugins.jsonl
 25%|███████████████████████████████▎                                                                                           100%|█████████████████████████████████████████████████████████████████████████████ 100%|█████████████████████████████████████████████████████████████████████████████ ████████████████████████████████████████████████| 4/4 [00:01<00:00,  3.39it/s]
2025-03-21 20:22:09.182 INFO [MainThread] [plugin_migration.py:342] - Installing 4 plugin instances for fake tenant 41503b334b3a4987b8d63f5aad3d8fc7
2025-03-21 20:22:10.438 INFO [ThreadPoolExecutor-4_2] [_client.py:1038] - HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/openai:0.0.13@9caa0421b5519db036aaccdbf1980d1071550767d6c59e9d9388dd386a92e9f6 "HTTP/1.1 200 OK"
2025-03-21 20:22:10.453 INFO [ThreadPoolExecutor-4_1] [_client.py:1038] - HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/google:0.0.8@3efcf55ffeef9d0f77715e0afb23534952ae0cb385c051d0637e86d71199d1a6 "HTTP/1.1 200 OK"
2025-03-21 20:22:10.459 INFO [ThreadPoolExecutor-4_3] [_client.py:1038] - HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/openrouter:0.0.5@55ddb36a03717ec8c10945eca203f066ef53d8ab692a17050fdc730000ba1e0a "HTTP/1.1 200 OK"
2025-03-21 20:22:10.470 INFO [ThreadPoolExecutor-4_0] [_client.py:1038] - HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/azure_openai:0.0.10@6dd624f6fe6e7ac3bae02890e42be143aab0dd461fe1dff94731a98343ff36f6 "HTTP/1.1 200 OK"
2025-03-21 20:23:04.030 INFO [ThreadPoolExecutor-3_0] [plugin_migration.py:351] - Installing 4 plugins for tenant 1a551d58-5fc9-44cf-b4fd-3825b05c5880
2025-03-21 20:23:04.090 INFO [MainThread] [plugin_migration.py:400] - Uninstall plugins
Install plugins completed.

root@b2f93e7305c8:/app/api# poetry run flask migrate-data-for-plugin
2025-03-21 20:23:18.072 INFO [MainThread] [utils.py:162] - NumExpr defaulting to 4 threads.
2025-03-21 20:23:21.857 INFO [MainThread] [_client.py:1038] - HTTP Request: GET https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json "HTTP/1.1 200 OK"
Starting migrate data for plugin.
Migrating [providers] data for plugin
...
[1] Migrated [tool_builtin_providers] 11af3008-9a7a-42ef-97e7-88e923ee966e (google)
Migrate [tool_builtin_providers] data for plugin completed, total: 1
Migrate data for plugin completed.
```

※プロンプトが「root@b2f93e7305c8」になっている部分がdocker-api-1コンテナ内での作業です

※extract-pluginsコマンドで生成される「plugins.jsonl」ファイルは、poetry run flask install-plugins --workers=2コマンドがプロキシ環境下で失敗するのと、後述するプロキシ環境下でDify Marketplaceにアクセスできない問題があるため、catコマンドで内容を表示して控えておくことをお勧めします。

Dify-1.0.0では大規模言語モデルや今まで「ツール」だったものが[Dify Marketplace](https://marketplace.dify.ai/)に移行されているため、プロキシ問題で[Dify Marketplace](https://marketplace.dify.ai/)にアクセスできないのは困りました。
回避策はあります。

私の環境はプロキシを使用していませんが、plugins.jsonlのフォーマットは以下のような構造（整形済み）となっています。

```bash
{
    "tenant_id": "1a551d58-5fc9-44cf-b4fd-3825b05c5880",
    "plugins": [
        "langgenius/openai",
        "langgenius/google",
        "langgenius/azure_openai",
        "langgenius/openrouter"
    ]
}
```

## ５．Dify-1.0.0の動作確認

バージョンアップとデータマイグレーションの完了後、DifyのURLにアクセスして、バージョンが正しく1.0.0に更新されていることを確認してください。
![ConfirmDifyVersion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/c847f973-3445-4c13-be3f-d37137a78715.png)

## ６．Dify-1.1.2へのバージョンアップ

バージョン1.0.0へのアップグレード完了後は、通常のアップグレード手順に従って最新版へ更新できます。

私の環境では、0.15.2から1.0.0、1.1.1へと段階的にアップグレードし、2025年3月22日にリリースされた1.1.2へ更新しました。

バージョンアップ方法は[langgenius/dify](https://github.com/langgenius/dify)の[Release/1.1.2](https://github.com/langgenius/dify/releases/tag/1.1.2)を参照してください。

### Docker Composeデプロイメントの手順

1. カスタマイズしたdocker-compose YAMLファイルのバックアップ（任意）
    
    ```
    cd docker
    cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
    ```
    
2. メインブランチから最新のコードを取得
    
    ```
    git checkout main
    git pull origin main
    ```
    
3. サービスの停止（dockerディレクトリで実行）
    
    ```
    docker compose down
    ```
    
4. データのバックアップ
    
    ```
    tar -cvf volumes-$(date +%s).tgz volumes
    ```
    
5. サービスのアップグレード`docker compose up -d`

## ６．Dify-1.1.1の問題

個人環境ではあまり問題は発生していませんが、企業プロキシがある会社環境では問題が発生していますので、少しまとめておきます。

| No | 環境 | 問題 | 関連Issues | 備考 |
| --- | --- | --- | --- | --- |
| 1 | 個人/会社 | Azure DALL-E(0.0,.2)でDall-E3の認証が’base64’ is not definedエラーで認証できない(*1) |  | OpenAI版は動きます。 |
| 2 | 会社 | Dify Marketplaceに接続できるが[marketplace.dify.ai](http://marketplace.dify.ai/)がSSL証明書エラーとなりダウンロードインストールできない |  |  |
| 3 | 会社 | プラグインインストール時に”Expecting value: line 1 column 1 (char 0)"エラーが発生してインストールできない | [#14608](https://github.com/langgenius/dify/issues/14608)<br>[#15449](https://github.com/langgenius/dify/issues/15449) | NO_PROXYで対策可能 |
| 4 | 会社 | Google Search、Perplexityプラグインがプロキシを越えられない | [#14621](https://github.com/langgenius/dify/issues/14621) |  |

(*1)実際のエラー
  ![base64isnotdefined.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/b9b58157-8366-4211-b5a5-1e81d91a7b22.png)
  
## ７．Dify-1.1.1の問題の回避策

今、発見できている問題は大きく４つです。回避策があるものは回避策を記載します。
| No | 環境 | 問題 | 回避策 |
| --- | --- | --- | --- |
| 1 | 個人/会社 | Azure DALL-E(0.0,.2)でDall-E3の認証が’base64’ is not definedエラーで認証できない | OpenAI DALL-Eを使う<br>それ以外回避策なし |
| 2 | 会社 | Dify Marketplaceに接続できるが[marketplace.dify.ai](http://marketplace.dify.ai/)がSSL証明書エラーとなりダウンロードインストールできない | 対策([#14608](https://github.com/langgenius/dify/issues/14608)、[#15449](https://github.com/langgenius/dify/issues/15449)問題)をしたのち、プラグインをDifyの[プラグインをインストールする]→[ローカルパッケージファイル]から手動インストール |
| 3 | 会社 | プラグインインストール時に”Expecting value: line 1 column 1 (char 0)"エラーが発生してインストールできない | 同上 |
| 4 | 会社 | Google Search、Perplexityプラグインがプロキシを越えられない | 回避策なし、PROXYに関して複数報告されているissuesの対策待ち |

## ７．参考URL

https://docs.dify.ai/ja-jp/development/migration/migrate-to-v1