当前位置: 首页 > ds >正文

Docker CI/CD 自动化部署配置指南

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 生成访问令牌
  1. 登录Docker Hub
  2. 点击右上角头像 → Account Settings
  3. 选择 Security 标签
  4. 点击 New Access Token
  5. 填写Token名称:github-actions-token
  6. 权限选择:Read, Write, Delete
  7. 点击 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仓库设置
  1. 打开GitHub仓库:https://github.com/你的用户名/RuoYi-flowable-master
  2. 点击 Settings 标签
  3. 左侧菜单选择 Secrets and variablesActions
4.2 添加必需的Secrets

点击 New repository secret 逐一添加以下配置:

Secret名称说明示例值
DOCKER_REGISTRY_USERNAMEDocker Hub用户名mason2024
DOCKER_REGISTRY_TOKENDocker Hub访问令牌dckr_pat_xxxxxxxxxxxxx
DOCKER_REGISTRY_URLDocker仓库地址docker.io
SERVER_HOST服务器IP地址192.168.100.151
SERVER_USER服务器用户名root
SSH_PRIVATE_KEYSSH私钥内容-----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 Deploymenton:push:branches: [ main ]workflow_dispatch:  # 允许手动触发jobs:build-and-deploy:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up JDK 8uses: actions/setup-java@v3with:java-version: '8'distribution: 'temurin'cache: 'maven'- name: Build Backendrun: mvn clean package -DskipTests- name: Build Frontendrun: |cd ruoyi-uinpm installnpm run build:prod- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Login to Docker Registryuses: docker/login-action@v3with:username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}registry: ${{ secrets.DOCKER_REGISTRY_URL }}- name: Build and push Backend imageuses: docker/build-push-action@v5with:context: .file: .github/ci-cd/docker-deploy/Dockerfile.backendpush: truetags: |${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:latest${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-backend:${{ github.sha }}cache-from: type=ghacache-to: type=gha,mode=maxprovenance: false- name: Build and push Frontend imageuses: docker/build-push-action@v5with:context: .file: .github/ci-cd/docker-deploy/Dockerfile.frontendpush: truetags: |${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:latest${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:${{ github.sha }}cache-from: type=ghacache-to: type=gha,mode=maxprovenance: false- name: Deploy to Serveruses: appleboy/ssh-action@v1.0.3with: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:latestdocker pull ${{ secrets.DOCKER_REGISTRY_USERNAME }}/ruoyi-frontend:latest# 停止并删除旧容器docker stop ruoyi-backend ruoyi-frontend || truedocker 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-alpineLABEL 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:alpineLABEL 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 手动触发构建
  1. 访问:https://github.com/你的用户名/RuoYi-flowable-master/actions
  2. 选择 “Docker CI/CD Deployment” 工作流
  3. 点击 “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工作流版本
  • 服务器系统安全更新

🔒 安全注意事项

  1. SSH密钥安全

    • 定期轮换SSH密钥
    • 禁用密码登录,仅使用密钥认证
  2. Docker Hub令牌

    • 使用最小权限原则
    • 定期更新访问令牌
  3. 服务器安全

    • 配置防火墙规则
    • 定期更新系统补丁
    • 监控异常访问日志
  4. 数据库安全

    • 使用强密码
    • 限制数据库访问IP
    • 定期备份数据

🎉 配置完成

按照本指南完成配置后,你的RuoYi Flowable项目将具备:

  • ✅ 自动化CI/CD流程
  • ✅ Docker容器化部署
  • ✅ 前后端分离架构
  • ✅ 零停机更新能力
  • ✅ 完整的监控日志

每次代码提交都会自动构建和部署,大大提升开发效率!


联系信息:
如遇到问题,请检查GitHub Actions构建日志,大部分问题都能从日志中找到解决方案。

http://www.xdnf.cn/news/19841.html

相关文章:

  • 移动端富文本markdown中表格滚动与页面滚动的冲突处理:Touch 事件 + 鼠标滚轮精确控制方案
  • Android把源Bitmap中心缩放到固定宽高的尺寸,Kotlin
  • 【C语言进阶】指针进阶_数组指针
  • Corrosion: 2靶场渗透
  • B样条曲线节点消去方法介绍
  • SylixOS 下的信号系统
  • Python面试题及详细答案150道(91-100) -- 迭代器与生成器篇
  • 鸿蒙HarmonyOS应用开发者认证:抢占万物智联时代先机
  • 净利润超10亿元,智能类产品18倍增长!顾家家居2025年半年报业绩:零售增长强劲,整家定制多维突破,全球深化布局!|商派
  • Mysql安全之 TDE ,列加密,审计日志
  • Watt Toolkit下载安装并加速GitHub
  • AI 時代的白帽與黑帽 SEO:最佳實踐與趨勢解析
  • form表达和实体类通常有什么不同
  • STM32之SPI详解
  • 【IntelliJ IDEA】插件分享
  • 设计软件启动失败?“找不到vcruntime140.dll,无法继续执行代码” 场景化解决方案来了
  • 作为软件专业学生,我眼中新架构实践的‘稳’与‘进’
  • 【算法】哈希表专题
  • 【Lua】题目小练13
  • 多线程的三种实现方法
  • C#基础(⑦user32.dll)
  • 各省市信息化项目管理办法中的网络安全等级保护如何规定的?
  • 前缀树约束大语言模型解码
  • 05 Centos 7尝试是否有网络
  • 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
  • 解锁WebRTC在数字人领域的无限潜能
  • 【音视频】火山引擎实时、低延时拥塞控制算法的优化实践
  • centos系统如何判断是是x86还是x64?
  • ansible变量+管理机密
  • AV1 HEADERS详解