在金融、医疗这类强监管行业,服务器物理断网是硬性要求,这意味着Dify企业版的所有依赖——Docker镜像、前端静态资源、Python包、数据库初始化脚本——都得提前打包好,一次性塞进内网。否则,执行docker compose up时,系统一发现拉不到镜像,直接就卡死在启动阶段,连个像样的报错都不给。
分享一个实战经验:如果离线部署后容器反复重启,或者上传文件总报“Network Error”,十有八九是镜像没打全、Redis没就绪,或者防火墙端口没放开。下面把完整的操作流程拆开说,照着做能省不少排查时间。

准备离线部署包
在联网机器上完成以下操作:先克隆最新的Dify仓库,进入dify/docker目录,运行docker compose config --services确认服务列表,然后用docker images --format "{{.Repository}}:{{.Tag}}" | grep -E "(dify|postgres|redis|wea viate)" > services.list提取所有镜像名,最后执行docker sa ve $(cat services.list) -o dify-offline-images.tar打包。
切记,这一步只能在联网机器上完成,离线机是干不了这活的。如果漏掉了wea viate或redis的镜像,后续启动时容器会反复重启,日志里根本看不出原因。
同时下载对应版本的Dify源码压缩包(比如v1.11.4),解压后把docker/.env.example复制为.env,用文本编辑器打开,把所有的http://localhost替换成你的局域网静态IP,比如http://192.168.100.50。这一步不做好,后面前端页面就是白屏。
离线机环境初始化
推荐直接用Ubuntu Server 22.04 LTS,安装时记得勾选“Install OpenSSH server”和“Install Docker”。装完立刻执行sudo apt remove snapd && sudo apt autoremove——snap这东西会干扰Docker镜像加载,实测导致wea viate容器启动超时,坑得很。
如果非要用CentOS 7,那得手动升级Docker到26.1.4以上版本。先装yum-utils,然后加repo,再装docker-ce。另外CentOS 7默认用iptables,必须把firewalld停掉并禁用,否则Docker网络桥接不畅通,容器之间互相访问不了。
导入镜像并启动服务
把dify-offline-images.tar和源码目录拷到离线机的/opt/dify下,然后执行sudo docker load -i /opt/dify/dify-offline-images.tar,等终端返回“Loaded image(s): …”共12行确认信息。接着进入/opt/dify/docker目录,运行sudo docker compose up -d。
启动后马上用sudo docker ps -a | grep -E "(dify|wea viate|redis)"检查容器状态,正常应该显示Up (healthy)。如果看到wea viate是Restarting (1),那基本就是内存不足——这个容器最低需要4GB可用内存,宿主机剩余低于3.5GB必然挂掉。
配置局域网访问地址
编辑/opt/dify/docker/.env文件,确保下面六项全部指向同一个内网IP:
APP_WEB_URL=http://192.168.100.50
CONSOLE_WEB_URL=http://192.168.100.50
APP_API_URL=http://192.168.100.50
CONSOLE_API_URL=http://192.168.100.50
SERVICE_API_URL=http://192.168.100.50:5001
FILES_URL=http://192.168.100.50/files
保存后执行sudo docker compose restart,等30秒,用curl -I http://192.168.100.50/install验证,返回HTTP 200就对了。
开放防火墙端口
Ubuntu系统:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5001/tcp
sudo ufw enable
CentOS系统:
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=5001/tcp
sudo firewall-cmd --reload
这四个端口缺一不可。5001端口是专门给知识库上传文件用的,没开放的话前端界面会显示“Network Error”,但控制台没有任何具体报错,排查起来相当头疼。
验证同事可访问
在同局域网另一台Windows电脑的浏览器里输入http://192.168.100.50/install,页面能加载出Dify初始化向导就说明部署成功了。
如果提示“Connection refused”,检查一下离线机是否启用了host-only网络模式;如果页面空白,用sudo docker logs dify-web-1 | tail -20看日志,常见错误是Failed to connect to redis:6379,这说明Redis容器还没完全就绪,等它健康检查通过后再刷新即可。
