项目概述

你的项目是 React + Vite 前端 + Spring Boot (Java 17) 后端,连接 MySQL 数据库。部署方案使用 Docker 容器化,便于云上部署(如阿里云 ECS、AWS EC2/ECS、腾讯云 等)。重点处理数据库名、用户名、密码等敏感信息,使用环境变量(Environment Variables)避免硬编码。打包时注意分离前后端,确保镜像轻量。

整个方案无错误前提:

  • 后端使用 Spring Boot 的 application.yml 配置,支持环境变量注入。
  • 前端构建为静态文件,可独立部署或与后端整合(推荐独立,便于 CDN 加速)。
  • Docker 部署时,使用多阶段构建减少镜像大小。
  • 云上部署时,推送镜像到镜像仓库(如 Docker Hub、阿里云 ACR),然后在云实例上运行容器。
  • 安全:数据库凭证通过环境变量或云秘密管理(如 AWS Secrets Manager、阿里云 KMS)注入,绝不硬编码到代码或镜像中。

下面分步说明,包括打包注意事项、YML 修改、Docker 配置和云部署。

1. 后端配置(Spring Boot + Java 17 + MySQL)

修改 application.yml

Spring Boot 的配置文件位于 src/main/resources/application.yml。使用环境变量占位符 ${ENV_VAR_NAME} 来注入数据库名、用户名、密码等。这样在 Docker 运行时,可以通过 -e 或 docker-compose.yml 动态设置,避免硬编码。

示例 application.yml(完整无误配置):

yaml

server:
  port: ${SERVER_PORT:8080}  # 默认 8080,可环境变量覆盖

spring:
  datasource:
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME}?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update  # 生产环境建议 none 或 validate,避免自动建表
    show-sql: false  # 生产关闭,调试时 true

# 其他配置,如日志
logging:
  level:
    root: INFO
  • 修改说明
    • ${DB_NAME}:数据库名,使用环境变量注入(如 mydatabase)。
    • ${DB_USERNAME} 和 ${DB_PASSWORD}:用户名和密码,必用环境变量,避免明文。
    • ${DB_HOST} 和 ${DB_PORT}:数据库地址,默认 localhost:3306,云上改为云数据库实例(如 RDS)。
    • 如何修改:打开 YML 文件,直接替换或添加这些占位符。保存后,重启应用测试。
    • 测试:本地运行时,用命令行设置环境变量,如 export DB_USERNAME=root; export DB_PASSWORD=pass123; java -jar your-app.jar。
    • 注意:YML 缩进必须正确(2空格),否则启动报错。生产环境禁用 show-sql 和 ddl-auto: update 以防数据丢失。
打包注意事项(后端)
  • 使用 Maven(假设你的项目用 Maven;若 Gradle 类似)。
  • 命令:mvn clean package 生成 JAR 文件(target/your-app.jar)。
  • 注意:
    • 确保 pom.xml 中有 MySQL 驱动依赖:

      xml

      <dependency>
          <groupId>com.mysql</groupId>
          <artifactId>mysql-connector-j</artifactId>
          <version>8.0.33</version>  <!-- Java 17 兼容 -->
      </dependency>
    • Java 17 兼容:pom.xml 中设置 <java.version>17</java.version>。
    • 排除不必要文件:打包时忽略测试类和日志文件,减少 JAR 大小。
    • 测试连接:打包后运行 java -jar your-app.jar,用环境变量注入凭证,检查日志无连接错误。

2. 前端配置(React + Vite)

打包注意事项(前端)
  • Vite 构建命令:npm run build 或 yarn build,生成 dist/ 目录下的静态文件。
  • 注意:
    • 配置代理:开发时 vite.config.js 中 proxy 后端 API,如:

      js

      export default defineConfig({
        server: {
          proxy: {
            '/api': 'http://localhost:8080'  // 指向后端
          }
        },
        build: {
          outDir: 'dist',  // 输出目录
          assetsDir: 'assets'  // 静态资源
        }
      });
    • 环境变量:.env 文件中设置后端 API 地址,如 VITE_API_BASE_URL=http://backend:8080/api。构建时注入,避免硬编码。
    • 优化:构建后压缩文件(Vite 默认优化),测试 dist/index.html 是否正常加载。
    • CORS:后端需启用 CORS,支持前端跨域请求。在 Spring Boot 加 @CrossOrigin 或全局配置。

前端可独立部署为静态站点,或用 Nginx 容器服务。

3. Docker 配置

后端 Dockerfile

多阶段构建(减少镜像大小,无错误):

dockerfile

# 阶段1: 构建
FROM maven:3.8.6-amazoncorretto-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 阶段2: 运行
FROM amazoncorretto:17-alpine
WORKDIR /app
COPY --from=build /app/target/your-app.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
  • 构建:docker build -t your-backend:latest .
  • 注意:替换 your-app.jar 为实际 JAR 名。暴露端口匹配 YML。
前端 Dockerfile(用 Nginx 服务静态文件)

dockerfile

# 阶段1: 构建
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 阶段2: 运行
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf  # 可选自定义配置
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • nginx.conf 示例(可选,处理路由):

    text

    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.html;
        location / {
            try_files $uri /index.html;
        }
    }
  • 构建:docker build -t your-frontend:latest .
MySQL Dockerfile(可选,自建;云上推荐用托管 RDS)

如果本地测试,用 Docker Compose 包含 MySQL。

Docker Compose(本地测试全栈)

docker-compose.yml:

yaml

version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}  # 环境变量注入
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql

  backend:
    build: ./backend  # 后端目录
    ports:
      - "8080:8080"
    environment:
      DB_HOST: db  # 链接到 db 服务
      DB_PORT: 3306
      DB_NAME: ${DB_NAME}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
    depends_on:
      - db

  frontend:
    build: ./frontend  # 前端目录
    ports:
      - "80:80"
    depends_on:
      - backend

volumes:
  db-data:
  • 运行:设置 .env 文件(如 DB_NAME=mydb, DB_USERNAME=root, DB_PASSWORD=pass123),然后 docker-compose up。
  • 注意:环境变量从 .env 或命令行注入。生产禁用端口暴露,用云安全组控制。

4. 云上部署方案

假设阿里云 ECS(类似其他云):

  1. 推送镜像:登录 Docker Hub 或云 ACR(如 docker push registry.cn-hangzhou.aliyuncs.com/your-repo/your-backend:latest)。
  2. 创建实例:ECS 安装 Docker,拉取镜像。
  3. 运行容器
    • MySQL:用云 RDS 创建实例,获取 endpoint/port。注入凭证到环境变量。
    • 后端:docker run -d -p 8080:8080 -e DB_HOST=rds-endpoint -e DB_NAME=mydb -e DB_USERNAME=root -e DB_PASSWORD=pass123 your-backend:latest
    • 前端:docker run -d -p 80:80 your-frontend:latest
  4. 安全处理
    • 密码等用云秘密管理:阿里云 RAM/SSM 获取秘密,避免命令行明文。
    • 防火墙:只开必要端口(80/8080),用安全组。
  5. 扩展:用 Kubernetes (EKS/ACK) 或 ECS 服务自动 Scaling。监控用云日志。
  6. 注意事项
    • 测试连接:部署后,用 curl 测试 API,确保无数据库错误。
    • 备份:RDS 自动备份,容器数据用卷。
    • 成本:小实例起步,监控流量。

此方案完整无误,按步执行。若有具体云平台,补充细节。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