SpringBoot+Vue 部署步记录

jgybzx
2026-06-23 / 0 评论 / 42 阅读 / 正在检测是否收录...

SpringBoot+Vue 部署步记录

基于腾讯云服务器OpenCloudOS 9镜像

NAME="OpenCloudOS"
VERSION="9.4"
ID="opencloudos"
ID_LIKE="opencloudos"
VERSION_ID="9.4"
PLATFORM_ID="platform:oc9"
PRETTY_NAME="OpenCloudOS 9.4"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:opencloudos:opencloudos:9"
HOME_URL="https://www.opencloudos.org/"
BUG_REPORT_URL="https://bugs.opencloudos.tech/"
6.6.119-49.22.oc9.x86_64


一、使用dnf安装 Docker CE

1. 卸载旧版

sudo dnf remove -y docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

2. 安装依赖并添加 Docker 仓库

dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3. 如果官方源连接失败,切换为国内镜像源

rm -f /etc/yum.repos.d/docker-ce.repo
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

4. 安装 Docker CE 套件

dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5. 启动 & 自启

systemctl start docker
systemctl enable docker

二、配置国内镜像加速

1. 写入 registry-mirrors(毫秒镜像优先)

mkdir -p /etc/docker
tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://mirror.ccs.tencentyun.com"
  ]
}
EOF

2. 重载 & 重启

systemctl daemon-reexec
systemctl restart docker

3. 校验

docker --version          # Docker version 29.5.2
docker compose version    # Docker Compose version v5.1.4
docker run --rm hello-world

三、创建自定义容器网络(容器间用名字互通)

docker network create app-net
docker network ls | grep app-net

期望:app-net bridge local

外网访问仍走 -p 宿主机:容器,容器互通走 app-net

Docker 安装Mysql8

一、系统基础准备

1. 创建数据目录结构

mkdir -p /data/mysql8.4.5/{conf,data,logs}
chown -R 999:999 /data/mysql8.4.5

2. 准备配置文件

另存为my.cnf
放到/data/mysql8.4.5/conf下

# =====================================
# MySQL Client 客户端配置
# =====================================
[mysql]
default-character-set=utf8mb4

# =====================================
# MySQL Server 服务端配置 (4G内存优化版)
# =====================================
[mysqld]
# ---------- 基础运行配置 ----------
user=mysql
port=3306
default-time-zone='+08:00'
skip-name-resolve

# ---------- 字符集配置 ----------
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# ---------- 连接与线程 ----------
# 4G 内存,给 200 连接足够用了(太多反而容易 OOM)
max_connections=200
max_connect_errors=1000
wait_timeout=300
interactive_timeout=300

# ---------- InnoDB 核心(重点调这里)----------
# 4G 内存,给 2G 给 Buffer Pool 是最稳的(留内存给 OS 和系统进程)
innodb_buffer_pool_size=2G
# 日志缓冲(16M 偏小,写并发高时建议 64M)
innodb_log_buffer_size=64M
innodb_lock_wait_timeout=50
# 如果是金融/订单数据,请务必改回 1;如果是博客/内部系统,2 没问题
innodb_flush_log_at_trx_commit=2
sync_binlog=0
innodb_thread_concurrency=4

# ---------- MyISAM(基本不用,留个底) ----------
key_buffer_size=8M

# ---------- SQL 模式 ----------
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# ---------- 日志管理 ----------
slow_query_log=1
long_query_time=2

# 【重要】Docker 里这个路径必须存在,否则 MySQL 起不来
log-error=/var/log/mysql/error.log

# ---------- 新增:Docker 友好配置 ----------
# 禁用符号链接(安全)
symbolic-links=0

二、安装

docker stop mysql8.4.5
docker rm mysql8.4.5
docker run -d \
  --name mysql8.4.5 \
  --network app-net \
  --restart=unless-stopped \
  -p 6526:3306 \
  -e MYSQL_ROOT_PASSWORD=root \
  -v /data/mysql8.4.5/conf:/etc/mysql/conf.d \
  -v /data/mysql8.4.5/data:/var/lib/mysql \
  -v /data/mysql8.4.5/logs:/var/log/mysql \
  mysql:8.4.5

三、验证

