内网离线部署 Dify

如果在无法连接互联网的环境(内网/服务器)中部署 Dify,本指南将教你使用 Nexus3 搭建私有 pip 源,完美解决插件安装依赖问题。

内网离线部署 Dify 指南

如果你的电脑(服务器)无法连接互联网,你会发现 Dify 跑不起来了。原因出在插件市场安装功能依赖互联网的 Python pip 包源。在安装插件转进度条的时候,实际上是插件在互联网上下载相关依赖包。离线环境下因为无法连接互联网就会无限报错。

常见解决方案与痛点

社区中有一个解决方案是:重打包。即把所需的依赖全部打进插件里面,保证在离线环境无需 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 包在你电脑进行批量缓存。后续只需把 Nexus3 的 docker 容器和数据包导入离线环境,安装和重启插件就不会有任何问题了。

Nexus pip 源的概念

  1. Hosted 仓库:用于存储内部开发的 Python 包,支持上传。
  2. Proxy 仓库:代理公共 PyPI 源(如阿里云、清华源),缓存常用包。
  3. Group 仓库:将多个仓库合并为一个统一地址。

步骤一:互联网环境准备与缓存

请先安装 Docker,并且在和你服务器一样的 CPU 指令集下运行容器和 Dify(比如服务器是 x86 的,就在 x86 的互联网环境操作)。

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

登录后,建议开启匿名访问,方便调试:

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,你就会发现里面多出了一万个包:

Nexus Dify Pip

这代表插件依赖包的缓存已完成。接下来建议重启一下 Dify,确认没有问题。


步骤二:迁移到离线环境

大功告成! 接下来把 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

你会发现缓存都在!一万个包都导入了离线环境的私有 pip 了!

3. 配置离线 Dify

在 Dify 的 docker-compose.yaml 中:

Dify Pip Config Inner Network

PIP_MIRROR_URL 改为你的离线服务器 IP。

4. 启动 Dify 并安装插件

启动 Dify 后,你就可以正常安装插件市场上下载的插件了!

Dify Plugin Position

无需重新打包,也不用再担心依赖问题了!