RuoYi Flowable Docker CI/CD 自动化部署配置指南
📋 概述
本指南详细介绍如何为RuoYi Flowable项目配置基于GitHub Actions + Docker Hub的自动化CI/CD部署流程。配置完成后,每次代码推送到GitHub都会自动构建Docker镜像并部署到云服务器。
🎯 实现目标
- 🚀 代码推送自动触发构建
- 🐳 自动构建Docker镜像推送到Docker Hub
- 🏗️ 自动部署到云服务器
- 📊 前后端分离部署
- 🔄 零停机部署更新
📁 项目结构
RuoYi-flowable/
├── .github/
│ ├── workflows/
│ │ └── docker-deploy.yml # GitHub Actions工作流
│ └── ci-cd/
│ └── docker-deploy/
│ ├── Dockerfile.backend # 后端Docker配置
│ ├── Dockerfile.frontend # 前端Docker配置
│ ├── nginx.conf # Nginx配置
│ └── startup.sh # 启动脚本
├── ruoyi-admin/ # 后端主模块
├── ruoyi-ui/ # 前端Vue项目
└── 其他模块...
🛠️ 详细配置步骤
第一步:Docker Hub 账号准备
1.1 注册Docker Hub账号
- 访问 https://hub.docker.com
- 注册账号,记住用户名(如:
mason2024
)
1.2 生成访问令牌
- 登录Docker Hub
- 点击右上角头像 → Account Settings
- 选择 Security 标签
- 点击 New Access Token
- 填写Token名称:
github-actions-token
- 权限选择:Read, Write, Delete
- 点击 Generate 并复制保存令牌(只显示一次)
第二步:云服务器准备
2.1 服务器环境要求
# 系统要求
Ubuntu 20.04+ 或 CentOS 7+
Docker 20.10+
至少 2GB RAM
至少 10GB 磁盘空间
2.2 安装Docker
# Ubuntu系统
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 添加用户到docker组
sudo usermod -aG docker $USER
2.3 创建Docker网络
# 创建项目专用网络
docker network create ruoyi-network
2.4 启动MySQL和Redis(如果没有)
# MySQL容器
docker run -d \
--name ruoyi-mysql \
--network ruoyi-network \
--restart always \
-p 3003:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=ry-vue \
-v /opt/ruoyi/mysql:/var/lib/mysql \
mysql:8.0
# Redis容器
docker run -d \
--name ruoyi-redis \
--network ruoyi-network \
--restart always \
-p 3004:6379 \
-v /opt/ruoyi/redis:/data \
redis:6.2-alpine redis-server --appendonly yes
第三步:SSH密钥配置
3.1 生成SSH密钥(在本地Windows)
# 打开PowerShell或Git Bash
ssh-keygen -t ed25519 -C "your-email@example.com"
# 查看公钥
cat ~/.ssh/id_ed25519.pub
# 查看私钥(用于GitHub Secrets)
cat ~/.ssh/id_ed25519
3.2 配置服务器SSH访问
# 在服务器上执行
mkdir -p ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 测试SSH连接
ssh -i ~/.ssh/id_ed25519 root@你的服务器IP
第四步:GitHub Secrets配置
4.1 访问GitHub仓库设置
- 打开GitHub仓库:https://github.com/你的用户名/RuoYi-flowable-master
- 点击 Settings 标签
- 左侧菜单选择 Secrets and variables → Actions
4.2 添加必需的Secrets
点击 New repository secret 逐一添加以下配置:
Secret名称 | 说明 | 示例值 |
---|---|---|
DOCKER_REGISTRY_USERNAME |
Docker Hub用户名 | mason2024 |
DOCKER_REGISTRY_TOKEN |
Docker Hub访问令牌 | dckr_pat_xxxxxxxxxxxxx |
DOCKER_REGISTRY_URL |
Docker仓库地址 | docker.io |
SERVER_HOST |
服务器IP地址 | 192.168.100.151 |
SERVER_USER |
服务器用户名 | root |
SSH_PRIVATE_KEY |
SSH私钥内容 | -----BEGIN OPENSSH PRIVATE KEY-----\n... |
4.3 配置详细说明
DOCKER_REGISTRY_USERNAME
值:你的Docker Hub用户名
示例:mason2024
DOCKER_REGISTRY_TOKEN
值:在Docker Hub生成的访问令牌
示例:dckr_pat_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk
注意:这是敏感信息,绝不能泄露
SSH_PRIVATE_KEY
值:完整的SSH私钥,包括头尾
格式:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...(多行内容)...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
第五步:项目文件配置
5.1 GitHub Actions工作流文件
确保 .github/workflows/docker-deploy.yml
内容正确:
name: Docker CI/CD Deployment
on:
push:
branches: [ main ]
workflow_dispatch: # 允许手动触发
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- name: Build Backend
run: mvn clean package -DskipTests
- name: Build Frontend
run: |
cd ruoyi-ui
npm install
npm run build:prod
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}
registry: ${{ secrets.DOCKER_REGISTRY_URL }}
- name: Build and push Backend image
uses: docker/build-push-action@v5
with:
context: .
file: .github/ci-cd/docker-deploy/Dockerfile.backend
push: true
tags: |
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:latest
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: false
- name: Build and push Frontend image
uses: docker/build-push-action@v5
with:
context: .
file: .github/ci-cd/docker-deploy/Dockerfile.frontend
push: true
tags: |
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:latest
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: false
- name: Deploy to Server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# 登录Docker仓库
echo "${{ secrets.DOCKER_REGISTRY_TOKEN }}" | docker login ${{ secrets.DOCKER_REGISTRY_URL }} -u ${{ secrets.DOCKER_REGISTRY_USERNAME }} --password-stdin
# 拉取最新镜像
docker pull ${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:latest
docker pull ${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:latest
# 停止并删除旧容器
docker stop ruoyi-backend ruoyi-frontend || true
docker rm ruoyi-backend ruoyi-frontend || true
# 启动后端容器(连接到ruoyi-network)
docker run -d \
--name ruoyi-backend \
--network ruoyi-network \
--restart always \
-p 3021:8080 \
-v /opt/ruoyi/logs:/app/logs \
-v /opt/ruoyi/upload:/app/upload \
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:latest
# 启动前端容器
docker run -d \
--name ruoyi-frontend \
--restart always \
-p 3022:3023 \
${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:latest
# 清理旧镜像
docker image prune -af
5.2 后端Dockerfile
.github/ci-cd/docker-deploy/Dockerfile.backend
:
FROM openjdk:8-jdk-alpine
LABEL maintainer="CI/CD Automation <ci-cd@example.com>"
# 安装必要的包
RUN apk add --no-cache tzdata bash curl
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 创建应用目录
WORKDIR /app
# 复制jar文件
COPY ruoyi-admin/target/*.jar app.jar
# 复制启动脚本
COPY .github/ci-cd/docker-deploy/startup.sh /app/startup.sh
RUN chmod +x /app/startup.sh
# 创建日志和上传目录
RUN mkdir -p /app/logs /app/upload
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/actuator/health || exit 1
# 启动应用
ENTRYPOINT ["/app/startup.sh"]
5.3 前端Dockerfile
.github/ci-cd/docker-deploy/Dockerfile.frontend
:
FROM nginx:alpine
LABEL maintainer="CI/CD Automation <ci-cd@example.com>"
# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf
# 复制Nginx配置
COPY .github/ci-cd/docker-deploy/nginx.conf /etc/nginx/conf.d/
# 复制前端构建文件
COPY ruoyi-ui/dist /usr/share/nginx/html
# 暴露端口
EXPOSE 3023
# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]
5.4 启动脚本
.github/ci-cd/docker-deploy/startup.sh
:
#!/bin/sh
# 设置默认环境变量
export SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-prod}
export SERVER_PORT=${SERVER_PORT:-8080}
# 数据库配置(使用容器网络内的服务名)
export SPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL:-jdbc:mysql://ruoyi-mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&useSSL=false}
export SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME:-root}
export SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD:-123456}
# Redis配置
export SPRING_REDIS_HOST=${SPRING_REDIS_HOST:-ruoyi-redis}
export SPRING_REDIS_PORT=${SPRING_REDIS_PORT:-6379}
# 等待数据库就绪(可选)
echo "等待数据库服务就绪..."
sleep 10
# 启动应用
exec java -jar /app/app.jar
5.5 Nginx配置
.github/ci-cd/docker-deploy/nginx.conf
:
server {
listen 3023;
server_name localhost;
# 前端静态文件
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# API代理到后端
location /prod-api/ {
proxy_pass http://ruoyi-backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 文件上传代理
location /upload/ {
proxy_pass http://ruoyi-backend:8080/upload/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 健康检查
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
第六步:部署测试
6.1 手动触发构建
- 访问:https://github.com/你的用户名/RuoYi-flowable-master/actions
- 选择 “Docker CI/CD Deployment” 工作流
- 点击 “Run workflow” → 选择 “main” 分支 → 点击 “Run workflow”
6.2 推送代码自动触发
# 提交任意更改
git add .
git commit -m "测试自动部署"
git push origin main
6.3 查看构建状态
- GitHub Actions页面实时查看构建日志
- 成功标志:所有步骤显示绿色✅
第七步:访问应用
部署成功后,通过以下地址访问:
前端页面:http://你的服务器IP:3022
后端API:http://你的服务器IP:3021
示例:
前端:http://192.168.100.151:3022
后端:http://192.168.100.151:3021/prod-api/captchaImage
第八步:监控和维护
8.1 查看容器状态
# 查看运行状态
docker ps
# 查看日志
docker logs ruoyi-backend
docker logs ruoyi-frontend
# 实时查看日志
docker logs -f ruoyi-backend
8.2 手动重启容器
# 重启后端
docker restart ruoyi-backend
# 重启前端
docker restart ruoyi-frontend
8.3 更新部署
每次代码推送到main分支都会自动触发部署更新。
🚨 故障排查
常见问题1:GitHub Actions构建失败
错误信息: invalid tag "/ruoyi-backend:latest"
解决方案: 检查GitHub Secrets中的 DOCKER_REGISTRY_USERNAME
是否正确配置
错误信息: Login Succeeded
但推送失败
解决方案: 检查Docker Hub访问令牌权限是否包含写入权限
常见问题2:服务器连接失败
错误信息: ssh: connect to host xxx port 22: Connection refused
解决方案:
# 检查SSH服务
sudo systemctl status ssh
sudo systemctl start ssh
# 检查防火墙
sudo ufw allow 22
常见问题3:容器启动失败
错误信息: 数据库连接失败
解决方案:
# 检查MySQL容器
docker ps | grep mysql
docker logs ruoyi-mysql
# 检查网络连接
docker network ls
docker inspect ruoyi-network
常见问题4:端口冲突
错误信息: port is already allocated
解决方案:
# 查看端口占用
netstat -tlnp | grep :3021
lsof -i :3021
# 停止冲突的容器
docker stop $(docker ps -q --filter "publish=3021")
📝 维护清单
定期维护任务
每周检查:
- 查看GitHub Actions构建历史
- 检查服务器磁盘空间使用情况
- 查看容器运行状态和日志
每月维护:
- 清理Docker无用镜像:
docker system prune -af
- 更新Docker Hub访问令牌(如有需要)
- 备份数据库数据
升级维护:
- 更新Docker镜像基础版本
- 升级GitHub Actions工作流版本
- 服务器系统安全更新
🔒 安全注意事项
SSH密钥安全
- 定期轮换SSH密钥
- 禁用密码登录,仅使用密钥认证
Docker Hub令牌
- 使用最小权限原则
- 定期更新访问令牌
服务器安全
- 配置防火墙规则
- 定期更新系统补丁
- 监控异常访问日志
数据库安全
- 使用强密码
- 限制数据库访问IP
- 定期备份数据
🎉 配置完成
按照本指南完成配置后,你的RuoYi Flowable项目将具备:
- ✅ 自动化CI/CD流程
- ✅ Docker容器化部署
- ✅ 前后端分离架构
- ✅ 零停机更新能力
- ✅ 完整的监控日志
每次代码提交都会自动构建和部署,大大提升开发效率!
联系信息:
如遇到问题,请检查GitHub Actions构建日志,大部分问题都能从日志中找到解决方案。