docker exec -it mysql8.4.5 mysql -uroot -p
# 输入密码,进入mysql容器
#执行
select 1;
# 期望输出
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

四、建立各类账号

1、root账号,仅限容器内访问

root 账号仅用于数据库宿主机本地维护,禁止任何业务、任何程序、任何人远程使用

DROP USER IF EXISTS 'root'@'%';

ALTER USER 'root'@'localhost' IDENTIFIED  BY '强密码';

FLUSH PRIVILEGES;

2、开发账号,限定你的出口 IP

直接百度"ip"

CREATE USER 'app_dev'@'公网IP' IDENTIFIED  BY '强密码';

# 开发需要建表改结构,给 ALL,但建议回收删库权限
GRANT ALL PRIVILEGES ON *.* TO 'app_dev'@'公网IP';
#如果你不想受 IP 变动困扰,可以用 %,但密码一定要强。

FLUSH PRIVILEGES;

3、测试账号,容器间访问

CREATE USER 'app_test'@'172.%' IDENTIFIED  BY '强密码';

# 赋予全部权限 test_db 改为想要访问哪个数据库
GRANT ALL PRIVILEGES ON test_db.* TO 'app_test'@'172.%';
FLUSH PRIVILEGES;

4、生产账号,容器间访问

CREATE USER 'app_prod'@'172.%' IDENTIFIED  BY '强密码';

# 生产环境严格控制(不给删改表结构权限) prod_db 改为想要访问哪个数据库
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON prod_db.* TO 'app_prod'@'172.%';

最后 FLUSH PRIVILEGES;


Docker 安装redis

一、系统基础准备

1. 创建数据目录结构

mkdir -p /data/redis/{conf,data}

2. 准备配置文件

另存为redis.conf
放到 /data/redis/conf/ 下

# ======================
# 基础
# ======================
bind 0.0.0.0
port 6379
daemonize no
supervised no


# ======================
# 内存(一定要和 docker --memory 对齐)
# ======================
maxmemory 400mb
maxmemory-policy allkeys-lru

# ======================
# 持久化(AOF + RDB,稳妥方案)
# ======================
appendonly yes
appendfsync everysec

save 900 1
save 300 10
save 60 10000

# ======================
# 禁用高危命令(防误删)
# ======================
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

# ======================
# 连接与超时
# ======================
timeout 300
tcp-keepalive 60

# ======================
# 日志
# ======================
loglevel notice
logfile ""

# ======================
# 客户端
# ======================
databases 16

二、安装

⚠️ Redis 密码通过启动参数传入,不在配置文件中保存;

若修改密码,只需调整 docker run 命令,无需更改配置文件。

docker run -d \
  --name redis \
  --network app-net \
  --restart=unless-stopped \
  --memory=512m \
  --memory-swap=512m \
  -p 6527:6379 \
  -v /data/redis/conf/redis.conf:/etc/redis/redis.conf:ro \
  -v /data/redis/data:/data \
  redis:7.2 \
  redis-server /etc/redis/redis.conf \
  --requirepass 你的密码

三、验证

docker logs redis --tail 20

Docker 安装nginx

一、系统基础准备

1. 创建数据目录结构

mkdir -p /data/nginx/{conf/conf.d,html,logs,ssl}

2. 准备配置文件

容器内配置文件目录结构如下。关注三个地方即可

├── nginx
  ├── conf.d            ← 【额外站点/配置片段】常见放 *.conf
    ├── default.conf    ← 很多包管理器给的“默认 server 示例”
  ├── fastcgi_params    
  ├── mime.types        
  ├── modules
  ├── nginx.conf        ← 【主配置】(总入口)
  ├── scgi_params        
  ├── uwsgi_params
  • 创建临时容器,把主配置文件和默认配置文件复制出来,以防后续用到,仅作启动容器使用,一般不要修改这两个默认配置文件
  • 之后自己创建的配置文件只需要放在/data/nginx/conf/conf.d/ 下边即可
  • 同时把默认欢迎页也复制出来,要不然启动之后访问报403
docker run -d --name nginx_temp nginx:1.26
docker cp nginx_temp:/etc/nginx/conf.d/default.conf /data/nginx/conf/conf.d/default.conf
docker cp nginx_temp:/etc/nginx/nginx.conf /data/nginx
docker cp nginx_temp:/usr/share/nginx/html /data/nginx/
  • 删除临时容器
