CentOS 7 老树开新花:从零部署 Dify 全栈应用(含 Go/Rust/GCC 升级避坑)
本文档适用于在 CentOS 7 环境下使用源代码部署 Dify 应用,对应版本
1.9.2。由于系统较旧,部分依赖需手动升级或通过容器化方式解决兼容性问题。
一、安装与配置 Docker
1. 卸载旧版本 Docker(如有)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加 Docker 官方 YUM 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 安装 Docker Engine 及相关组件
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
6. 配置国内镜像加速器
创建 /etc/docker/daemon.json 文件:
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:
sudo systemctl daemon-reload
sudo systemctl restart docker
7. 将当前用户加入 docker 用户组(避免每次使用 sudo)
# 创建 docker 组(若不存在)
sudo groupadd docker
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 刷新组权限(关键!否则需重新登录)
newgrp docker
二、部署 Dify API 服务
1. 准备中间件服务(如 Redis、PostgreSQL 等)
- 修改
docker-compose.middleware.yaml和middleware.env中的数据卷路径 - 上传整个
docker/目录到服务器
启动中间件
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)
# 下载(使用国内镜像)
wget -O go1.23.0.linux-amd64.tar.gz https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz
# 解压到 /usr/local
sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
# 配置 PATH
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
go version
(2) 安装 Rust(使用 rsproxy.cn 镜像)
# 下载安装脚本
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
# 静默安装(不修改 PATH)
./rustup-init.sh -y --no-modify-path
# 临时加载环境变量
source "$HOME/.cargo/env"
# 验证
rustc --version
cargo --version
(3) 升级 GCC 至 9.3+
# 启用 SCL 源
sudo yum install -y centos-release-scl
# 安装 devtoolset-9
sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++
# 启用新 GCC(仅当前 shell 有效)
scl enable devtoolset-9 bash
# 验证
gcc --version # 应显示 9.3.x
✅ 建议 :将
scl enable devtoolset-9 bash加入~/.bashrc以持久生效(但注意可能影响其他程序)。
(4) 安装 uv(现代 Python 包管理器)
curl -LsSf https://astral.sh/uv/install.sh | sh
source "$HOME/.local/bin/env"
3. 部署 API 服务
- 修改
.env文件中的数据库地址、存储路径、日志目录等配置。 - 上传
api/目录到服务器(首次上传时请注释掉scp-api.sh中的启动逻辑)。
首次启动流程
cd /data/dify/api
# 安装依赖
uv sync
# 执行数据库迁移(首次必须运行)
flask db upgrade
# 后台启动 API 服务
nohup gunicorn -w 4 -k gevent --bind 0.0.0.0:5019 app:app > dify-api.log 2>&1 &
启动 Celery Worker
cd /data/dify/api
# 后台启动 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 &
🔁 后续重启:只需执行
# 启动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)
# 安装依赖
pnpm install --frozen-lockfile
# 构建(内存不足时增加堆大小)
NODE_OPTIONS="--max_old_space_size=4096" NEXT_CONCURRENT_BUILD_LIMIT=1 pnpm build
DIR1="web/.next/standalone/.next"
# 创建目录(-p 表示递归创建,且不报错如果已存在)
mkdir -p "$DIR1"
cp -r web/.next/static web/.next/standalone/.next/static && cp -r web/public web/.next/standalone/public
构建产物位于
standalone/目录。
(2) 编写 Dockerfile
# 使用官方 Node.js 22 Alpine 镜像
FROM node:22-alpine
WORKDIR /app
# 复制构建产物
COPY standalone ./
EXPOSE 3000
CMD ["node", "server.js"]
2. 在服务器部署 Web 服务
cd /data/dify/web
# 1. 清理旧容器与镜像
docker stop my-dify-web && docker rm my-dify-web && docker rmi my-dify-web
# 2. 解压新构建包(覆盖 standalone/)
tar -xzf dify-web-standalone.tar.gz
# 3. 构建新镜像
docker build -t my-dify-web .
# 4. 启动容器
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 上完整部署。
如遇问题,请优先检查依赖版本、网络连通性及配置文件路径。
希望这份部署文档能帮助你和团队更高效地完成部署!
本文由mdnice多平台发布