1. 为什么企业需要内网离线部署Dify最近两年我帮十几家企业做过内网AI平台的部署发现一个共同痛点很多金融、医疗、制造行业的企业由于数据安全要求服务器完全不能连接外网。这时候想用Dify这样的AI应用平台就特别麻烦因为官方文档默认你随时能联网下载依赖。举个例子去年某银行的技术主管找到我他们需要在完全隔离的环境中部署Dify来分析客户服务录音。服务器连DNS解析都禁用了更别说访问Docker Hub这种外网仓库。当时我们花了整整两周才把所有依赖镜像打包进去踩了不少坑。现在回想起来如果能有一份完整的离线部署指南至少能节省60%的时间。离线部署的核心价值在于数据不出域所有组件数据库、向量引擎、前端都在内网闭环运行版本可控避免因网络问题导致依赖版本意外升级快速恢复灾难恢复时不需要重新下载几十GB的镜像文件2. 环境准备打造离线部署的无菌操作台2.1 虚拟机配置建议我强烈推荐使用VMware而不是VirtualBox因为它的虚拟网络配置更灵活。实测在完全断网环境下VMware的NAT模式配合host-only网络最稳定。具体参数这么配# 创建虚拟机时建议的硬件配置 CPU至少4核Dify运行时会启动多个容器 内存16GB起步Weaviate很吃内存 磁盘100GB SSD镜像文件数据库会很占空间 网络适配器两个 - 适配器1NAT用于初期安装系统时临时联网 - 适配器2Host-only永久离线后使用注意安装完系统后一定要删除NAT网卡只保留host-only彻底物理隔离2.2 操作系统选择与优化Ubuntu Server 22.04 LTS是我的首选因为对Docker支持最友好长期支持版本维护周期长自带APT离线安装包机制安装时这几个选项务必勾选[x] OpenSSH server后期文件传输全靠它[x] Docker省去手动安装的麻烦[ ] 自动更新必须取消离线环境无法更新装完系统后马上做这三件事备份/etc/apt/sources.list文件清空软件源配置echo /etc/apt/sources.list禁用自动更新服务sudo systemctl disable --now apt-daily.timer3. 离线环境下的Docker生存指南3.1 构建本地镜像仓库没有Docker Hub的日子就像没有外卖APP得自己建厨房。我推荐用Registry镜像搭建私有仓库# 先在能联网的机器上拉取registry镜像 docker pull registry:2 # 导出镜像文件备用 docker save -o registry.tar registry:2 # 把registry.tar拷贝到内网机器后加载 docker load -i registry.tar # 启动私有仓库数据持久化到本地 docker run -d -p 5000:5000 \ -v /opt/registry:/var/lib/registry \ --restartalways \ --name registry registry:2现在你可以用localhost:5000作为私有仓库地址了。比如要推送nginx镜像docker tag nginx localhost:5000/nginx docker push localhost:5000/nginx3.2 批量导入Dify依赖镜像Dify需要这些核心组件PostgreSQL 15数据库Redis 6缓存Weaviate 1.19向量引擎Nginx反向代理我整理了一个自动化导入脚本load_images.sh#!/bin/bash IMAGES( postgres_15-alpine.tar redis_6-alpine.tar semitechnologies_weaviate_1.19.0.tar nginx_latest.tar ) for image in ${IMAGES[]}; do echo 正在加载 $image... docker load -i $image # 打上私有仓库标签 docker tag $(docker inspect -f {{.ID}} $image | cut -d: -f2) \ localhost:5000/${image%.tar} done运行后记得检查是否所有镜像都成功注册docker images | grep localhost:50004. Dify本体部署的魔鬼细节4.1 源码获取与预处理在内网环境获取Dify源码有两种可靠方式通过跳板机用git bundle打包# 在外网机器执行 git clone --bare https://github.com/langgenius/dify.git cd dify.git git bundle create dify.bundle --all直接下载release压缩包推荐访问https://github.com/langgenius/dify/releases下载Source code (zip)格式把文件拷贝到内网后重点修改这些配置# docker-compose.yml 关键修改点 services: db: image: localhost:5000/postgres:15-alpine # 指向私有仓库 redis: image: localhost:5000/redis:6-alpine weaviate: image: localhost:5000/semitechnologies/weaviate:1.19.04.2 解决离线环境下的依赖安装Dify的Python依赖需要提前准备wheel包。在外网机器执行pip download -r requirements.txt --platform manylinux2014_x86_64 \ --only-binary:all: -d wheels/把wheels目录拷贝到内网后用这个命令安装pip install --no-index --find-links./wheels -r requirements.txt5. 部署后的关键检查点服务启动后别急着庆祝先运行这套检查流程组件连通性测试# 检查PostgreSQL docker exec -it dify-api psql -U postgres -c \l # 测试Redis docker exec -it dify-redis redis-cli pingAPI健康检查curl http://localhost/api/health # 应返回 {status: ok}前端静态资源验证ls /var/www/html/static/js/ # 确认有main.[hash].js等文件遇到最多的问题是Weaviate启动超时解决方法是在docker-compose.yml中添加weaviate: environment: - DISABLE_TELEMETRYtrue - QUERY_DEFAULTS_LIMIT25 - PERSISTENCE_DATA_PATH/var/lib/weaviate volumes: - /data/weaviate:/var/lib/weaviate6. 离线更新策略没有互联网的情况下更新版本是个挑战我的经验是建立镜像版本清单文件versions.txtpostgres:15-alpinesha256:abc123 redis:6-alpinesha256:def456使用diff工具对比新旧docker-compose.ymldiff -u old.yml new.yml upgrade.patch通过跳板机预下载所有新镜像docker-compose pull --ignore-pull-failures最后提醒一定要在测试环境验证至少24小时再上线生产环境。曾经有客户因为跳过测试导致Weaviate数据格式不兼容不得不回滚整个系统。