Difyのオフラインデプロイ

インターネットに接続できない環境(イントラネット/サーバー)でDifyをデプロイする場合、本ガイドではNexus3を使用してプライベートpipミラーを構築し、プラグインのインストール依存関係の問題を完全に解決する方法を解説します。

Dify オフラインデプロイガイド

コンピュータ(またはサーバー)がインターネットに接続できない場合、Difyが正常に動作しないことに気づくでしょう。原因は、プラグインマーケットプレイスインストール機能がインターネット上のPython pipパッケージソースに依存しているためです。プラグインのインストール中にプログレスバーが回転しているとき、実際にはプラグインがインターネットから関連する依存パッケージをダウンロードしています。オフライン環境では、インターネットに接続できないため、無限にエラーが発生します。

一般的な解決策と問題点

コミュニティでの一般的な解決策の一つは:**再パッケージ化(Repackaging)**です。これには、必要な依存関係をすべてプラグイン自体に含めることで、オフライン環境で pip install を不要にすることが含まれます。

Dify Plugin Repackaging

これはプラグインの数が少ない場合は機能します。しかし、プラグインが増えると、依存関係を含め忘れたり、パッケージングに失敗したりする可能性が高まります。

[!WARNING] オフライン環境での依存関係の欠落は致命的です

オフライン環境でプラグインがインストールできたように見えても、システムを再起動すると、plugin_daemon が不足しているパッケージをpip経由で取得しようとします。インターネットがないためインストールに失敗し、plugin_daemon 全体が起動できなくなり...システム全体がダウンしてしまいます。

推奨される解決策:プライベートpipミラーの構築 (Nexus3)

私が推奨する方法は:イントラネット内にプライベートpipミラーを構築することです。

中心となる考え方

  1. インターネット環境ですべてのソースを準備します。
  2. Nexus3のDockerコンテナとデータパケットをオフライン環境に移行します。

必要なソフトウェア:Nexus3(Docker版)。

Nexus3(Sonatype社製)は、強力なリポジトリ管理システムです。さまざまな種類のソフトウェアリポジトリ(Maven、npm、Docker、PyPIなど)をサポートしており、特にpipプライベートソースの構築に適しています。

Nexus3の主な利点: Difyやその他のソフトウェアが必要とするpipパッケージを、あなたのPC上で一括キャッシュすることができます。その後、Nexus3のDockerコンテナとデータボリュームをオフライン環境にインポートするだけで、プラグインのインストールや再起動が問題なく行えるようになります。

Nexus pipソースの概念

  1. Hosted リポジトリ:内部で開発されたPythonパッケージを保存するために使用します(アップロード対応)。
  2. Proxy リポジトリ:パブリックPyPIソース(Aliyun、清華大学、公式PyPIなど)をプロキシし、頻繁に使用されるパッケージをキャッシュします。
  3. 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

Nexus Start

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

Nexus Password

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

Allow Anonymous Access

3. pip プロキシソース (Proxy) の作成

管理メニューに入り、リポジトリを作成します:

Add Pipy

**proxy(プロキシ)**のpipソースを作成するだけでOKです。

  • ローカルのwhlパッケージをアップロードする必要がある場合は、別途hostedを作成し、Groupを使用してproxyとhostedを統合します。

Proxyのターゲットアドレス(Remote storage)を設定します。公式ソースまたは清華大学などの信頼できるミラーを推奨します:

Add Proxy Config

4. プロキシソースの検証

コマンドラインで適当なパッケージ(pandasなど)をアンインストールし、作成したばかりのプロキシソースを使用してインストールできるか試してみてください:

pip uninstall pandas
pip install pandas -i http://127.0.0.1:8081/repository/dify/simple

(注意:アドレスの末尾に /simple を忘れずに追加してください)

Check Nexus

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

Show Nexus Pip Package

設定成功です。使用可能です!

5. Dify をプライベートソースで使用するように設定

Difyプロジェクトの docker-compose ファイルに戻り、pip を検索します:

Dify Pip Config

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を起動し、オフラインでインストールする必要があるすべてのプラグイン(「すべて」です!)を、インターネット環境で一度インストールしてください。

Dify Plugin Install

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

Nexus Dify Pip

これでプラグイン依存パッケージのキャッシュが完了しました。念のため、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にアクセスします:

Nexus Pip Page

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

3. オフライン Dify の設定

Difyの docker-compose.yaml で:

Dify Pip Config Inner Network

PIP_MIRROR_URL をあなたのオフラインサーバーのIPに変更します。

4. Dify の起動とプラグインインストール

Difyを起動後、プラグインマーケットプレイスからダウンロードしたプラグインを正常にインストールできるようになります!

Dify Plugin Position

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