后端部署技术文档
1. 项目概述
1.1 项目基本信息
| 项目名称 | zs-admin |
|---|---|
| 技术栈 | Spring Boot + MyBatis + MySQL |
| 构建工具 | Maven |
| 部署方式 | 传统部署 / Docker + Docker Compose |
| 环境要求 | JDK >= 17, MySQL >= 8.0 |
1.2 核心依赖
| 依赖 | 版本 | 用途 |
|---|---|---|
| Spring Boot | ^3.3.0 | 后端框架 |
| MyBatis Plus | ^3.5.7 | ORM框架 |
| MySQL Connector | ^8.0.36 | 数据库驱动 |
| Redis | ^7.4.1 | 缓存 |
| Spring Security | ^6.3.0 | 安全框架 |
| Spring Cloud | ^2023.0.3 | 微服务框架 |
2. 环境准备
2.1 基础环境
| 环境 | 版本要求 | 说明 |
|---|---|---|
| JDK | 17+ | Spring Boot 3.x 要求 JDK 17 及以上 |
| Maven | 3.8+ | 项目构建工具 |
| MySQL | 8.0+ | 数据库服务 |
| Redis | 6.0+ | 缓存服务 |
| Git | 2.0+ | 版本控制工具 |
2.2 环境变量配置
在部署服务器上,建议配置以下环境变量:
bash
# JDK 环境变量
JAVA_HOME=/usr/local/jdk-17
export PATH=$JAVA_HOME/bin:$PATH
# Maven 环境变量
MAVEN_HOME=/usr/local/maven-3.8.6
export PATH=$MAVEN_HOME/bin:$PATH3. 数据库配置
3.1 创建数据库
- 登录 MySQL 数据库:
bash
mysql -u root -p- 创建数据库:
sql
CREATE DATABASE zs_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;3.2 导入初始化数据
- 执行初始化 SQL 脚本:
bash
mysql -u root -p zs_admin < /path/to/zs_admin_init.sql3.3 数据库连接配置
在 application.yml 或对应环境的配置文件中配置数据库连接:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/zs_admin?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver4. Redis 配置
4.1 安装 Redis
- 下载并安装 Redis:
bash
# CentOS/RHEL
yum install redis
# Ubuntu/Debian
apt-get install redis-server- 启动 Redis 服务:
bash
# CentOS/RHEL
systemctl start redis
systemctl enable redis
# Ubuntu/Debian
service redis-server start
systemctl enable redis-server4.2 Redis 连接配置
在 application.yml 或对应环境的配置文件中配置 Redis 连接:
yaml
spring:
redis:
host: localhost
port: 6379
password: your_password
database: 0
timeout: 3000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 05. 构建流程
5.1 构建命令
项目提供了多种构建命令,用于不同的构建场景:
| 命令 | 说明 | 适用场景 |
|---|---|---|
mvn clean compile | 编译项目 | 开发阶段 |
mvn clean test | 运行测试 | 测试阶段 |
mvn clean package | 打包项目(含测试) | 测试阶段 |
mvn clean package -DskipTests | 打包项目(跳过测试) | 生产部署 |
mvn clean install | 安装到本地仓库 | 开发阶段 |
5.2 编译打包
- 执行 Maven 打包命令:
bash
# 打包(跳过测试,适合生产部署)
mvn clean package -DskipTests5.3 构建产物
构建成功后,产物将生成在 target 目录下,主要包括:
target/
├── zs-admin-${version}.jar # 可执行 JAR 文件6. 部署方式
6.1 传统部署
6.1.1 服务器准备
- 安装 JDK 17
- 安装 MySQL 8.0
- 安装 Redis 7.0
- 创建部署目录:
mkdir -p /opt/zs-admin - 创建日志目录:
mkdir -p /var/log/zs-admin
6.1.2 数据库初始化
- 创建数据库:sql
CREATE DATABASE zs_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 导入初始化脚本:bash
mysql -u root -p zs_admin < sql/init.sql
6.1.3 应用部署
上传 JAR 文件到服务器:
bashscp target/zs-admin-${version}.jar root@server_ip:/opt/zs-admin/创建启动脚本
start.sh:bash#!/bin/bash # 应用名称 APP_NAME=zs-admin # JAR 文件路径 JAR_PATH=/opt/zs-admin/zs-admin-${version}.jar # 日志文件路径 LOG_PATH=/var/log/zs-admin/app.log # JVM 参数 JVM_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/zs-admin/gc.log" # 启动命令 nohup java $JVM_OPTS -jar $JAR_PATH --spring.profiles.active=prod > $LOG_PATH 2>&1 & echo "$APP_NAME 已启动,日志文件:$LOG_PATH"创建停止脚本
stop.sh:bash#!/bin/bash # 应用名称 APP_NAME=zs-admin # 查找进程 ID PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}') if [ -n "$PID" ]; then kill $PID echo "$APP_NAME 已停止(PID: $PID)" else echo "$APP_NAME 未运行" fi启动应用:
bashchmod +x start.sh stop.sh ./start.sh
6.2 Docker 部署
6.2.1 Dockerfile 说明
项目提供了 Dockerfile 用于容器化部署:
dockerfile
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制 jar 包
COPY target/*.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]6.2.2 Docker 部署步骤
构建项目:
bashmvn clean package -DskipTests构建 Docker 镜像:
bashdocker build -t zs-admin .运行 Docker 容器:
bashdocker run -d -p 8080:8080 \ --name zs-admin \ --network zs-network \ zs-admin验证部署:
bashcurl http://localhost:8080/api
6.3 容器编排 (Docker Compose)
6.3.1 docker-compose.yml 示例
yaml
version: '3.8'
networks:
zs-network:
driver: bridge
volumes:
mysql-data:
redis-data:
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: zs-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: zs_admin
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
volumes:
- mysql-data:/var/lib/mysql
- ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- zs-network
restart: always
# Redis 缓存
redis:
image: redis:7.0
container_name: zs-redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- zs-network
restart: always
# 后端应用
backend:
build: .
container_name: zs-admin
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
DB_HOST: mysql
DB_PORT: 3306
DB_NAME: zs_admin
DB_USERNAME: root
DB_PASSWORD: password
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- mysql
- redis
networks:
- zs-network
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"]
interval: 30s
timeout: 10s
retries: 3
# Nginx 反向代理
nginx:
image: nginx:1.26
container_name: zs-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/certs:/etc/nginx/certs
networks:
- zs-network
depends_on:
- backend
restart: always6.3.2 Nginx 配置文件
nginx
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
location / {
proxy_pass http://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 /api {
proxy_pass http://backend:8080/api;
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;
}
}6.3.3 Docker Compose 部署步骤
构建项目:
bashmvn clean package -DskipTests启动容器:
bashdocker-compose up -d查看容器状态:
bashdocker-compose ps查看日志:
bashdocker-compose logs -f backend验证部署:
bashcurl http://localhost:8080/api
7. 持续集成与持续部署
7.1 CI/CD 流程
建议使用以下 CI/CD 流程:
- 代码提交:开发者将代码提交到 Git 仓库
- 自动构建:CI 工具自动构建项目并运行测试
- 代码检查:运行 SonarQube 代码质量检查
- 构建产物上传:将构建产物上传到 Maven 仓库或 Docker 镜像仓库
- 自动部署:CD 工具将构建产物部署到测试或生产环境
- 部署验证:运行自动化测试验证部署结果
7.2 阿里云效 CI/CD 示例
阿里云效是阿里云提供的企业级 DevOps 平台,以下是后端项目的基本 CI/CD 配置示例:
yaml
# 阿里云效流水线配置
version: 1.0
name: zs-admin CI/CD
stages:
- stage: 构建阶段
jobs:
- job: 构建任务
steps:
- step: git-checkout
with:
depth: 1
- step: maven-build
with:
mavenVersion: '3.8.6'
goals: clean package -DskipTests
pom: pom.xml
- step: artifact-upload
with:
artifactName: zs-admin
sourcePath: ./target
- stage: 部署阶段
jobs:
- job: 部署任务
steps:
- step: ssh-deploy
with:
host: ${REMOTE_HOST}
port: 22
username: ${REMOTE_USER}
sshKey: ${SSH_PRIVATE_KEY}
sourcePath: ./target/zs-admin-*.jar
targetPath: /opt/zs-admin/
commands: |
# 停止旧应用
/opt/zs-admin/stop.sh
# 启动新应用
/opt/zs-admin/start.sh7.3 其他 CI/CD 工具
除了阿里云效,以下是其他常用的 CI/CD 流水线工具:
| 工具名称 | 官方链接 | 特点 |
|---|---|---|
| GitHub Actions | https://docs.github.com/zh/actions | 与 GitHub 深度集成,配置简单,生态丰富 |
| GitLab CI/CD | https://docs.gitlab.cn/jh/ci/ | 内置 GitLab 中,功能全面,支持自托管 |
| Jenkins | https://www.jenkins.io/zh/ | 开源免费,插件丰富,高度可定制 |
| CircleCI | https://circleci.com/docs/ | 配置简洁,性能优异,支持多种语言 |
| Travis CI | https://docs.travis-ci.com/ | 专注开源项目,配置简单,使用广泛 |
| Bitbucket Pipelines | https://bitbucket.org/product/zh-CN/features/pipelines | 与 Bitbucket 集成,配置灵活,支持多种环境 |
| TeamCity | https://www.jetbrains.com/teamcity/ | JetBrains 出品,功能强大,易于使用 |
| Azure DevOps | https://azure.microsoft.com/zh-cn/products/devops/ | 微软 Azure 生态,支持多种部署目标 |
7.4 Jenkins 基本配置
Jenkins 是一个开源的自动化服务器,支持通过插件扩展功能。以下是 Jenkins 配置后端项目 CI/CD 的基本步骤:
- 安装 Jenkins:https://www.jenkins.io/zh/doc/book/installing/
- 安装必要插件:Maven Integration Plugin、Git Plugin、Publish Over SSH Plugin
- 配置 JDK 和 Maven:在 Jenkins 全局工具配置中添加 JDK 和 Maven 安装
- 创建流水线项目:
- 选择「流水线」项目类型
- 配置 Git 仓库地址和凭证
- 在流水线脚本中编写 Jenkinsfile
7.5 选择建议
- 小型项目/开源项目:GitHub Actions、GitLab CI/CD、Travis CI
- 企业级项目:阿里云效、GitLab CI/CD、Jenkins、Azure DevOps
- 需要自托管:Jenkins、GitLab CI/CD
- 与云服务深度集成:阿里云效、GitHub Actions、Azure DevOps
每个 CI/CD 工具都有其特点和适用场景,建议根据项目规模、团队熟悉度和部署需求选择合适的工具。