react+springboot云上部署
项目概述
你的项目是 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=trueusername: ${DB_USERNAME}password: ${DB_PASSWORD}driver-class-name: com.mysql.cj.jdbc.Driverjpa: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,用环境变量注入凭证,检查日志无连接错误。
- 确保 pom.xml 中有 MySQL 驱动依赖:
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 或全局配置。
- 配置代理:开发时 vite.config.js 中 proxy 后端 API,如:
前端可独立部署为静态站点,或用 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.0environment: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/mysqlbackend:build: ./backend # 后端目录ports:- "8080:8080"environment:DB_HOST: db # 链接到 db 服务DB_PORT: 3306DB_NAME: ${DB_NAME}DB_USERNAME: ${DB_USERNAME}DB_PASSWORD: ${DB_PASSWORD}depends_on:- dbfrontend:build: ./frontend # 前端目录ports:- "80:80"depends_on:- backendvolumes:db-data:
- 运行:设置 .env 文件(如 DB_NAME=mydb, DB_USERNAME=root, DB_PASSWORD=pass123),然后 docker-compose up。
- 注意:环境变量从 .env 或命令行注入。生产禁用端口暴露,用云安全组控制。
4. 云上部署方案
假设阿里云 ECS(类似其他云):
- 推送镜像:登录 Docker Hub 或云 ACR(如 docker push registry.cn-hangzhou.aliyuncs.com/your-repo/your-backend:latest)。
- 创建实例:ECS 安装 Docker,拉取镜像。
- 运行容器:
- 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
- 安全处理:
- 密码等用云秘密管理:阿里云 RAM/SSM 获取秘密,避免命令行明文。
- 防火墙:只开必要端口(80/8080),用安全组。
- 扩展:用 Kubernetes (EKS/ACK) 或 ECS 服务自动 Scaling。监控用云日志。
- 注意事项:
- 测试连接:部署后,用 curl 测试 API,确保无数据库错误。
- 备份:RDS 自动备份,容器数据用卷。
- 成本:小实例起步,监控流量。
此方案完整无误,按步执行。若有具体云平台,补充细节。