前言

本文面向需要在 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(如 en33eth0),请先用以下命令查看所有网卡名,然后替换命令中的网卡名:

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 为例

  1. 打开 VMware 菜单 → 编辑 → 虚拟网络编辑器

  2. 选中 VMnet8 (NAT) → 点击 NAT 设置

  3. 点击 添加,填写以下规则:

主机端口 虚拟机 IP 地址 虚拟机端口 描述
8080 192.168.88.128 80 Dify Web
  1. 保存后,在宿主机浏览器访问:http://localhost:8080

以 VirtualBox 为例

  1. 关闭虚拟机 → 右键虚拟机 → 设置 → 网络

  2. 连接方式选择 NAT → 点击 高级 → 端口转发

  3. 添加规则:名称任意,主机端口 8080,子系统端口 80

  4. 启动虚拟机,宿主机访问 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.json JSON 格式是否正确(可用 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 应用了!


参考链接

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