内网离线部署 Dify
如果在无法连接互联网的环境(内网/服务器)中部署 Dify,本指南将教你使用 Nexus3 搭建私有 pip 源,完美解决插件安装依赖问题。
内网离线部署 Dify 指南
如果你的电脑(服务器)无法连接互联网,你会发现 Dify 跑不起来了。原因出在插件市场和安装功能依赖互联网的 Python pip 包源。在安装插件转进度条的时候,实际上是插件在互联网上下载相关依赖包。离线环境下因为无法连接互联网就会无限报错。
常见解决方案与痛点
社区中有一个解决方案是:重打包。即把所需的依赖全部打进插件里面,保证在离线环境无需 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 包在你电脑进行批量缓存。后续只需把 Nexus3 的 docker 容器和数据包导入离线环境,安装和重启插件就不会有任何问题了。
Nexus pip 源的概念
- Hosted 仓库:用于存储内部开发的 Python 包,支持上传。
- Proxy 仓库:代理公共 PyPI 源(如阿里云、清华源),缓存常用包。
- 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

在宿主机的文件夹里找到密码文件进行登录(默认账号 admin):

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

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

这代表插件依赖包的缓存已完成。接下来建议重启一下 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:

你会发现缓存都在!一万个包都导入了离线环境的私有 pip 了!
3. 配置离线 Dify
在 Dify 的 docker-compose.yaml 中:

把 PIP_MIRROR_URL 改为你的离线服务器 IP。
4. 启动 Dify 并安装插件
启动 Dify 后,你就可以正常安装插件市场上下载的插件了!

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