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-engine2. 安装依赖并添加 Docker 仓库
dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo3. 如果官方源连接失败,切换为国内镜像源
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.repo4. 安装 Docker CE 套件
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin5. 启动 & 自启
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"
]
}
EOF2. 重载 & 重启
systemctl daemon-reexec
systemctl restart docker3. 校验
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.52. 准备配置文件
另存为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 20Docker 安装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://localhostDocker 安装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_homedocker 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-rsync2、启动之后的各项配置
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}"
fichmod +x /data/apps/springboot/ruoyi/deploy-ruoyi.sh二、部署
jenkins和springboot在一台服务器上
1:新建 Spring Boot 部署 Job
- Jenkins 首页 → New Item
- 名称填:
ruoyi-springboot - 选 Freestyle project
- 点 OK
- 找到 Source Code Management 源码管理
- 选 Git
- 填这三项:Repository URL Credentials Branch,分别是,代码地址,之前配好的 Git 账号,要部署的分支
2:配置构建 编写jenkins执行命令
- 页面往下拉,找到 build step(构建)
- 点击 增加构建步骤
- 选择 Execute shell 执行shell
- 写入以下命令
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-rsync2 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
- Jenkins 首页 → New Item
- 名称填:
ruoyi-springboot - 选 Freestyle project
- 点 OK
- 找到 Source Code Management 源码管理
- 选 Git
- 填这三项:Repository URL Credentials Branch,分别是,代码地址,之前配好的 Git 账号,要部署的分支
2:配置构建 编写jenkins执行命令
- 页面往下拉,找到 build step(构建)
- 点击 增加构建步骤
- 选择 Execute shell 执行shell
- 写入以下命令
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.confserver {
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 |
| A | www | 你的服务器公网 IP | 访问 www.example.com |
✅ 保存后 等待 5~30 分钟(TTL 生效)
验证是否生效:
ping example.com能 ping 通说明 DNS OK。
4、防火墙开放80端口及备案
去服务器厂商进行ICP备案,备案完成才能正常访问,要不然服务器厂商会直接拦截
六、配置证书
宿主机 Certbot + Docker Nginx
⚠️:必须要ICP备案完成才能进行证书配置
- Certbot 装在 宿主机
- 证书签发到
/etc/letsencrypt - Docker Nginx 只读挂载证书
- 不影响容器内部
1、宿主机安装 Certbot(OpenCloudOS 9)
dnf install -y epel-release
dnf install -y certbot
certbot --version2、重载 Nginx
docker exec nginx nginx -t
docker exec nginx nginx -s reload3、宿主机申请证书(关键步骤)
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/logs4、修改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;
}
}
评论