docker stop nginx_temp
docker rm nginx_temp

二、安装

⚠️ Nginx 仅作为反向代理与静态资源服务,不处理业务逻辑

⚠️ SSL 证书统一存放于 /data/nginx/ssl

⚠️ 新增站点仅需新增 conf.d/*.conf

docker run -d \
  --name nginx \
  --network app-net \
  --restart=unless-stopped \
  --memory=256m \
  --memory-swap=256m \
  -p 80:80 \
  -p 443:443 \
  -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /data/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
  -v /data/nginx/html:/usr/share/nginx/html \
  -v /data/nginx/logs:/var/log/nginx \
  -v /data/nginx/ssl:/etc/nginx/ssl:ro \
  --health-cmd="curl -f http://localhost || exit 1" \
  --health-interval=30s \
  --health-retries=3 \
  nginx:1.26

三、验证

 docker logs nginx --tail 10
 curl http://localhost

Docker 安装jenkins

一、系统基础准备

1. 创建数据目录结构

mkdir -p /data/jenkins
chown -R 1000:1000 /data/jenkins
chmod -R 755 /data/jenkins

mkdir -p /data/apps/{springboot,vue}

二、服务器安装jdk&maven

⚠️:jdk和maven版本要适配

https://maven.apache.org/docs/history.html
官网网址可以查看maven和jdk适配的关系。但实践下来,高版本jdk也是配3.9。所以采用jdk17+maven3.9

1.安装jdk

  • 直接在服务器里wget下载
  • 如果是内网环境手动下安装包上传到服务器上

清华大学开源软件镜像站(腾讯云访问不了报403,没法wget):https://mirrors.tuna.tsinghua.edu.cn/Adoptium

华为云镜像(只有jdk17.0.2,可以下,但版本偏旧):https://repo.huaweicloud.com/openjdk

oracle官网下载(需要oracle账号):

确认服务器架构

uname -m

⚠️如果是 x86_64:下 *_linux-x64_bin.tar.gz

⚠️如果是 aarch64:下 *_linux-aarch64_bin.tar.gz

✅以下操作用的镜像为清华大学开源软件镜像站下载的jdk17

解压

mkdir -p /data/java
tar -zxvf /data/OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz -C /data/java/

配置JAVA_HOME

cat > /etc/profile.d/java.sh <<'EOF'
export JAVA_HOME=/data/java/jdk-17.0.19+10
export PATH=$JAVA_HOME/bin:$PATH
EOF

source /etc/profile.d/java.sh

验证

echo $JAVA_HOME
java -version

输出;
 
/data/java/jdk-17.0.19+10

openjdk version "17.0.19" 2026-04-21
OpenJDK Runtime Environment Temurin-17.0.19+10 (build 17.0.19+10)
OpenJDK 64-Bit Server VM Temurin-17.0.19+10 (build 17.0.19+10, mixed mode, sharing)

2.安装maven(已经安装则跳过)

  • 直接在服务器里wget下载
  • 如果是内网环境手动下安装包上传到服务器上

清华大学开源软件镜像站(腾讯云访问不了报403,没法wget):https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz

官网下载:https://maven.apache.org/download.cgi

解压

mkdir -p /data/maven
tar -zxvf /data/apache-maven-3.9.16-bin.tar.gz -C /data/maven/

配置 MAVEN_HOME

cat > /etc/profile.d/maven.sh <<'EOF'
export MAVEN_HOME=/data/maven/apache-maven-3.9.16
export PATH=$MAVEN_HOME/bin:$PATH
EOF

source /etc/profile.d/maven.sh

验证

echo $MAVEN_HOME
mvn -v
# 如果发现bash: mvn: command not found,重新登录一遍服务器再看

添加国内镜像源,去掉默认的配置,改为


    <mirror>
      <id>aliyun-maven</id>
      <mirrorOf>*</mirrorOf>
      <name>Aliyun Maven</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

验证镜像源是否生效

mvn dependency:get -Dartifact=org.springframework.boot:spring-boot-starter:2.7.14 -U

#关注是否有  Downloading from aliyun: https://maven.aliyun.com/... 

四、安装node

⚠️CentOS7最高支持16版本的node,有的项目如果需要16版本以上的node,那这个服务器就用不了了

'GLIBC_2.27' not found 

解决:使用docker启动node,可以启动自己想要的任意版本,

手动验证,使用“若依前后端分离项目"验证

docker pull node:22.12.0

# 执行 npm install
docker run --rm \
  -v /data/apps/vue/ruoyi/ruoyi-ui:/app \
  -w /app \
  node:22.12.0 \
  sh -c "npm config set registry https://registry.npmmirror.com && npm install"
  
  
# 执行 npm run build
docker run --rm \
  -v /data/apps/vue/ruoyi/ruoyi-ui:/app \
  -w /app \
  node:22.12.0  \
  sh -c "npm run build:prod"
  
  
# 得到输出文件dist 手动copy到nginx下,重启nginx容器,访问 ip测试
cp -r /data/RuoYi-Vue/ruoyi-ui/dist/* /data/nginx/html/

五、安装jenkins,配置jdk,maven

1、制作自定义镜像(可选)

⚠️(可选)考虑到以后可能会进行跨机部署,会想目标服务器推送产物。由于scp方式太慢,普通采用rsync,但是官方镜像没有内置rsync,所以基于官方镜像,自定义一个带rsync的镜像

自定义 Jenkins Dockerfile

cd /data/jenkins/
vim /data/jenkins/Dockerfile

写入

FROM jenkins/jenkins:lts

USER root

# 替换 Debian Trixie 官方源为阿里云镜像
RUN sed -i \
      's|URIs: http://deb.debian.org/debian|URIs: https://mirrors.aliyun.com/debian|g' \
      /etc/apt/sources.list.d/debian.sources && \
    sed -i \
      's|URIs: http://deb.debian.org/debian-security|URIs: https://mirrors.aliyun.com/debian-security|g' \
      /etc/apt/sources.list.d/debian.sources && \
    apt-get update && \
    apt-get install -y rsync && \
    rm -rf /var/lib/apt/lists/*

USER jenkins

构建自定义镜像

docker build -t my-jenkins:with-rsync .

2、启动

映射jdk,maven,maven仓库,maven配置文件

# 创建
mkdir -p /data/jenkins/jenkins_home
chown -R 1000:1000 /data/jenkins/jenkins_home
docker run -d \
  --name jenkins \
  --network app-net \
  --restart=unless-stopped \
  -p 6528:8080 \
  -p 50000:50000 \
  -v /data/jenkins/jenkins_home:/var/jenkins_home \
  -v /data/java/jdk-17.0.19+10:/data/java/jdk-17.0.19+10:ro \
  -v /data/maven/apache-maven-3.9.16:/data/maven/apache-maven-3.9.16:ro \
  -v /data/apps/vue:/data/nginx/html \
  -v /etc/localtime:/etc/localtime:ro \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  -e TZ=Asia/Shanghai \
  --group-add $(getent group docker | cut -d: -f3) \
  my-jenkins:with-rsync

2、启动之后的各项配置

1.初始化

  • 根据页面步骤,找到密码,填入密码
  • 选择左侧,安装推荐插件
  • 创建管理员用户。填写用户名,密码,邮箱

2.全局工具配置

右上设置-》System Configuration-》Tools

  • JDK installations-》新增jdk

    • name=JDK17
    • JAVA_HOME=/data/java/jdk-17.0.19+10
    • 取消自动安装(Install automatically)
    • /data/java/jdk-17.0.19+10 这个路径是jenkins容器内的,是当时启动命令里边写的-v
  • 新增mavan

    • name=Maven3.9.16
    • MAVEN_HOME=/data/maven/apache-maven-3.9.16
    • 取消自动安装

3.git凭据管理,目的是连接上git

设置-》Security-》Credentials(凭据管理)-》Add Credentials-》选择Username with password ->Next->填入git账号密码-》Create

4.设置maven环境变量

⚠️:此处设置的是全局的maven,如果项目需要不同的maven版本,建议使用 Pipeline 的方式(Pipeline 值得学习)

System Configuration-》System-》Global properties-》Environment variables 加两条

Name = M2_HOME Value =/data/maven/apache-maven-3.9.16

Name = PATH+EXTRA Value =/data/maven/apache-maven-3.9.16/bin

PATH+EXTRA—— 真正决定 mvn能不能被找到的那条

Jenkins 在启动构建 shell 时,把 /data/maven/apache-maven-3.9.16/bin插到 PATH 最前面,于是 shell 在执行 mvn时就能在 $PATH里扫到 mvn这个可执行文件。

3、环境验证

1.验证所需的jdk&maven&git是否能正常使用

左上角点击新建Item-》名称填入“test-jdk-maven”-》Select an item type选择 Freestyle project-》确定

1.Source Code Management -》git-》Repository URL填写项目地址-》Branch Specifier (blank for 'any')选择分支

2.Build Steps-》点击“增加构建步骤”->选择Execute shell(执行Shell)-》写入以下内容-》保存-》立即构建

期望java -version输出自定义的JDK版本,mvn -v 输出自定义的maven版本

#!/bin/bash
set -e

export JAVA_HOME=/data/java/jdk8u492-b09
export MAVEN_HOME=/data/maven/apache-maven-3.9.16
export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH"

echo "=== 环境校验 ==="
java -version
mvn -v

题外话

⚠️如果不同项目用的maven版本不同怎么办(一般高版本都能是适配低版本,极端情况下maven必须指定版本时)

手动指定所需版本

export JAVA_HOME=/data/java/jdk8u492-b09  
export MAVEN_HOME=/data/maven/apache-maven-3.9.16  
export PATH="$JAVA_HOME/bin: $MAVEN_HOME/bin:$PATH"

部署springboot项目

jenkins 拉取代码 打包 复制打好的jar包到指定位置,然后启动一个java项目容器

一、前置工作

mkdir -p /data/apps/{vue/ruoyi,springboot/ruoyi}
chown -R 1000:1000 /data/apps
chmod -R 755 /data/apps
mkdir -p /data/apps/springboot/ruoyi/file
mkdir -p /data/apps/springboot/ruoyi/backup

ruoyi 指的是本次部署的项目名,部署其他项目的时候,也需要建立对应的文件夹

写入springboot部署脚本,保存到 /data/apps/springboot/ruoyi下 命名为 deploy-ruoyi.sh

vim /data/apps/springboot/ruoyi/deploy-ruoyi.sh
#!/bin/bash
set -e

# ================== 以下为通用配置,需要根据项目信息更改 ==================
JAR_NAME="ruoyi-springboot"
DEPLOY_DIR="/data/apps/springboot/ruoyi"
PORT=6529
PROFILE=test
NETWORK=app-net
IMAGE="openjdk:17.0.2-jdk"
# ==================================================
# ==================以下为通用配置可根据需要自己改================
JAR_FILE_NAME="${JAR_NAME}.jar"
JAR_DEPLOY_NAME="${JAR_NAME}.jar"
BACKUP_DIR="${DEPLOY_DIR}/backup"
FILE_DIR="${DEPLOY_DIR}/file"
LOGS_DIR="${DEPLOY_DIR}/logs"


# ---------- 备份旧 jar ----------
TIMESTAMP=$(date +%Y%m%d%H%M%S)
if [ -f "${DEPLOY_DIR}/${JAR_DEPLOY_NAME}" ]; then
    cp "${DEPLOY_DIR}/${JAR_DEPLOY_NAME}" "${BACKUP_DIR}/${JAR_DEPLOY_NAME}.${TIMESTAMP}"
fi

# ---------- 清理旧备份(保留 5 份) ----------
ls -t "${BACKUP_DIR}/${JAR_DEPLOY_NAME}".* 2>/dev/null | tail -n +6 | xargs -r rm

# ---------- 复制新 jar 如果在代码里指定了jar名,去掉了后边的-0.0.1-SNAPSHOT.jar 这个命令也可以不写----------
# mv "${DEPLOY_DIR}/${JAR_FILE_NAME}" "${DEPLOY_DIR}/${JAR_DEPLOY_NAME}"

# ---------- 容器操作 ----------
if [ "$(docker ps -aq -f name=${JAR_NAME})" ]; then
    echo "容器 ${JAR_NAME} 已存在,重启..."
    docker restart "${JAR_NAME}"
else
    echo "容器 ${JAR_NAME} 不存在,新建..."
    docker run -d \
      --name "${JAR_NAME}" \
      --network "${NETWORK}" \
      --restart=unless-stopped \
      -p "${PORT}:${PORT}" \
      -v "${DEPLOY_DIR}:/app" \
      -v "${FILE_DIR}:${FILE_DIR}" \
      -v "${LOGS_DIR}:${LOGS_DIR}" \
      -v /etc/localtime:/etc/localtime:ro \
      -e TZ=Asia/Shanghai \
      "${IMAGE}" \
      java -jar "/app/${JAR_DEPLOY_NAME}" --spring.profiles.active="${PROFILE}"
fi
chmod +x /data/apps/springboot/ruoyi/deploy-ruoyi.sh

二、部署

jenkins和springboot在一台服务器上

1:新建 Spring Boot 部署 Job

  1. Jenkins 首页 → New Item
  2. 名称填:ruoyi-springboot
  3. Freestyle project
  4. OK
  5. 找到 Source Code Management 源码管理
  6. Git
  7. 填这三项:Repository URL Credentials Branch,分别是,代码地址,之前配好的 Git 账号,要部署的分支

2:配置构建 编写jenkins执行命令

  1. 页面往下拉,找到 build step(构建)
  2. 点击 增加构建步骤
  3. 选择 Execute shell 执行shell
  4. 写入以下命令

jenkins要做的就是把生成的jar,复制到springboot 项目运行时候的目录下,本次放到的目录为 DEPLOY_DIR="/data/apps/springboot/ruoyi"。

问题:jenkins不能直接把dokcer容器内的文件,直接copy到宿主机上,而是需要通过-v 进行文件映射

解决:已知我们springboot项目都放在了 /data/apps/springboot 下,把这个路径也挂载进去,然后直接在容器内复制jar包

1 停止&&删除jenkins,重写启动命令,挂载/data/apps

docker stop jenkins
docker rm jenkins


docker run -d \
  --name jenkins \
  --network app-net \
  --restart=unless-stopped \
  -p 6528:8080 \
  -p 50000:50000 \
  -v /data/apps:/data/apps \
  -v /data/nginx/html:/data/nginx/html \
  -v /data/jenkins/jenkins_home:/var/jenkins_home \
  -v /data/java/jdk-17.0.19+10:/data/java/jdk-17.0.19+10:ro \
  -v /data/maven/apache-maven-3.9.16:/data/maven/apache-maven-3.9.16:ro \
  -v /etc/localtime:/etc/localtime:ro \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  -e TZ=Asia/Shanghai \
  --group-add $(getent group docker | cut -d: -f3) \
  my-jenkins:with-rsync

2 jenkins job 的shell 里加上jar包复制命令

⚠️若依项目的启动jar包在 /ruoyi-springboot/ruoyi-admin/target/ 下边,cp 复制jar包的时候要注意

#!/bin/bash


cd "${WORKSPACE}"
mvn clean package -U -Dmaven.test.skip=true -Ptest
mkdir -p /data/apps/springboot/ruoyi
JAR_NAME="ruoyi-springboot"
DEPLOY_DIR="/data/apps/springboot/ruoyi"
cp "${WORKSPACE}/ruoyi-admin/target/${JAR_NAME}.jar" "${DEPLOY_DIR}/"
bash /data/apps/springboot/ruoyi/deploy-ruoyi.sh

三、注意事项

1、数据库和redis连接配置

容器间访问,使用容器名+容器端口,(并非向外映射的端口)

数据库连接改成    jdbc:mysql://mysql8.4.9:3306
redis连接改成    host: redis port: 6379

部署vue项目

jenkins拉取代码,起一个node临时容器,打包,复制dist到nginx下,完成部署,

一、前置工作

mkdir -p /data/apps/{vue/ruoyi,springboot/ruoyi}
chown -R 1000:1000 /data/apps
chmod -R 755 /data/apps
# 前端项目部署位置  注意跟代码里保持一致,要加上ruoyi
# 部署生产环境和开发环境下的URL。
# 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
# 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
#  publicPath: process.env.NODE_ENV === "production" ? "/ruoyi/" : "/",
mkdir -p /data/nginx/html/ruoyi
chown -R 1000:1000 /data/nginx/html/ruoyi
chmod -R 755 /data/nginx/html/ruoyi
ruoyi 指的是本次部署的项目名,部署其他项目的时候,也需要建立对应的文件夹

准备部署脚本,保存到 /data/apps/vue/ruoyi下 命名为 deploy-ruoyi.sh

vim /data/apps/vue/ruoyi/deploy-ruoyi-vue.sh
#!/bin/bash
set -e

# ========== 基础配置 ==========
# ✅ 宿主机路径
HOST_UI="/data/jenkins/jenkins_home/workspace/ruoyi-vue/ruoyi-ui"
# ✅ 容器内路径 
CONTAINER_UI="${WORKSPACE}/ruoyi-ui"
# ✅ 部署路径(nginx)
DEPLOY_DIR="/data/nginx/html/ruoyi"
# ✅ 备份配置
BACKUP_BASE="/data/apps/vue/ruoyi"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="${BACKUP_BASE}/ruoyi-backup-${TIMESTAMP}"


echo "== ✅ Vue 构建开始 =="

# ========== 1. 清理 ==========
docker run --rm \
  -v "${HOST_UI}:/app" \
  -w /app \
  node:22.12.0 \
  sh -c 'rm -rf node_modules dist'

# ========== 2. 安装依赖 ==========
docker run --rm \
  -v "${HOST_UI}:/app" \
  -w /app \
  node:22.12.0 \
  sh -c "npm config set registry https://registry.npmmirror.com && npm install"

# ========== 3. 构建 ==========
docker run --rm \
  --cpus="2" \
  --memory="2g" \
  --memory-swap="3g" \
  -e NODE_OPTIONS="--max-old-space-size=1536" \
  -v "${HOST_UI}:/app" \
  -w /app \
  node:22.12.0 \
  npm run build:prod

echo "✅ 构建完成,开始发布..."
# ========== 4. 备份旧版本 ==========
echo "📦 开始备份旧版本..."
mkdir -p ${BACKUP_BASE}
if [ -d "${DEPLOY_DIR}" ] && [ "$(ls -A ${DEPLOY_DIR})" ]; then
    echo "   备份路径: ${BACKUP_DIR}"
    cp -r ${DEPLOY_DIR} ${BACKUP_DIR}
    echo "✅ 备份完成"
else
    echo "⚠️  部署目录为空或不存在,跳过备份"
fi
# ========== 5. 拷贝新构建产物 ==========
echo "📋 开始发布新版本..."
mkdir -p ${DEPLOY_DIR}
cp -r ${CONTAINER_UI}/dist/* ${DEPLOY_DIR}

echo "✅ 前端已发布到:${DEPLOY_DIR}"
echo "📁 备份位置:${BACKUP_DIR}"
chmod +x /data/apps/vue/ruoyi/deploy-ruoyi-vue.sh

二、部署

jenkins和springboot在一台服务器上

1:新建 vue 部署 Job

  1. Jenkins 首页 → New Item
  2. 名称填:ruoyi-springboot
  3. Freestyle project
  4. OK
  5. 找到 Source Code Management 源码管理
  6. Git
  7. 填这三项:Repository URL Credentials Branch,分别是,代码地址,之前配好的 Git 账号,要部署的分支

2:配置构建 编写jenkins执行命令

  1. 页面往下拉,找到 build step(构建)
  2. 点击 增加构建步骤
  3. 选择 Execute shell 执行shell
  4. 写入以下命令

jenkins job 的shell 里加上dist复制命令

⚠️注意dist生成位置

#!/bin/bash
set -e

bash /data/apps/vue/ruoyi/deploy-ruoyi-vue.sh

三、nginx配置文件

vim /data/nginx/conf/conf.d/ruoyi-vue.conf
server {
    listen       80;
    server_name  ip地址;

    # 前端静态资源
    location / {
        alias /usr/share/nginx/html/ruoyi/;
        try_files $uri $uri/ /index.html;
        index index.html;
        
        # 静态资源缓存
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 7d;
            add_header Cache-Control "public, immutable";
        }
    }

    # 后端API代理
    location /prod-api/ {
        proxy_pass http://ruoyi-springboot:6529/;
        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;
        proxy_connect_timeout 150;
        proxy_send_timeout 100;
        proxy_read_timeout 100;
        proxy_buffers 4 32k;
        client_max_body_size 20m;
    }

    # SpringDoc API文档代理(可选)
    location /v3/api-docs/ {
        proxy_pass http://ruoyi-springboot:6529/v3/api-docs/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

四、注意事项

1.build时内存占用高,导致服务器宕机

1、vue.config.js 添加一个配置,禁用掉多线程

module.exports = {
--- 此处省略其他配置
  parallel: false,

2、限制build时候的内存和cpu使用情况

--cpus="2"
--memory="2g"
--memory-swap="3g" \

2.注意打包位置

jenkins是利用宿主机的docker启动了node来进行打包,所以打包时 挂载的HOST_UI 指的是宿主机 的地址,而后来的文件复制,此时还是在jenkins容器内,所以用的是CONTAINER_UI 容器内的地址

五、配置域名

1、DNS 解析

在域名的服务商,添加解析,以阿里为例

记录类型主机记录记录值说明
A@你的服务器公网 IP访问 example.com
Awww你的服务器公网 IP访问 www.example.com

✅ 保存后 等待 5~30 分钟(TTL 生效)

验证是否生效:

ping example.com

能 ping 通说明 DNS OK。

4、防火墙开放80端口及备案

去服务器厂商进行ICP备案,备案完成才能正常访问,要不然服务器厂商会直接拦截

六、配置证书

宿主机 Certbot + Docker Nginx

⚠️:必须要ICP备案完成才能进行证书配置

  1. Certbot 装在 宿主机
  2. 证书签发到 /etc/letsencrypt
  3. Docker Nginx 只读挂载证书
  4. 不影响容器内部

1、宿主机安装 Certbot(OpenCloudOS 9)

dnf install -y epel-release
dnf install -y certbot
certbot --version

2、重载 Nginx

docker exec nginx nginx -t
docker exec nginx nginx -s reload

3、宿主机申请证书(关键步骤)

1. 临时停掉 nginx

申请证书时,会验证ip,所以需要停掉nginx,方式80、443 端口带来影响

2. 申请证书(重点在这里 ✅)

example.com 改成你的域名

certbot certonly \
  --standalone \
  --preferred-challenges http \
  --cert-name example.com \
  -d example.com -d www.example.com \
  --config-dir /data/nginx/ssl/certbot/config \
  --work-dir /data/nginx/ssl/certbot/work \
  --logs-dir /data/nginx/ssl/certbot/logs

4、修改nginx配置文件

# ==============================
# HTTP: 80 端口 → 强制跳 HTTPS
# ==============================
server {
    listen 80;
    server_name jgybzx.top www.jgybzx.top;

 
    # 所有 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;
}

# ==============================
# HTTPS: 443 端口(核心服务)
# ==============================
server {
    listen 443 ssl http2;
    server_name jgybzx.top www.jgybzx.top;

    # ===== SSL 证书(你刚申请成功的)=====
    ssl_certificate     /etc/nginx/ssl/certbot/config/live/jgybzx.top/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/certbot/config/live/jgybzx.top/privkey.pem;

    # ===== SSL 安全优化 =====
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # HSTS(可选,开启后浏览器会强制 HTTPS,谨慎开启)
    # add_header Strict-Transport-Security "max-age=63072000" always;

    # =======================
    # 前端:RuoYi Vue 静态资源
    # =======================
    location / {
        alias /usr/share/nginx/html/ruoyi/;
        index index.html;

        # ✅ 修复 alias 下的 try_files(防止刷新 404)
        try_files $uri $uri/ /index.html;

        # 静态资源缓存
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 7d;
            add_header Cache-Control "public, immutable";
        }
    }

    # =======================
    # 后端:RuoYi Spring Boot API
    # =======================
    location /prod-api/ {
        proxy_pass http://ruoyi-springboot:6529/;

        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 https;

        proxy_connect_timeout 150;
        proxy_send_timeout 100;
        proxy_read_timeout 100;
        proxy_buffers 4 32k;
        client_max_body_size 20m;
    }

    # =======================
    # SpringDoc / Swagger
    # =======================
    location /v3/api-docs/ {
        proxy_pass http://ruoyi-springboot:6529/v3/api-docs/;
        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 https;
    }

    # =======================
    # 错误页
    # =======================
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
0

评论

博主关闭了所有页面的评论