书接上文,在公司内网服务器成功部署 Dify 后,大家想必已经能用它搭建工作流、解决各类繁复任务了。但随着 Dify 官方的高频更新 —— 从 1.2.0 到 1.9.0,再到即将上线的 2.0.0,其功能迭代速度(尤其是工作流、知识库模块的完善)让人惊叹 AI 智能体平台的进步。看着官方的新功能,再对比自己服务器上的旧版本,是时候给 Dify 来一次 “大升级” 了!
本文记录了几个月前我从 Dify 1.2.0 升级到 1.7.0 的完整实操步骤及遇到的问题,适用于 非跨大版本的平滑更新(如 1.3.0→1.8.0);若涉及跨大版本(如 0.5.0→1.7.0),需额外考虑数据库结构差异、数据迁移等复杂因素,本文步骤可作为基础参考。
一、更新前准备:提前打包最新版镜像
与从零部署 Dify 的逻辑一致,首先需要获取并打包官方最新版的 Dify 镜像,确保内网服务器有可用的更新资源。
1.1 克隆最新源码
在能连接外网的机器上(如本地开发机),执行以下命令克隆 Dify 官方仓库:
# 克隆 Dify 最新源码仓库
git clone https://github.com/langgenius/dify.git
1.2 拉取并打包镜像
进入 Docker 部署目录,拉取最新镜像并打包(方便后续拷贝到内网服务器):
# 进入 Docker 部署目录
cd dify/docker
# 拉取最新版本的所有镜像
docker compose pull
# 生成镜像列表文件(排除 <none> 标签的镜像)
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" > image_list.txt
# 按列表打包所有镜像(生成 all_images.tar 文件)
docker save -o all_images.tar $(cat image_list.txt)
注:若对 “从零部署 Dify” 的细节不熟悉,可参考前一篇博客《Dify 公司内网部署教程及踩坑记录》的第二步,此处不再展开。
二、旧版本处理:备份关键数据 + 避免镜像冲突
在将最新镜像拷贝到公司内网服务器前,必须先处理服务器上正在运行的旧版 Dify,核心目标是备份数据不丢失、避免新旧镜像冲突。
2.1 备份核心配置与数据
旧版 Dify 的 docker 目录下,有两个关键文件和一个核心文件夹,必须完整备份:
- 配置文件:
./docker/.env(保存服务器适配的关键参数,如端口、密钥等) - 启动文件:
./docker/docker-compose.yaml(记录容器启动配置,若之前修改过需重点备份) - 数据文件夹:
./docker/volumes(保存所有业务数据,包括应用配置、知识库内容、用户信息等)
备份命令示例(将文件备份到 /home/backup/dify_old 目录):
# 创建备份目录
mkdir -p /home/backup/dify_old
# 拷贝配置文件和启动文件
cp ./docker/.env /home/backup/dify_old/
cp ./docker/docker-compose.yaml /home/backup/dify_old/
# 拷贝数据文件夹(保留原始权限和结构)
cp -r ./docker/volumes /home/backup/dify_old/volumes_backup
2.2 重命名旧镜像,避免冲突
旧版 Dify 依赖 postgres:15-alpine、nginx:latest、redis:6-alpine 三个基础镜像,若直接导入新版镜像,可能因 “标签重复” 导致镜像命名异常(Repo 和 Tag 显示为 <none>)。
建议先给旧镜像添加版本后缀(如 _120 代表 1.2.0 版本),再删除旧标签:
# 批量给旧基础镜像添加版本后缀
for img in "postgres:15-alpine" "nginx:latest" "redis:6-alpine"; do
docker tag $(docker images -q $img) "${img}_120"
done
# 删除旧镜像的原始标签(此时镜像仍存在,仅标签被移除)
docker rmi postgres:15-alpine nginx:latest redis:6-alpine
2.3 停止旧版服务
完成备份和镜像重命名后,停止旧版 Dify 服务:
# 进入旧版 Dify 的 docker 目录
cd /path/to/old/dify/docker
# 停止并移除旧容器(仅删除容器,数据已备份,镜像已重命名)
docker-compose down
三、新版部署:导入镜像 + 恢复数据 + 启动服务
将外网打包好的 dify 源码文件夹和 all_images.tar 镜像文件拷贝到内网服务器后,即可开始新版部署。
3.1 目录管理:区分版本便于回滚
建议给新版 Dify 目录添加版本后缀(如 dify170 代表 1.7.0 版本),方便后续版本管理和回滚:
# 将拷贝到内网的 dify 文件夹重命名
mv dify dify170
3.2 导入新版镜像
进入新版 Dify 的 docker 目录,导入之前打包的镜像:
# 进入新版 docker 目录
cd dify170/docker
# 导入镜像(若镜像文件改名,需替换为实际文件名,如 all_images_170.tar)
docker load -i all_images.tar
# 验证导入结果(应能看到新版镜像,且无 <none> 标签)
docker images
3.3 恢复配置与数据
核心是将旧版的配置和数据 “迁移” 到新版目录,确保业务连续性:
-
恢复配置文件:用备份的旧版
.env替换新版的.env(新版.env可能有新增参数,旧版文件会自动兼容,无需额外修改):cp /home/backup/dify_old/.env ./ -
恢复启动配置:若之前修改过
docker-compose.yaml(如添加privileged: true权限、调整端口映射),需将修改同步到新版的docker-compose.yaml中。注意:推荐在
.env中修改参数(如SERVER_WORKER_AMOUNT、SQLALCHEMY_POOL_RECYCLE),而非直接修改docker-compose.yaml,后者更符合 Dify 官方的配置规范,也便于后续更新。 -
恢复业务数据:用备份的
volumes_backup替换新版的volumes文件夹,确保历史数据能被新版读取:# 先删除新版默认的空 volumes 文件夹 rm -rf ./volumes # 拷贝备份的数据文件夹(重命名为 volumes) cp -r /home/backup/dify_old/volumes_backup ./volumes
3.4 启动新版服务与数据库迁移(可选)
3.4.1 启动服务
执行以下命令启动新版 Dify,容器会自动读取 volumes 中的历史数据:
docker-compose up -d
3.4.2 数据库迁移(非必需,视情况执行)
Dify 官方文档和部分社区教程会建议启动后执行 “数据库迁移”(确保数据库结构与新版适配),命令如下:
# 进入 api 容器(容器名通常为 docker-api-1,可通过 docker ps 确认)
docker exec -it docker-api-1 bash
# 执行数据库迁移
flask db upgrade
实测结论:对于 小版本更新(如 1.2.0→1.7.0),不执行上述迁移命令也能正常运行,旧版应用、知识库均无异常;若启动后出现数据库报错(如 “表不存在”“字段缺失”),再执行迁移命令即可,之后通过查看容器日志定位问题:
# 查看 api 容器日志,排查报错原因
docker logs docker-api-1
四、后续规划与总结
本次更新从 1.2.0 平滑过渡到 1.7.0,核心在于 “备份不遗漏、冲突提前防”:
- 备份时重点关注
env配置、volumes数据,这是业务连续性的关键; - 镜像重命名是避免冲突的核心技巧,尤其适用于内网无法实时拉取镜像的场景;
- 小版本更新无需强制执行数据库迁移,若有报错再处理,降低操作复杂度。
后续我会继续更新 Dify 相关内容,包括:
- Dify 性能优化(如调整容器资源、优化数据库查询);
- 数据库更换(如从默认的 Weaviate 迁移到 Milvus);
- 多节点部署(适用于高并发场景)。
欢迎关注我的博客,获取更多 Dify 实战技巧!
1122

被折叠的 条评论
为什么被折叠?



