Difyのオフラインデプロイ
インターネットに接続できない環境(イントラネット/サーバー)でDifyをデプロイする場合、本ガイドではNexus3を使用してプライベートpipミラーを構築し、プラグインのインストール依存関係の問題を完全に解決する方法を解説します。
Dify オフラインデプロイガイド
コンピュータ(またはサーバー)がインターネットに接続できない場合、Difyが正常に動作しないことに気づくでしょう。原因は、プラグインマーケットプレイスとインストール機能がインターネット上のPython pipパッケージソースに依存しているためです。プラグインのインストール中にプログレスバーが回転しているとき、実際にはプラグインがインターネットから関連する依存パッケージをダウンロードしています。オフライン環境では、インターネットに接続できないため、無限にエラーが発生します。
一般的な解決策と問題点
コミュニティでの一般的な解決策の一つは:**再パッケージ化(Repackaging)**です。これには、必要な依存関係をすべてプラグイン自体に含めることで、オフライン環境で pip install を不要にすることが含まれます。

これはプラグインの数が少ない場合は機能します。しかし、プラグインが増えると、依存関係を含め忘れたり、パッケージングに失敗したりする可能性が高まります。
[!WARNING] オフライン環境での依存関係の欠落は致命的です:
オフライン環境でプラグインがインストールできたように見えても、システムを再起動すると、
plugin_daemonが不足しているパッケージをpip経由で取得しようとします。インターネットがないためインストールに失敗し、plugin_daemon全体が起動できなくなり...システム全体がダウンしてしまいます。
推奨される解決策:プライベートpipミラーの構築 (Nexus3)
私が推奨する方法は:イントラネット内にプライベートpipミラーを構築することです。
中心となる考え方:
- インターネット環境ですべてのソースを準備します。
- Nexus3のDockerコンテナとデータパケットをオフライン環境に移行します。
必要なソフトウェア:Nexus3(Docker版)。
Nexus3(Sonatype社製)は、強力なリポジトリ管理システムです。さまざまな種類のソフトウェアリポジトリ(Maven、npm、Docker、PyPIなど)をサポートしており、特にpipプライベートソースの構築に適しています。
Nexus3の主な利点: Difyやその他のソフトウェアが必要とするpipパッケージを、あなたのPC上で一括キャッシュすることができます。その後、Nexus3のDockerコンテナとデータボリュームをオフライン環境にインポートするだけで、プラグインのインストールや再起動が問題なく行えるようになります。
Nexus pipソースの概念
- Hosted リポジトリ:内部で開発されたPythonパッケージを保存するために使用します(アップロード対応)。
- Proxy リポジトリ:パブリックPyPIソース(Aliyun、清華大学、公式PyPIなど)をプロキシし、頻繁に使用されるパッケージをキャッシュします。
- Group リポジトリ:複数のリポジトリを単一のアドレスに統合します。
手順1:インターネット環境での準備とキャッシュ
まずDockerをインストールしてください。そして、サーバーと同じCPUアーキテクチャ(例えば、サーバーがx86なら、x86のインターネット環境で操作)でコンテナとDifyを実行してください。
1. Nexus3 コンテナの起動
mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data
docker run -d -p 8081:8081 --name nexus -v /some/dir/nexus-data:/nexus-data sonatype/nexus3[!IMPORTANT]
/some/dir/nexus-dataはあなたのローカルパスです。後でここにpipのキャッシュが保存されるため、非常に重要です。アクセス可能でデータが保持されることを確認してください。
2. Nexus3 の設定
ブラウザでローカルの8081ポートにアクセスします:http://localhost:8081

ホストマシンのフォルダ内にあるパスワードファイルを見つけてログインします(デフォルトアカウント:admin):

ログイン後、デバッグを容易にするために匿名アクセス(Anonymous Access)を許可することをお勧めします:

3. pip プロキシソース (Proxy) の作成
管理メニューに入り、リポジトリを作成します:

**proxy(プロキシ)**のpipソースを作成するだけでOKです。
- ローカルのwhlパッケージをアップロードする必要がある場合は、別途hostedを作成し、Groupを使用してproxyとhostedを統合します。
Proxyのターゲットアドレス(Remote storage)を設定します。公式ソースまたは清華大学などの信頼できるミラーを推奨します:

4. プロキシソースの検証
コマンドラインで適当なパッケージ(pandasなど)をアンインストールし、作成したばかりのプロキシソースを使用してインストールできるか試してみてください:
pip uninstall pandas
pip install pandas -i http://127.0.0.1:8081/repository/dify/simple(注意:アドレスの末尾に /simple を忘れずに追加してください)

インストールが進行している場合、Nexus3に戻ると、pandasがローカルにキャッシュされていることがわかります:

設定成功です。使用可能です!
5. Dify をプライベートソースで使用するように設定
Difyプロジェクトの docker-compose ファイルに戻り、pip を検索します:

PIP_MIRROR_URL があるすべての箇所に、私たちのプライベートソースのアドレスを追加します:
PIP_MIRROR_URL: ${PIP_MIRROR_URL:-http://host.docker.internal:8081/repository/dify/simple}[!TIP]
host.docker.internalはDocker内でホストマシンのIP(127.0.0.1)を指します。Nexus3が同じマシンにない場合は、対応するIPに変更してください。
6. プラグイン依存関係の一括キャッシュ
Difyを起動し、オフラインでインストールする必要があるすべてのプラグイン(「すべて」です!)を、インターネット環境で一度インストールしてください。

Nexus3に戻ると、1万個以上のパッケージが増えていることがわかります:

これでプラグイン依存パッケージのキャッシュが完了しました。念のため、Difyを再起動して問題がないか確認することをお勧めします。
手順2:オフライン環境への移行
お疲れ様でした! 次に、DifyのDockerコンテナ、Nexus3のDockerイメージ、そして先ほどのキャッシュデータフォルダをオフライン環境にインポートします。
1. オフラインサーバーで Nexus3 を起動
docker run -d -p 8081:8081 --name nexus -v /some/dir/nexus-data:/nexus-data sonatype/nexus3ここの /some/dir/nexus-data は、インターネット環境からコピーしてきた、pipキャッシュデータを含むフォルダでなければなりません。
2. キャッシュの確認
サーバーIP:8081にアクセスします:

キャッシュがすべて存在することを確認できます!1万個のパッケージがオフライン環境のプライベートpipにインポートされました!
3. オフライン Dify の設定
Difyの docker-compose.yaml で:

PIP_MIRROR_URL をあなたのオフラインサーバーのIPに変更します。
4. Dify の起動とプラグインインストール
Difyを起動後、プラグインマーケットプレイスからダウンロードしたプラグインを正常にインストールできるようになります!

再パッケージ化の必要もなく、依存関係の問題に悩まされることももうありません!