CentOS 7 老树开新花:从零部署 Dify 全栈应用(含 Go/Rust/GCC 升级避坑)
本文档适用于在 CentOS 7 环境下使用源代码部署 Dify 应用,对应版本 1.9.2。由于系统较旧,部分依赖需手动升级或通过容器化方式解决兼容性问题。
一、安装与配置 Docker
1. 卸载旧版本 Docker(如有)
1 2 3 4 5 6 7 8
| sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
|
2. 安装必要依赖
1
| sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
3. 添加 Docker 官方 YUM 源
1
| sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
4. 安装 Docker Engine 及相关组件
1
| sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
5. 启动并设置开机自启
1 2
| sudo systemctl start docker sudo systemctl enable docker
|
6. 配置国内镜像加速器
创建 /etc/docker/daemon.json 文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc", "https://do.nark.eu.org", "https://dc.j8.work", "https://gst6rzl9.mirror.aliyuncs.com", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "http://mirrors.ustc.edu.cn/", "https://mirrors.tuna.tsinghua.edu.cn/", "http://mirrors.sohu.com/" ] } EOF
|
⚠️ 注意:修改后需重载配置并重启 Docker:
1 2
| sudo systemctl daemon-reload sudo systemctl restart docker
|
7. 将当前用户加入 docker 用户组(避免每次使用 sudo)
1 2 3 4 5 6 7 8
| sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
|
二、部署 Dify API 服务
1. 准备中间件服务(如 Redis、PostgreSQL 等)
- 修改
docker-compose.middleware.yaml 和 middleware.env 中的数据卷路径
- 上传整个
docker/ 目录到服务器
启动中间件
1 2
| cd /data/dify/docker docker compose -f docker-compose.middleware.yaml up -d
|
停止命令:docker compose -f docker-compose.middleware.yaml down
2. 安装构建依赖环境
原因:Dify 使用的 wandb >= 0.16.0 要求本地存在 Go 编译环境;同时 numpy==2.4.1 需要 GCC ≥ 9.3,而 CentOS 7 默认 GCC 仅为 4.8.5。
(1) 安装 Go(1.23.0)
1 2 3 4 5 6 7 8 9 10 11 12
| wget -O go1.23.0.linux-amd64.tar.gz https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc
go version
|
(2) 安装 Rust(使用 rsproxy.cn 镜像)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| wget -O rustup-init.sh https://rsproxy.cn/rustup-init.sh chmod +x rustup-init.sh
export RUSTUP_DIST_SERVER=https://rsproxy.cn export RUSTUP_UPDATE_ROOT=https://rsproxy.cn/rustup
./rustup-init.sh -y --no-modify-path
source "$HOME/.cargo/env"
rustc --version cargo --version
|
(3) 升级 GCC 至 9.3+
1 2 3 4 5 6 7 8 9 10 11
| sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++
scl enable devtoolset-9 bash
gcc --version
|
✅ 建议:将 scl enable devtoolset-9 bash 加入 ~/.bashrc 以持久生效(但注意可能影响其他程序)。
(4) 安装 uv(现代 Python 包管理器)
1 2
| curl -LsSf https://astral.sh/uv/install.sh | sh source "$HOME/.local/bin/env"
|
3. 部署 API 服务
- 修改
.env 文件中的数据库地址、存储路径、日志目录等配置。
- 上传
api/ 目录到服务器(首次上传时请注释掉 scp-api.sh 中的启动逻辑)。
首次启动流程
1 2 3 4 5 6 7 8 9 10
| cd /data/dify/api
uv sync
flask db upgrade
nohup gunicorn -w 4 -k gevent --bind 0.0.0.0:5019 app:app > dify-api.log 2>&1 &
|
启动 Celery Worker
1 2 3 4 5
| cd /data/dify/api
nohup uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO \ -Q dataset,generation,mail,ops_trace > dify-worker.log 2>&1 &
|
🔁 后续重启:只需执行
1 2 3 4 5
| # 启动API服务 nohup gunicorn -w 4 -k gevent --bind 0.0.0.0:5019 app:app > dify-api.log 2>&1 & # 启动worker nohup uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO \ -Q dataset,generation,mail,ops_trace > dify-worker.log 2>&1 &
|
三、部署 Dify Web 前端
说明:CentOS 7 无法原生安装 Node.js 20+,因此采用 Docker 容器化部署。
1. 构建 Web 镜像(在开发机上操作)
(1) 本地编译(需 Node.js ≥ 22)
1 2 3 4 5 6 7 8 9 10 11
| pnpm install --frozen-lockfile
NODE_OPTIONS="--max_old_space_size=4096" NEXT_CONCURRENT_BUILD_LIMIT=1 pnpm build
DIR1="web/.next/standalone/.next"
mkdir -p "$DIR1" cp -r web/.next/static web/.next/standalone/.next/static && cp -r web/public web/.next/standalone/public
|
构建产物位于 standalone/ 目录。
(2) 编写 Dockerfile
1 2 3 4 5 6 7 8 9 10 11
| FROM node:22-alpine
WORKDIR /app
COPY standalone ./
EXPOSE 3000
CMD ["node", "server.js"]
|
2. 在服务器部署 Web 服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| cd /data/dify/web
docker stop my-dify-web && docker rm my-dify-web && docker rmi my-dify-web
tar -xzf dify-web-standalone.tar.gz
docker build -t my-dify-web .
docker run -d \ --name my-dify-web \ -p 3000:3000 \ my-dify-web
|
3. 配置 Web 环境变量
- 修改
standalone/.env.local 中的 NEXT_PUBLIC_API_URL 和 NEXT_PUBLIC_WEB_URL,指向实际 API 与 Web 地址。
🔄 更新 Web 服务:重复上述“清理 → 解压 → 构建 → 启动”流程,或封装为脚本自动化。
四、注意事项
- 权限问题:确保
/data/dify/ 目录对当前用户可读写。
- 防火墙:开放 5019(API)、3000(Web)、以及中间件所需端口(如 6379、5432 等)。
- 日志监控:定期检查
dify-api.log 和 dify-worker.log。
- 环境持久化:若使用
scl enable,建议在 ~/.bashrc 中添加 alias 或 wrapper 脚本。
✅ 至此,Dify 已在 CentOS 7 上完整部署。
如遇问题,请优先检查依赖版本、网络连通性及配置文件路径。
希望这份部署文档能帮助你和团队更高效地完成部署!