首页
统计
关于
正则表达式手册
Search
1
package.json的配置参考
160 阅读
2
React中编写css的几种方式
160 阅读
3
【整理】开发注意事项-1
137 阅读
4
【整理】Nginx基础知识
125 阅读
5
rollup.js的个人理解
119 阅读
默认分类
服务器端
前端工程化
react
vue
nodejs
js+
html&css
问题集录
临时
dylin
gu
生活
登录
/
注册
Search
标签搜索
问题
前端工程化
基础知识
css
数据库
docker
nginx
rollup.js
react
golang
js
性能优化
js基础
dylin
累计撰写
21
篇文章
累计收到
1
条评论
首页
栏目
默认分类
服务器端
前端工程化
react
vue
nodejs
js+
html&css
问题集录
临时
dylin
gu
生活
页面
统计
关于
正则表达式手册
搜索到
1
篇与
的结果
2026-06-23
SpringBoot+Vue 部署步记录
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 CE1. 卸载旧版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/ 下边即可同时把默认欢迎页也复制出来,要不然启动之后访问报403docker 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.91.安装jdk直接在服务器里wget下载如果是内网环境手动下安装包上传到服务器上清华大学开源软件镜像站(腾讯云访问不了报403,没法wget):https://mirrors.tuna.tsinghua.edu.cn/Adoptium华为云镜像(只有jdk17.0.2,可以下,但版本偏旧):https://repo.huaweicloud.com/openjdkoracle官网下载(需要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_HOMEcat > /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_HOMEcat > /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,maven1、制作自定义镜像(可选)⚠️(可选)考虑到以后可能会进行跨机部署,会想目标服务器推送产物。由于scp方式太慢,普通采用rsync,但是官方镜像没有内置rsync,所以基于官方镜像,自定义一个带rsync的镜像自定义 Jenkins Dockerfilecd /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-》ToolsJDK installations-》新增jdkname=JDK17JAVA_HOME=/data/java/jdk-17.0.19+10取消自动安装(Install automatically)/data/java/jdk-17.0.19+10 这个路径是jenkins容器内的,是当时启动命令里边写的-v新增mavanname=Maven3.9.16MAVEN_HOME=/data/maven/apache-maven-3.9.16取消自动安装3.git凭据管理,目的是连接上git设置-》Security-》Credentials(凭据管理)-》Add Credentials-》选择Username with password ->Next->填入git账号密码-》Create4.设置maven环境变量⚠️:此处设置的是全局的maven,如果项目需要不同的maven版本,建议使用 Pipeline 的方式(Pipeline 值得学习)System Configuration-》System-》Global properties-》Environment variables 加两条Name = M2_HOME Value =/data/maven/apache-maven-3.9.16Name = PATH+EXTRA Value =/data/maven/apache-maven-3.9.16/binPATH+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.shvim /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 部署 JobJenkins 首页 → 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/appsdocker 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.shvim /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 部署 JobJenkins 首页 → 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.comAwww你的服务器公网 IP访问 www.example.com✅ 保存后 等待 5~30 分钟(TTL 生效)验证是否生效:ping example.com能 ping 通说明 DNS OK。4、防火墙开放80端口及备案去服务器厂商进行ICP备案,备案完成才能正常访问,要不然服务器厂商会直接拦截六、配置证书宿主机 Certbot + Docker Nginx⚠️:必须要ICP备案完成才能进行证书配置Certbot 装在 宿主机证书签发到 /etc/letsencryptDocker Nginx 只读挂载证书不影响容器内部1、宿主机安装 Certbot(OpenCloudOS 9)dnf install -y epel-release dnf install -y certbot certbot --version2、重载 Nginxdocker 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; } }
2026年06月23日
42 阅读
0 评论
0 点赞