CentOS 7 虚拟机部署 Dify
前言
本文面向需要在 CentOS 7 虚拟机 环境下部署 Dify v1.10.1 的技术人员,系统梳理从环境准备到成功登录的完整流程。内容涵盖部署过程中的常见技术障碍及其根本原因,包括 Docker 镜像拉取超时、容器挂载卷权限拒绝、SELinux 安全策略拦截 等问题的精确解决方案。文中所列操作步骤均经过实际环境验证,旨在为读者提供一份可复现、高成功率的部署参考。
环境说明
-
操作系统:CentOS 7 / Rocky Linux 8(本文以 CentOS 7 为例)
-
Docker 版本:20.10+(已安装)
-
Docker Compose 版本:v2.x(插件版或独立版均可)
-
部署方式:基于源码 + Docker Compose 一键部署
-
目标版本:Dify v1.10.1(国内镜像可用版本)
一、配置 Docker 镜像加速
由于众所周知的原因,直接从 Docker Hub 拉取镜像经常会超时。我们需要先配置国内可用的镜像加速器。
1.1 编辑 daemon.json
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
⚠️ 注意:许多旧镜像源(如中科大、清华、网易)已停止服务,请务必使用上述 2026 年实测可用的地址。
1.2 重启 Docker 并验证
sudo systemctl restart docker
docker info | grep -A 5 "Registry Mirrors"
若输出中显示了你配置的三个镜像地址,则代表加速器已生效。
二、获取 Dify 源码
2.1 克隆源码(使用国内镜像加速)
直接从 GitHub 克隆可能很慢或失败,建议使用 Gitee 上的官方镜像:
git clone https://gitee.com/dify_ai/dify.git
cd dify
2.2 (可选)切换到指定版本
# 查看所有可用版本标签
git tag
# 切换到稳定版本(本文以 1.10.1 为例)
git checkout 1.10.1
三、首次启动服务
进入 docker 目录并启动所有容器:
cd docker
cp .env.example .env # 首次需准备环境变量文件
docker compose up -d
启动完成后,可通过以下命令查看容器状态:
docker compose ps
确保所有服务的 State 均为 Up(或 healthy)。
四、配置网络访问(确保能打开页面)
在尝试访问 Dify 之前,需要确保你的宿主机能够连通虚拟机的服务端口。
4.1 获取虚拟机 IP 地址(精准定位 ens33 网卡)
在虚拟机终端中执行以下任一命令,直接获取物理网卡 ens33 的 IPv4 地址。
方法一(使用 ifconfig,需先安装 net-tools):
# 安装 ifconfig 工具(若未安装)
sudo yum install net-tools -y
# 查看 ens33 网卡的 IP
ifconfig ens33 | grep 'inet ' | awk '{print $2}'
方法二(使用现代 ip 命令,推荐):
ip -4 addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
若网卡名不是 ens33(如 en33、eth0),请先用以下命令查看所有网卡名,然后替换命令中的网卡名:
ip link show | grep -E '^[0-9]+:' | cut -d: -f2 | tr -d ' '
命令输出即为虚拟机的真实 IP,例如 192.168.88.128。记下该地址,后续访问将用到。
⚠️ 注意:请勿使用
127.0.0.1,这是虚拟机的本地回环地址,宿主机无法通过它访问。
4.2 根据网络模式访问
情况一:桥接模式(推荐)
若虚拟机 IP 与宿主机处于同一网段(如宿主机 IP 为 192.168.1.10,虚拟机为 192.168.1.100),直接在宿主机浏览器访问:
http://<虚拟机IP>
例如:http://192.168.1.100
情况二:NAT 模式(需端口转发)
若使用 NAT 模式(虚拟机 IP 为 192.168.88.x 或 10.0.2.x),宿主机无法直接访问虚拟机,需在虚拟机软件中设置端口转发。
以 VMware 为例:
-
打开 VMware 菜单 → 编辑 → 虚拟网络编辑器。
-
选中
VMnet8 (NAT)→ 点击 NAT 设置。 -
点击 添加,填写以下规则:
| 主机端口 | 虚拟机 IP 地址 | 虚拟机端口 | 描述 |
|---|---|---|---|
| 8080 | 192.168.88.128 | 80 | Dify Web |
-
保存后,在宿主机浏览器访问:
http://localhost:8080
以 VirtualBox 为例:
-
关闭虚拟机 → 右键虚拟机 → 设置 → 网络。
-
连接方式选择 NAT → 点击 高级 → 端口转发。
-
添加规则:名称任意,主机端口
8080,子系统端口80。 -
启动虚拟机,宿主机访问
http://localhost:8080
情况三:防火墙拦截
若配置正确但仍无法访问,可能是虚拟机防火墙未放行端口。可临时关闭防火墙测试:
sudo systemctl stop firewalld
测试通过后,建议永久放行 80 端口:
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
✅ 验证:在宿主机浏览器打开对应地址,看到 Dify 的初始化设置页面,说明网络已通,可进入下一步。
五、修复权限与 SELinux(解决提交报错)
当你填写完管理员信息并点击提交时,大概率会遇到如下报错:
Setup failed: PermissionDenied (persistent) at write => permission denied Context: service: fs path: privkeys/xxxxx/private.pem Source: Permission denied (os error 13)
这是因为宿主机目录权限和 SELinux 阻止了容器进程写入挂载卷。以下是完整的修复步骤。
5.1 确认挂载配置已存在
编辑 docker-compose.yaml,确保 api 服务的 volumes 中包含以下行:
volumes: - ./volumes/app/storage:/app/api/storage # 必须存在
对于 v1.10.1 版本,该行已经默认存在,无需手动添加。
5.2 执行完整修复流程
# 1. 停止所有服务
docker compose down
# 2. 创建 storage 目录并设置正确的所有者和权限
mkdir -p ./volumes/app/storage
sudo chown -R 1001:1001 ./volumes/app/storage
sudo chmod -R 755 ./volumes/app/storage
# 3. 为挂载目录打上 SELinux 标签(CentOS/RHEL 必须执行)
sudo chcon -Rt svirt_sandbox_file_t ./volumes/
# 4. 重新启动服务
docker compose up -d
# 5. 在容器内生成加密密钥对
docker compose exec api flask reset-encrypt-key-pair
# 出现 [y/N] 提示时输入 y 并回车
5.3 为什么这样做?
| 操作 | 作用 |
|---|---|
chown -R 1001:1001 |
Dify API 容器以 UID 1001 运行,需将挂载目录所有权交给该用户 |
chcon -t svirt_sandbox_file_t |
告诉 SELinux:这是专门给容器使用的共享目录,允许写入 |
flask reset-encrypt-key-pair |
生成用于加密存储 API Key 的私钥文件 |
🔒 安全提醒:
chcon并非关闭 SELinux,而是精准授权,系统的其他部分仍受 SELinux 严格保护。
六、完成初始化
权限和密钥问题修复后,回到浏览器,刷新 Dify 初始化页面,重新填写管理员邮箱、用户名和密码,点击“设置”或“注册”按钮。
若一切顺利,页面将提示创建成功并自动跳转至登录页面。此时输入刚刚设置的管理员邮箱和密码,即可进入 Dify 的主控面板,开始创建你的第一个 AI 应用。
📷 截图建议:此处可附上您实际部署成功后看到的 Dify 登录界面或主控面板截图,以增加文章可信度。
七、部署后的重要事项
7.1 立即备份私钥
tar -czf dify_privkeys_backup.tar.gz ./volumes/app/storage/privkeys/
将备份文件保存到安全位置。该私钥是解密所有已配置 API Key 的唯一凭证,丢失将导致已添加的模型密钥无法解密。
7.2 SELinux 标签持久化(可选)
若希望系统重启或 relabel 后标签不丢失:
sudo semanage fcontext -a -t svirt_sandbox_file_t "/root/dify/docker/volumes(/.*)?"
sudo restorecon -Rv /root/dify/docker/volumes
八、常见问题排查
Q1:执行 docker info 看不到镜像加速地址?
-
检查
/etc/docker/daemon.jsonJSON 格式是否正确(可用python3 -m json.tool校验)。 -
是否执行了
systemctl restart docker而不仅仅是daemon-reload。
Q2:修复权限后仍报 Permission denied?
-
确认 SELinux 是否处于
Enforcing模式(getenforce)。 -
执行
ls -laZ ./volumes/app/storage查看标签是否为svirt_sandbox_file_t。
Q3:容器内 flask reset-encrypt-key-pair 找不到命令?
-
确认容器名称是否正确:
docker ps查看 api 容器名,通常为docker-api-1。
结语
Dify 官方文档虽简洁,但在国内网络环境和 CentOS 默认安全策略下,初次部署难免遇到镜像拉取、网络连通、权限和 SELinux 的连环坑。本文按照“先通网络、再修权限”的正确顺序梳理了全流程,希望能帮你节省数小时的排查时间。成功部署后,你就可以愉快地在 Dify 中搭建自己的 AI 应用了!
参考链接:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)