Skip to content

后端部署技术文档

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.7ORM框架
MySQL Connector^8.0.36数据库驱动
Redis^7.4.1缓存
Spring Security^6.3.0安全框架
Spring Cloud^2023.0.3微服务框架

2. 环境准备

2.1 基础环境

环境版本要求说明
JDK17+Spring Boot 3.x 要求 JDK 17 及以上
Maven3.8+项目构建工具
MySQL8.0+数据库服务
Redis6.0+缓存服务
Git2.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:$PATH

3. 数据库配置

3.1 创建数据库

  1. 登录 MySQL 数据库:
bash
mysql -u root -p
  1. 创建数据库:
sql
CREATE DATABASE zs_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3.2 导入初始化数据

  1. 执行初始化 SQL 脚本:
bash
mysql -u root -p zs_admin < /path/to/zs_admin_init.sql

3.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.Driver

4. Redis 配置

4.1 安装 Redis

  1. 下载并安装 Redis:
bash
# CentOS/RHEL
yum install redis

# Ubuntu/Debian
apt-get install redis-server
  1. 启动 Redis 服务:
bash
# CentOS/RHEL
systemctl start redis
systemctl enable redis

# Ubuntu/Debian
service redis-server start
systemctl enable redis-server

4.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: 0

5. 构建流程

5.1 构建命令

项目提供了多种构建命令,用于不同的构建场景:

命令说明适用场景
mvn clean compile编译项目开发阶段
mvn clean test运行测试测试阶段
mvn clean package打包项目(含测试)测试阶段
mvn clean package -DskipTests打包项目(跳过测试)生产部署
mvn clean install安装到本地仓库开发阶段

5.2 编译打包

  1. 执行 Maven 打包命令:
bash
# 打包(跳过测试,适合生产部署)
mvn clean package -DskipTests

5.3 构建产物

构建成功后,产物将生成在 target 目录下,主要包括:

target/
├── zs-admin-${version}.jar              # 可执行 JAR 文件

6. 部署方式

6.1 传统部署

6.1.1 服务器准备

  1. 安装 JDK 17
  2. 安装 MySQL 8.0
  3. 安装 Redis 7.0
  4. 创建部署目录:mkdir -p /opt/zs-admin
  5. 创建日志目录:mkdir -p /var/log/zs-admin

6.1.2 数据库初始化

  1. 创建数据库:
    sql
    CREATE DATABASE zs_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 导入初始化脚本:
    bash
    mysql -u root -p zs_admin < sql/init.sql

6.1.3 应用部署

  1. 上传 JAR 文件到服务器:

    bash
    scp target/zs-admin-${version}.jar root@server_ip:/opt/zs-admin/
  2. 创建启动脚本 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"
  3. 创建停止脚本 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
  4. 启动应用:

    bash
    chmod +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 部署步骤

  1. 构建项目:

    bash
    mvn clean package -DskipTests
  2. 构建 Docker 镜像:

    bash
    docker build -t zs-admin .
  3. 运行 Docker 容器:

    bash
    docker run -d -p 8080:8080 \
      --name zs-admin \
      --network zs-network \
      zs-admin
  4. 验证部署:

    bash
    curl 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: always

6.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 部署步骤

  1. 构建项目:

    bash
    mvn clean package -DskipTests
  2. 启动容器:

    bash
    docker-compose up -d
  3. 查看容器状态:

    bash
    docker-compose ps
  4. 查看日志:

    bash
    docker-compose logs -f backend
  5. 验证部署:

    bash
    curl http://localhost:8080/api

7. 持续集成与持续部署

7.1 CI/CD 流程

建议使用以下 CI/CD 流程:

  1. 代码提交:开发者将代码提交到 Git 仓库
  2. 自动构建:CI 工具自动构建项目并运行测试
  3. 代码检查:运行 SonarQube 代码质量检查
  4. 构建产物上传:将构建产物上传到 Maven 仓库或 Docker 镜像仓库
  5. 自动部署:CD 工具将构建产物部署到测试或生产环境
  6. 部署验证:运行自动化测试验证部署结果

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.sh

7.3 其他 CI/CD 工具

除了阿里云效,以下是其他常用的 CI/CD 流水线工具:

工具名称官方链接特点
GitHub Actionshttps://docs.github.com/zh/actions与 GitHub 深度集成,配置简单,生态丰富
GitLab CI/CDhttps://docs.gitlab.cn/jh/ci/内置 GitLab 中,功能全面,支持自托管
Jenkinshttps://www.jenkins.io/zh/开源免费,插件丰富,高度可定制
CircleCIhttps://circleci.com/docs/配置简洁,性能优异,支持多种语言
Travis CIhttps://docs.travis-ci.com/专注开源项目,配置简单,使用广泛
Bitbucket Pipelineshttps://bitbucket.org/product/zh-CN/features/pipelines与 Bitbucket 集成,配置灵活,支持多种环境
TeamCityhttps://www.jetbrains.com/teamcity/JetBrains 出品,功能强大,易于使用
Azure DevOpshttps://azure.microsoft.com/zh-cn/products/devops/微软 Azure 生态,支持多种部署目标

7.4 Jenkins 基本配置

Jenkins 是一个开源的自动化服务器,支持通过插件扩展功能。以下是 Jenkins 配置后端项目 CI/CD 的基本步骤:

  1. 安装 Jenkinshttps://www.jenkins.io/zh/doc/book/installing/
  2. 安装必要插件:Maven Integration Plugin、Git Plugin、Publish Over SSH Plugin
  3. 配置 JDK 和 Maven:在 Jenkins 全局工具配置中添加 JDK 和 Maven 安装
  4. 创建流水线项目
    • 选择「流水线」项目类型
    • 配置 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 工具都有其特点和适用场景,建议根据项目规模、团队熟悉度和部署需求选择合适的工具。