增加了开发和生产环境的配置文件,在生产环境使用环境变量设置参数

This commit is contained in:
Tian jianyong 2025-10-09 16:53:22 +08:00
parent 4978c9ffaf
commit 11d677d95a
13 changed files with 2474 additions and 343 deletions

64
.env.example Normal file
View File

@ -0,0 +1,64 @@
# ============================================================
# QAUP 生产环境变量配置模板
# 使用说明:
# 1. 复制此文件为 .env: cp .env.example .env
# 2. 修改 .env 中的配置值
# 3. 启动应用时会自动加载 .env 文件中的环境变量
# 4. 修改配置后执行 ./qaup.sh restart 使配置生效
# ============================================================
# ========== 数据库配置 ==========
DB_HOST=10.64.58.228
DB_PORT=5432
DB_NAME=qaup
DB_USERNAME=postgres
DB_PASSWORD=123456
# ========== Redis配置 ==========
REDIS_HOST=10.64.58.228
REDIS_PORT=6379
REDIS_DATABASE=0
REDIS_PASSWORD=
# ========== 服务器配置 ==========
SERVER_PORT=8080
# ========== 机场数据API配置 ==========
# 机场数据接口基础URL
AIRPORT_API_BASE_URL=http://10.64.58.228:8090
# 机场API认证信息
AIRPORT_API_USERNAME=dianxin
AIRPORT_API_PASSWORD=dianxin@123
# ========== 无人车厂商API配置 ==========
# 无人车厂商接口基础URL
VEHICLE_API_BASE_URL=http://10.64.58.228:8091
# 无人车API超时和重试配置可选单位毫秒
VEHICLE_API_TIMEOUT=1000
VEHICLE_API_RETRY=3
# ========== 数据采集配置(可选)==========
# 数据采集间隔(单位:毫秒)
DATA_COLLECTOR_INTERVAL=250
# 检测和推送间隔(单位:毫秒)
DATA_DETECTION_INTERVAL=1000
# ========== 红绿灯系统配置(可选)==========
TRAFFIC_LIGHT_TCP_ENABLED=true
TRAFFIC_LIGHT_TCP_PORT=8082
# ========== 日志配置(可选)==========
LOG_LEVEL_QAUP=info
LOG_LEVEL_SPRING=warn
# ============================================================
# 注意事项:
# 1. 等号两边不要有空格
# 2. 字符串值不需要引号
# 3. #开头的行为注释
# 4. 请勿将 .env 文件提交到Git仓库
# 5. 修改后执行 ./qaup.sh restart 使配置生效
# ============================================================

View File

@ -1,31 +1,45 @@
# 命令
### 强制编译
```bash
mvn clean install -DskipTests
```
## 开发环境编译
### 完整编译
mvn clean install
### 启动后端
### 跳过测试(更快)
mvn clean install -DskipTests
### 只编译 admin 模块
cd qaup-admin
mvn clean package -DskipTests
## 生产环境打包
### 打包生产版本
mvn clean package -DskipTests -Pprod
### 或者不指定 profile配置文件都会打包
mvn clean package -DskipTests
## 启动后端(开发环境)
```bash
cd qaup-admin
mvn spring-boot:run
mvn spring-boot:run -Dspring-boot.run.profiles=dev,druid
```
### 启动前端
## 启动前端
```bash
cd qaup-admin
npm run dev
```
### 访问Swagger UI (前端)
## 访问Swagger UI (前端)
http://localhost:8080/swagger-ui/index.html
### 查看端口占用
## 查看端口占用
```bash
lsof -ti:8080
```
### 杀死进程
## 杀死进程
```bash
kill -9 进程ID
```

View File

@ -0,0 +1,293 @@
# 配置重构后的编译说明
**日期**: 2025-01-10
**适用版本**: v1.0.1+
---
## ❓ 配置重构后,编译命令需要改吗?
### 答案:❌ 不需要改!
---
## 📋 编译命令保持不变
### 开发环境编译
```bash
# 完整编译
mvn clean install
# 跳过测试(更快)
mvn clean install -DskipTests
# 只编译 admin 模块
cd qaup-admin
mvn clean package -DskipTests
```
### 生产环境打包
```bash
# 打包生产版本
mvn clean package -DskipTests
# 或指定 profile可选
mvn clean package -DskipTests -Pprod
```
---
## 🔍 为什么不需要修改?
### 1. 配置文件自动打包
Maven 会自动将 `src/main/resources/` 下的所有文件打包到 jar 中,包括:
```
qaup-admin/src/main/resources/
├── application.yml ✅ 自动打包
├── application-dev.yml ✅ 自动打包
├── application-prod.yml ✅ 自动打包
└── application-druid.yml ✅ 自动打包
```
### 2. 环境变量是运行时机制
- `.env` 文件**不打包**到 jar 中(也不应该打包)
- 环境变量在应用**启动时**由 `qaup.sh` 加载
- 与编译过程无关
### 3. Profile 在运行时指定
- Profile 通过 `--spring.profiles.active` 在启动时指定
- 不影响编译过程
---
## 📦 打包后的结构
### jar 包内部结构
```
qaup-admin.jar
├── BOOT-INF/
│ ├── classes/
│ │ ├── application.yml ✅ 打包
│ │ ├── application-dev.yml ✅ 打包
│ │ ├── application-prod.yml ✅ 打包
│ │ ├── application-druid.yml ✅ 打包
│ │ └── com/qaup/... (Java类)
│ └── lib/ (依赖jar)
├── META-INF/
└── org/springframework/boot/loader/
```
### 部署目录结构
```
/app/ # 部署目录
├── qaup-admin.jar # 打包的jar包含所有配置文件
├── qaup.sh # 启动脚本
├── .env ❌ 不打包,部署时手动创建
├── .env.example 📝 可选建议通过Git获取
└── logs/ # 日志目录
```
---
## 🎯 完整的开发-部署流程
### 1⃣ 开发阶段(本地)
```bash
# 方式1: IDEA 中直接启动
# 自动使用 dev profile无需编译
# 方式2: Maven 启动
cd qaup-admin
mvn spring-boot:run -Dspring-boot.run.profiles=dev,druid
```
### 2⃣ 打包阶段
```bash
# 在项目根目录执行
mvn clean package -DskipTests
# 生成的 jar 包位置
ls -lh qaup-admin/target/qaup-admin.jar
```
### 3⃣ 部署阶段
```bash
# 1. 复制文件到服务器
scp qaup-admin/target/qaup-admin.jar user@server:/app/
scp qaup.sh user@server:/app/
scp .env.example user@server:/app/
# 2. 在服务器上创建配置
cd /app
cp .env.example .env
vim .env
# 3. 启动应用
./qaup.sh start
```
---
## 🔒 重要提醒
### ✅ 应该做的
1. **打包所有配置文件到 jar**
```bash
# application*.yml 会自动打包
mvn clean package -DskipTests
```
2. **在部署时创建 .env**
```bash
# 在服务器上创建
cp .env.example .env
vim .env
```
3. **通过 Git 管理配置模板**
```bash
# .gitignore
.env # 忽略实际配置
!.env.example # 保留模板
```
### ❌ 不应该做的
1. **不要把 .env 打包到 jar**
- 包含敏感信息
- 每个环境配置不同
2. **不要在编译时指定环境变量**
```bash
# ❌ 错误
mvn clean package -DAIRPORT_API_BASE_URL=http://...
# ✅ 正确:编译时不指定,运行时通过 .env 加载
mvn clean package -DskipTests
```
3. **不要打包备份文件**
```bash
# 打包前删除
rm qaup-admin/src/main/resources/*.backup
```
---
## 📋 建议的 .gitignore 配置
```bash
# 环境变量配置(重要!)
.env
.env.local
.env.production
.env.*.local
# 配置备份文件
*.backup
# 日志文件
logs/
*.log
# Maven 构建目录
target/
# IDEA 项目文件
.idea/
*.iml
```
---
## 🆚 配置重构前后对比
| 项目 | 重构前 | 重构后 |
|-----|--------|--------|
| **编译命令** | `mvn clean package` | `mvn clean package` ✅ 不变 |
| **配置修改** | 修改配置文件 → 重新打包 | 修改 .env → 重启应用 |
| **环境切换** | 修改配置文件 → 重新打包 | 切换 .env → 重启应用 |
| **敏感信息** | 打包到 jar 中 ❌ | 保存在 .env 中 ✅ |
---
## 💡 常见问题
### Q1: `.env.example` 要打包到 jar 吗?
**A**: 📝 建议不打包
**原因**:
- 可以通过 Git 获取
- 减小 jar 体积
- 部署时从项目源码复制
**操作**:
```bash
# 部署时从项目获取
git clone <repo>
cp <project>/.env.example /app/.env
```
### Q2: 如果我只修改了 .env需要重新编译吗
**A**: ❌ 不需要
```bash
# 只需要
vim .env
./qaup.sh restart
```
### Q3: 如果我修改了 application-prod.yml需要重新编译吗
**A**: ✅ 需要
```bash
# 修改配置文件后
mvn clean package -DskipTests
# 重新部署 jar
scp qaup-admin/target/qaup-admin.jar user@server:/app/
./qaup.sh restart
```
**建议**: 尽量使用环境变量方式,避免重新打包
---
## 🎯 最佳实践总结
1. ✅ **编译命令保持不变**: `mvn clean package -DskipTests`
2. ✅ **配置文件自动打包**: 所有 `application*.yml` 都会打包
3. ✅ **环境变量运行时加载**: `.env` 不打包,部署时创建
4. ✅ **敏感信息不打包**: 密码、地址等通过 `.env` 管理
5. ✅ **一次打包,多环境部署**: 通过不同的 `.env` 文件区分环境
---
## 📚 相关文档
- [配置文件重构说明](../working/20250110_配置文件重构说明.md)
- [环境变量配置方案](../working/20250110_环境变量配置方案.md)
- [qaup.sh 更新说明](../working/20250110_qaup.sh更新说明.md)
- [CLAUDE.md - 项目说明](../../CLAUDE.md)
---
**文档结束**
**最后更新**: 2025-01-10
**维护者**: QAUP Team

View File

@ -0,0 +1,345 @@
# qaup.sh 启动脚本更新说明
**日期**: 2025-01-10
**版本**: v2.0
**状态**: ✅ 已完成
---
## 📋 更新内容
### 新增功能
1. ✅ **环境变量加载功能**
- 自动从 `.env` 文件加载环境变量
- 支持配置文件不存在时的友好提示
- 过滤注释行和空行
2. ✅ **Spring Profile 自动指定**
- 默认使用 `prod,druid` profile
- 支持通过环境变量 `SPRING_PROFILES_ACTIVE` 覆盖
- 启动时显示使用的 profile
3. ✅ **代码优化**
- 添加详细注释
- 改进错误提示信息
- 统一代码格式
---
## 🔧 主要修改点
### 1. 新增变量定义
```bash
# 环境变量配置文件路径
ENV_FILE=$APP_HOME/.env
# Spring Profile配置生产环境使用prod开发环境使用dev
# 可通过环境变量 SPRING_PROFILES_ACTIVE 覆盖,默认为 prod,druid
SPRING_PROFILES=${SPRING_PROFILES_ACTIVE:-prod,druid}
```
### 2. start() 函数增强
**增加环境变量加载逻辑**:
```bash
# ========== 加载环境变量配置 ==========
if [ -f "$ENV_FILE" ]; then
echo "Loading environment variables from $ENV_FILE"
# 导出环境变量,忽略注释行和空行
export $(cat $ENV_FILE | grep -v '^#' | grep -v '^$' | xargs)
echo "Environment variables loaded successfully"
else
echo "Warning: $ENV_FILE not found, using default configuration"
fi
# ========================================
```
**增加 Profile 提示和指定**:
```bash
echo "Starting $AppName with profile: $SPRING_PROFILES"
# 启动应用指定Spring Profile
nohup java $JVM_OPTS -jar $AppName --spring.profiles.active=$SPRING_PROFILES > /dev/null 2>&1 &
```
### 3. case 语句优化
```bash
*)
echo -e "\033[0;31m 未知操作 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
esac
```
---
## 🚀 使用方式
### 基本使用(生产环境)
```bash
# 1. 创建环境变量文件
cp .env.example .env
# 2. 编辑配置
vim .env
# 3. 启动应用(自动使用 prod,druid profile
./qaup.sh start
# 输出示例:
# Loading environment variables from /app/.env
# Environment variables loaded successfully
# Starting qaup-admin.jar with profile: prod,druid
# Start qaup-admin.jar success...
```
### 指定不同的 Profile
```bash
# 方式1: 通过环境变量
SPRING_PROFILES_ACTIVE=dev,druid ./qaup.sh start
# 方式2: 在脚本中修改 SPRING_PROFILES 默认值
# 编辑 qaup.sh修改第17行
SPRING_PROFILES=${SPRING_PROFILES_ACTIVE:-dev,druid}
```
### 无 .env 文件时的行为
```bash
./qaup.sh start
# 输出示例:
# Warning: /app/.env not found, using default configuration
# Starting qaup-admin.jar with profile: prod,druid
# Start qaup-admin.jar success...
# 应用将使用配置文件中的默认值启动
```
---
## 📊 与配置文件的配合
### 完整的配置加载流程
```
1. qaup.sh 启动
2. 加载 .env 文件(如果存在)
3. 导出环境变量到系统
4. 启动 Java 应用,指定 profile=prod,druid
5. Spring Boot 加载配置优先级:
a. 环境变量(来自 .env
b. application-prod.yml
c. application-druid.yml
d. application.yml
6. 最终配置 = 环境变量覆盖配置文件中的 ${VAR:default} 值
```
### 示例
**配置文件** (`application-prod.yml`):
```yaml
data:
collector:
airport-api:
base-url: ${AIRPORT_API_BASE_URL:http://localhost:8090}
```
**.env 文件**:
```bash
AIRPORT_API_BASE_URL=http://192.168.1.100:8090
```
**实际运行时的值**:
```
data.collector.airport-api.base-url = http://192.168.1.100:8090
```
---
## ✅ 验证方法
### 1. 验证脚本语法
```bash
bash -n qaup.sh
# 无输出表示语法正确
```
### 2. 验证环境变量加载
```bash
# 创建测试 .env
cat > .env << EOF
TEST_VAR=test_value
AIRPORT_API_BASE_URL=http://test-server:8090
EOF
# 测试启动
./qaup.sh start
# 查看日志,确认:
# 1. 看到 "Loading environment variables" 消息
# 2. 看到 "Starting ... with profile: prod,druid"
# 3. 应用日志中 airport-api.base-url = http://test-server:8090
```
### 3. 验证 Profile 切换
```bash
# 使用 dev profile
SPRING_PROFILES_ACTIVE=dev,druid ./qaup.sh start
# 查看应用日志:
tail -f logs/qaup-admin.jar.log | grep "profiles are active"
# 应该看到:
# The following 2 profiles are active: "dev", "druid"
```
---
## 🔄 与旧版本的对比
| 功能 | 旧版本 | 新版本 |
|-----|--------|--------|
| **环境变量支持** | ❌ 无 | ✅ 自动加载 .env |
| **Profile 指定** | ❌ 无(使用默认) | ✅ 自动指定 prod,druid |
| **配置修改** | ❌ 需重新打包 | ✅ 修改 .env 即可 |
| **启动提示** | ❌ 简单提示 | ✅ 详细信息 |
| **错误处理** | ⚠️ 基础 | ✅ 友好提示 |
---
## ⚠️ 注意事项
### 1. .env 文件格式
```bash
# ✅ 正确格式
DB_HOST=localhost
DB_PORT=5432
# ❌ 错误格式
DB_HOST = localhost # 等号两边有空格
DB_HOST="localhost" # 使用了引号
export DB_HOST=localhost # 使用了 export
```
### 2. 安全建议
```bash
# 设置 .env 文件权限
chmod 600 .env
# 防止提交到 Git
echo ".env" >> .gitignore
```
### 3. 多环境部署
```bash
# 开发环境
SPRING_PROFILES_ACTIVE=dev,druid ./qaup.sh start
# 测试环境
SPRING_PROFILES_ACTIVE=test,druid ./qaup.sh start
# 生产环境(默认)
./qaup.sh start
```
---
## 📚 相关文档
- [配置文件重构说明](./20250110_配置文件重构说明.md)
- [环境变量配置方案](./20250110_环境变量配置方案.md)
- [工作文档目录](./README.md)
---
## 🔍 故障排查
### 问题1: 环境变量未生效
**症状**: 应用仍使用配置文件中的默认值
**排查**:
```bash
# 1. 检查 .env 是否存在
ls -la .env
# 2. 检查启动日志是否有加载提示
# 应该看到: "Loading environment variables from ..."
# 3. 手动测试环境变量加载
source .env
echo $AIRPORT_API_BASE_URL
```
**解决**: 确保 .env 文件格式正确,无空格和引号
---
### 问题2: Profile 未正确激活
**症状**: 应用启动但使用了错误的 profile
**排查**:
```bash
# 查看启动日志
tail -f logs/qaup-admin.jar.log | grep "profiles are active"
```
**解决**:
```bash
# 检查启动脚本中的 SPRING_PROFILES 变量
grep SPRING_PROFILES qaup.sh
# 或显式指定
SPRING_PROFILES_ACTIVE=prod,druid ./qaup.sh restart
```
---
### 问题3: 脚本执行权限
**症状**: `./qaup.sh: Permission denied`
**解决**:
```bash
chmod +x qaup.sh
```
---
## 🎯 下一步建议
### 已完成
1. ✅ 启动脚本更新
2. ✅ 环境变量支持
3. ✅ Profile 自动指定
### 待完成
1. ❌ 测试验证(开发环境和生产环境)
2. ❌ 更新项目文档README.md, CLAUDE.md
3. ❌ 创建生产环境 .env 文件模板
---
**文档结束**
**最后更新**: 2025-01-10
**脚本版本**: v2.0
**维护者**: QAUP Team

View File

@ -0,0 +1,812 @@
# 生产环境配置管理方案 - 纯环境变量方案
**日期**: 2025-01-10
**版本**: v1.0
**适用场景**: Docker部署环境下修改API接口配置无需重新打包jar
---
## 📋 需求背景
当前生产环境使用Docker部署方式每次修改 `application-prod.yml` 都需要重新打包jar包流程繁琐。
**期望**: 只修改配置文件,重启应用即可生效,无需重新打包。
---
## 🎯 解决方案:纯环境变量方案
### 方案特点
| 特性 | 说明 |
|-----|------|
| ✅ 无需重新打包 | 只修改 .env 文件 |
| ✅ 修改简单 | 纯文本编辑 |
| ✅ 回滚容易 | 备份 .env 文件即可 |
| ✅ 版本控制 | 可保存多个环境的 .env |
| ✅ 安全性 | 敏感信息不打包到jar |
| ✅ 环境隔离 | 开发/测试/生产用不同 .env |
### 工作原理
Spring Boot 支持使用环境变量覆盖配置文件中的值:
```yaml
# application-prod.yml 中定义
data:
collector:
airport-api:
base-url: ${AIRPORT_API_BASE_URL:http://localhost:8090}
# ↑环境变量名 ↑默认值(环境变量不存在时使用)
```
当启动应用时,如果环境变量 `AIRPORT_API_BASE_URL` 存在,则使用环境变量的值;否则使用默认值。
---
## 🔧 实施步骤
### Step 1: 修改 application-prod.yml一次性修改
**文件位置**: `qaup-admin/src/main/resources/application-prod.yml`
**修改内容**:
```yaml
# 数据采集配置
data:
collector:
# 数据采集间隔(可选配置)
interval: ${DATA_COLLECTOR_INTERVAL:250}
detection:
# 检测间隔(可选配置)
interval: ${DATA_DETECTION_INTERVAL:1000}
# 机场数据源配置
airport-api:
# API基础URL环境变量覆盖
base-url: ${AIRPORT_API_BASE_URL:http://localhost:8090}
endpoints:
login: /login
refresh: /userInfoController/refreshToken
aircraft: /openApi/getCurrentFlightPositions
vehicle: /openApi/getCurrentVehiclePositions
arrival-route: /runwayPathPlanningController/findArrTaxiwayByRunwayAndContactCrossAndSeat
departure-route: /runwayPathPlanningController/findDepTaxiwayByRunwayAndContactCrossAndSeat
aircraft-status: /aircraftStatusController/getAircraftStatus
flight-notification: /openApi/getInboundAndOutboundFlightsNotification
# 认证信息(环境变量覆盖)
auth:
username: ${AIRPORT_API_USERNAME:dianxin}
password: ${AIRPORT_API_PASSWORD:dianxin@123}
# 无人车厂商数据源配置
vehicle-api:
# API基础URL环境变量覆盖
base-url: ${VEHICLE_API_BASE_URL:http://localhost:8091}
endpoints:
vehicle-command: /api/VehicleCommandInfo
universal-status: /api/v1/vehicles/{vehicleId}/status
# 超时和重试配置(可选)
timeout: ${VEHICLE_API_TIMEOUT:1000}
retry-attempts: ${VEHICLE_API_RETRY:3}
# 无人车数据持久化配置
unmanned-vehicle:
persistence:
enabled: true
batch-size: 50
location-retention-days: 90
command-retention-days: 365
command:
timeout: 1000
retry-attempts: 3
validation:
enabled: true
strict-mode: false
retention:
redis-expire-seconds: 60
postgresql-days: 30
```
**修改完成后**: 重新打包一次jar包这是最后一次打包
```bash
cd qaup-admin
mvn clean package -DskipTests
```
---
### Step 2: 修改启动脚本 qaup.sh
**文件位置**: 项目根目录 `qaup.sh`
**完整内容**:
```bash
#!/bin/sh
# ./qaup.sh start 启动 stop 停止 restart 重启 status 状态
AppName=qaup-admin.jar
# JVM参数
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log
ENV_FILE=$APP_HOME/.env
if [ "$1" = "" ];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [ "$AppName" = "" ];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
function start()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
else
# ========== 新增:加载环境变量 ==========
if [ -f "$ENV_FILE" ]; then
echo "Loading environment variables from $ENV_FILE"
# 导出环境变量,忽略注释和空行
export $(cat $ENV_FILE | grep -v '^#' | grep -v '^$' | xargs)
echo "Environment variables loaded successfully"
else
echo "Warning: $ENV_FILE not found, using default configuration"
fi
# ========================================
nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 &
echo "Start $AppName success..."
fi
}
function stop()
{
echo "Stop $AppName"
PID=""
query(){
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
}
query
if [ x"$PID" != x"" ]; then
kill -TERM $PID
echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ]
do
sleep 1
query
done
echo "$AppName exited."
else
echo "$AppName already stopped."
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
if [ $PID != 0 ];then
echo "$AppName is running..."
else
echo "$AppName is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
esac
```
**主要改动**:
1. 新增 `ENV_FILE` 变量指向 `.env` 文件
2. 在 `start()` 函数中加载环境变量
3. 添加了提示信息
---
### Step 3: 创建环境变量配置文件 .env
**文件位置**: jar包所在目录`qaup.sh` 同级)
**文件内容**:
```bash
# ============================================================
# QAUP 生产环境配置
# 环境变量配置文件
# 修改此文件后,执行 ./qaup.sh restart 即可生效
# ============================================================
# ========== 机场数据API配置 ==========
# 机场数据接口基础URL
AIRPORT_API_BASE_URL=http://192.168.1.100:8090
# 机场API认证信息
AIRPORT_API_USERNAME=dianxin
AIRPORT_API_PASSWORD=dianxin@123
# ========== 无人车厂商API配置 ==========
# 无人车厂商接口基础URL
VEHICLE_API_BASE_URL=http://192.168.1.101:8091
# 无人车API超时和重试配置可选单位毫秒
VEHICLE_API_TIMEOUT=1000
VEHICLE_API_RETRY=3
# ========== 数据采集配置(可选)==========
# 数据采集间隔(单位:毫秒)
DATA_COLLECTOR_INTERVAL=250
# 检测和推送间隔(单位:毫秒)
DATA_DETECTION_INTERVAL=1000
# ============================================================
# 注意事项:
# 1. 等号两边不要有空格
# 2. 字符串值不需要引号
# 3. #开头的行为注释
# 4. 修改后执行 ./qaup.sh restart 使配置生效
# ============================================================
```
**设置文件权限**推荐<E68EA8><E88D90>:
```bash
# 只有owner可读写防止密码泄露
chmod 600 .env
```
---
## 📁 部署目录结构
```
/app/ # 应用部署目录
├── qaup-admin.jar # 应用jar包
├── qaup.sh # 启动脚本(已修改)
├── .env # 环境变量配置文件(新增)
├── logs/ # 日志目录
│ └── qaup-admin.jar.log
└── config/ # 可选:外部配置目录
└── .env.backup-* # 配置备份文件
```
---
## 🚀 日常使用流程
### 1. 修改API配置
```bash
# 编辑环境变量文件
vim .env
# 修改内容示例:
AIRPORT_API_BASE_URL=http://新服务器IP:8090
AIRPORT_API_USERNAME=新用户名
AIRPORT_API_PASSWORD=新密码
VEHICLE_API_BASE_URL=http://新服务器IP:8091
# 保存并退出
:wq
```
### 2. 重启应用使配置生效
```bash
./qaup.sh restart
```
输出示例:
```
Stop qaup-admin.jar
qaup-admin.jar (pid:12345) exiting...
qaup-admin.jar exited.
Loading environment variables from /app/.env
Environment variables loaded successfully
Start qaup-admin.jar success...
```
### 3. 验证配置是否生效
#### 方法1: 查看日志
```bash
tail -f logs/qaup-admin.jar.log
```
查找包含 `base-url` 或 API调用相关的日志确认使用的是新地址。
#### 方法2: 查看环境变量(启动前测试)
```bash
# 加载环境变量
export $(cat .env | grep -v '^#' | grep -v '^$' | xargs)
# 查看变量值
echo $AIRPORT_API_BASE_URL
echo $VEHICLE_API_BASE_URL
```
#### 方法3: 使用管理端点(如果开启)
```bash
curl http://localhost:8080/actuator/env | grep AIRPORT_API
```
---
## 🔄 配置管理最佳实践
### 1. 备份配置
**每次修改前备份**:
```bash
# 备份到config目录
mkdir -p config
cp .env config/.env.backup-$(date +%Y%m%d-%H%M%S)
# 查看备份列表
ls -lh config/.env.backup-*
```
**示例**:
```
config/.env.backup-20250110-093000
config/.env.backup-20250110-143000
config/.env.backup-20250110-170000
```
### 2. 回滚配置
```bash
# 查看可用备份
ls config/.env.backup-*
# 恢复指定备份
cp config/.env.backup-20250110-093000 .env
# 重启应用
./qaup.sh restart
```
### 3. 多环境配置管理
**准备不同环境的配置文件**:
```bash
/app/config/
├── .env.dev # 开发环境配置
├── .env.test # 测试环境配置
├── .env.prod # 生产环境配置
└── .env.dr # 容灾环境配置
```
**切换环境**:
```bash
# 切换到测试环境
cp config/.env.test .env
./qaup.sh restart
# 切换到生产环境
cp config/.env.prod .env
./qaup.sh restart
```
### 4. 配置差异对比
```bash
# 对比当前配置和备份配置
diff .env config/.env.backup-20250110-093000
# 对比不同环境配置
diff config/.env.prod config/.env.test
```
---
## 🔒 安全建议
### 1. 文件权限控制
```bash
# .env 文件只允许owner读写
chmod 600 .env
# qaup.sh 可执行
chmod 755 qaup.sh
# jar包只读
chmod 444 qaup-admin.jar
```
### 2. Git版本控制
如果使用Git管理部署脚本**务必排除敏感文件**:
```bash
# 创建 .gitignore
cat > .gitignore << EOF
# 敏感配置文件
.env
.env.*
# 日志文件
logs/
*.log
# jar包通过CI/CD部署
*.jar
# 临时文件
*.tmp
*.swp
EOF
```
**可以提交的文件**:
- `qaup.sh` - 启动脚本
- `.env.example` - 配置模板(不含真实密码)
**示例配置模板** (`.env.example`):
```bash
# ========== 机场数据API配置 ==========
AIRPORT_API_BASE_URL=http://your-airport-api-server:8090
AIRPORT_API_USERNAME=your-username
AIRPORT_API_PASSWORD=your-password
# ========== 无人车厂商API配置 ==========
VEHICLE_API_BASE_URL=http://your-vehicle-api-server:8091
VEHICLE_API_TIMEOUT=1000
VEHICLE_API_RETRY=3
# ========== 数据采集配置 ==========
DATA_COLLECTOR_INTERVAL=250
DATA_DETECTION_INTERVAL=1000
```
### 3. 密码管理建议
- 使用强密码
- 定期更换密码
- 不同环境使用不同密码
- 使用密钥管理工具(如 Vault、AWS Secrets Manager
---
## 📋 完整环境变量列表
### 必需环境变量
| 环境变量名 | 描述 | 默认值 | 示例 |
|-----------|------|--------|------|
| AIRPORT_API_BASE_URL | 机场数据API基础URL | http://localhost:8090 | http://192.168.1.100:8090 |
| AIRPORT_API_USERNAME | 机场API用户名 | dianxin | dianxin |
| AIRPORT_API_PASSWORD | 机场API密码 | dianxin@123 | SecurePass123 |
| VEHICLE_API_BASE_URL | 无人车API基础URL | http://localhost:8091 | http://192.168.1.101:8091 |
### 可选环境变量
| 环境变量名 | 描述 | 默认值 | 示例 |
|-----------|------|--------|------|
| VEHICLE_API_TIMEOUT | 无人车API超时时间毫秒 | 1000 | 2000 |
| VEHICLE_API_RETRY | 无人车API重试次数 | 3 | 5 |
| DATA_COLLECTOR_INTERVAL | 数据采集间隔(毫秒) | 250 | 500 |
| DATA_DETECTION_INTERVAL | 检测间隔(毫秒) | 1000 | 1500 |
### 扩展环境变量(如果需要)
如果未来需要更多配置通过环境变量控制,可以继续扩展:
```bash
# 数据库配置
DB_HOST=localhost
DB_PORT=5432
DB_NAME=qaup
DB_USERNAME=postgres
DB_PASSWORD=123456
# Redis配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
# 日志级别
LOG_LEVEL_QAUP=info
LOG_LEVEL_SPRING=warn
```
---
## 🧪 测试验证
### 1. 本地测试
```bash
# 1. 创建测试配置
cat > .env.test << EOF
AIRPORT_API_BASE_URL=http://test-airport:8090
AIRPORT_API_USERNAME=test-user
AIRPORT_API_PASSWORD=test-pass
VEHICLE_API_BASE_URL=http://test-vehicle:8091
EOF
# 2. 使用测试配置
cp .env.test .env
# 3. 启动应用
./qaup.sh start
# 4. 查看日志验证
tail -f logs/qaup-admin.jar.log | grep -E "airport|vehicle"
```
### 2. 配置验证脚本
创建验证脚本 `verify-config.sh`:
```bash
#!/bin/bash
# 配置验证脚本
echo "========== 环境变量配置验证 =========="
if [ ! -f .env ]; then
echo "❌ .env 文件不存在"
exit 1
fi
echo "✅ .env 文件存在"
# 加载环境变量
export $(cat .env | grep -v '^#' | grep -v '^$' | xargs)
# 验证必需变量
REQUIRED_VARS=(
"AIRPORT_API_BASE_URL"
"AIRPORT_API_USERNAME"
"AIRPORT_API_PASSWORD"
"VEHICLE_API_BASE_URL"
)
for var in "${REQUIRED_VARS[@]}"; do
if [ -z "${!var}" ]; then
echo "❌ 缺少必需环境变量: $var"
exit 1
else
echo "✅ $var = ${!var}"
fi
done
echo "========== 验证通过 =========="
```
使用:
```bash
chmod +x verify-config.sh
./verify-config.sh
```
---
## 🔧 故障排查
### 问题1: 环境变量未生效
**症状**: 修改了 `.env` 但应用仍使用旧配置
**排查**:
```bash
# 1. 确认 .env 文件格式正确(无空格、无引号)
cat .env
# 2. 手动测试环境变量加载
export $(cat .env | grep -v '^#' | grep -v '^$' | xargs)
echo $AIRPORT_API_BASE_URL
# 3. 确认应用已重启
./qaup.sh status
ps -ef | grep qaup-admin.jar
# 4. 查看启动日志
tail -100 logs/qaup-admin.jar.log
```
**解决**: 确保执行了 `./qaup.sh restart`
---
### 问题2: .env 文件格式错误
**常见错误**:
```bash
# ❌ 错误:等号两边有空格
AIRPORT_API_BASE_URL = http://localhost:8090
# ❌ 错误:值使用了引号
AIRPORT_API_BASE_URL="http://localhost:8090"
# ❌ 错误:多余的导出语句
export AIRPORT_API_BASE_URL=http://localhost:8090
# ✅ 正确
AIRPORT_API_BASE_URL=http://localhost:8090
```
---
### 问题3: 权限问题
**症状**: 无法读取 .env 文件
```bash
# 检查文件权限
ls -l .env
# 修复权限
chmod 600 .env
chown app-user:app-group .env
```
---
## 📊 方案对比
### 与其他方案的对比
| <20><>性 | 环境变量方案 | 外部配置文件 | 配置中心 |
|-----|------------|------------|---------|
| 修改便捷性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 无需重新打包 | ✅ | ✅ | ✅ |
| 是否需要重启 | ✅ 需要 | ✅ 需要 | ❌ 不需要 |
| 实施复杂度 | 简单 | 简单 | 中等 |
| 适用场景 | 生产环境 | 生产环境 | 企业级/微服务 |
| 成本 | 无 | 无 | 需要额外服务 |
---
## 🎯 总结
### 优点
1. ✅ **无需重新打包jar** - 修改 `.env` 即可
2. ✅ **修改简单直观** - 纯文本编辑
3. ✅ **回滚容易** - 备份/恢复 `.env` 文件
4. ✅ **版本控制友好** - 可管理多环境配置
5. ✅ **安全性好** - 敏感信息不打包到jar
6. ✅ **环境隔离** - 不同环境使用不同配置
7. ✅ **零成本** - 无需额外组件
### 适用场景
- ✅ Docker部署环境
- ✅ 多环境部署(开发/测试/生产)
- ✅ 配置项以API地址、认证信息为主
- ✅ 配置变更频率不高(月度/季度级别)
### 不适用场景
- ❌ 需要实时配置生效(无法重启)
- ❌ 配置项非常多且复杂
- ❌ 微服务架构(建议使用配置中心)
---
## 🔄 后续优化方向
### 短期优化
1. **配置校验**: 启动前校验配置格式和必需项
2. **配置加密**: 敏感信息使用加密存储
3. **配置模板**: 提供不同场景的配置模板
### 长期规划
如果项目规模扩大、配置项增多建议引入配置中心Nacos/Apollo
- 配置实时生效
- 版本管理和灰度发布
- 统一管理多服务配置
- 配置变更审计
---
## 📚 参考资料
### Spring Boot 配置文档
- [Externalized Configuration](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config)
- [Environment Variables](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.typesafe-configuration-properties.relaxed-binding.environment-variables)
### 配置优先级
Spring Boot 配置加载优先级(从高到低):
1. 命令行参数
2. 操作系统环境变量 ⭐ **本方案使用**
3. `application-{profile}.properties/yml` (外部)
4. `application-{profile}.properties/yml` (jar内)
5. `application.properties/yml` (外部)
6. `application.properties/yml` (jar内)
---
## 📞 支持与维护
### 常见问题
如遇到问题,请检查:
1. `.env` 文件格式是否正确
2. 是否执行了 `./qaup.sh restart`
3. 启动日志是否有错误信息
4. 文件权限是否正确
### 配置变更记录
建议维护配置变更日志:
```bash
# 创建变更记录文件
cat > config/CHANGELOG.md << EOF
# 配置变更记录
## 2025-01-10 14:00
- 修改机场API地址: http://old:8090 -> http://new:8090
- 操作人: 张三
- 原因: 服务器迁移
## 2025-01-09 10:00
- 初始化生产环境配置
- 操作人: 李四
EOF
```
---
**文档结束**
**最后更新**: 2025-01-10
**文档版本**: v1.0
**维护者**: QAUP Team

View File

@ -0,0 +1,594 @@
# 配置文件重构说明
**日期**: 2025-01-10
**版本**: v1.0
**状态**: 🔄 配置文件已完成,启动脚本待更新
**目的**: 分离开发和生产环境配置,支持环境变量管理
---
## ✅ 已完成的工作
### 配置文件重构
1. ✅ **备份原配置**: `application-prod.yml.backup`, `application-deploy.yml.backup`
2. ✅ **创建开发环境配置**: `application-dev.yml` (新建)
3. ✅ **重构公共配置**: `application.yml` (只保留公共配置)
4. ✅ **重写生产环境配置**: `application-prod.yml` (支持环境变量)
5. ✅ **更新数据源配置**: `application-druid.yml` (支持环境变量)
6. ✅ **创建环境变量模板**: `.env.example`
7. ✅ **编写配置文档**: 本文档 + 环境变量配置方案
### ⚠️ 待完成的工作
1. ❌ **更新启动脚本**: `qaup.sh` 需要添加环境变量加载功能
2. ❌ **测试验证**: 开发环境和生产环境启动测试
3. ❌ **更新项目文档**: README.md, CLAUDE.md 等
---
## 📋 重构概述
### 重构前的问题
1. **配置重复**: `application.yml``application-prod.yml` 存在大量重复配置
2. **职责不清**: `application.yml` 既有公共配置,又有开发环境特定配置
3. **缺少独立的开发环境配置**: 没有 `application-dev.yml`
4. **生产环境修改不便**: 修改配置需要重新打包jar
### 重构后的改进
1. ✅ **清晰的配置分层**: 公共配置、开发环境、生产环境完全分离
2. ✅ **环境变量支持**: 生产环境关键配置支持环境变量覆盖
3. ✅ **无需重新打包**: 修改 `.env` 文件即可更新配置(需要先更新 qaup.sh
4. ✅ **便于维护**: 配置职责清晰,减少重复
---
## 📁 新的配置文件结构
```
qaup-admin/src/main/resources/
├── application.yml # 公共配置(所有环境共享)
├── application-dev.yml # 开发环境配置(新建)
├── application-prod.yml # 生产环境配置(重写,支持环境变量)
├── application-druid.yml # Druid数据源配置更新支持环境变量
├── application-prod.yml.backup # 原配置备份
├── application-deploy.yml.backup # 原配置备份
└── application-test.yml # 测试环境配置(可选,未创建)
项目根目录/
└── .env.example # 环境变量模板(新建)
```
---
## 🔧 各配置文件职责
### 1. application.yml公共配置
**职责**: 所有环境共享的基础配置
**包含内容**:
- 项目信息qaup.name, version等
- 用户配置user.password
- Token配置token.header, secret等
- MyBatis配置
- PageHelper配置
- SpringDoc配置
- XSS防护配置
- Flyway配置
- JPA配置
- 数据采集端点配置固定的API端点路径
- 红绿灯系统配置(固定部分)
- 坐标系统配置
- 管理端点配置
**不包含**:
- 服务器配置port, threads等
- 数据库连接信息
- Redis连接信息
- API基础URL和认证信息
- 日志级别
- 环境特定功能(如热部署)
**默认激活profile**: `dev,druid`
---
### 2. application-dev.yml开发环境配置
**职责**: 本地开发环境专属配置
**包含内容**:
- 服务器配置
- port: 8080
- threads.max: 2000虚拟线程
- 热部署配置devtools
- Redis配置localhost:6379
- 日志级别debug
- 数据采集配置
- interval: 250ms
- airport-api.base-url: http://localhost:8090
- vehicle-api.base-url: http://localhost:8091
**使用方式**:
```bash
# IDEA中默认启动即可application.yml中默认激活dev
# 或显式指定
-Dspring.profiles.active=dev,druid
```
---
### 3. application-prod.yml生产环境配置
**职责**: 生产环境专属配置 + 环境变量支持
**包含内容**(所有关键配置支持环境变量):
- 服务器配置
- port: ${SERVER_PORT:8080}
- threads.max: 800生产环境优化
- Redis配置环境变量
- host: ${REDIS_HOST:localhost}
- port: ${REDIS_PORT:6379}
- password: ${REDIS_PASSWORD:}
- 日志级别(环境变量)
- com.qaup: ${LOG_LEVEL_QAUP:info}
- 数据采集配置(环境变量)
- airport-api.base-url: ${AIRPORT_API_BASE_URL:http://localhost:8090}
- airport-api.auth.username: ${AIRPORT_API_USERNAME:dianxin}
- airport-api.auth.password: ${AIRPORT_API_PASSWORD:dianxin@123}
- vehicle-api.base-url: ${VEHICLE_API_BASE_URL:http://localhost:8091}
**使用方式**:
```bash
# 启动时指定profile
java -jar qaup-admin.jar --spring.profiles.active=prod,druid
# 或在 qaup.sh 中配置
nohup java $JVM_OPTS -jar $AppName --spring.profiles.active=prod,druid > /dev/null 2>&1 &
```
---
### 4. application-druid.ymlDruid数据源配置
**职责**: Druid连接池配置
**更新内容**: 主库数据源支持环境变量
```yaml
master:
url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:qaup}?...
username: ${DB_USERNAME:postgres}
password: ${DB_PASSWORD:123456}
```
**其他配置保持不变**:
- 连接池参数
- Druid监控配置
- SQL监控配置
---
### 5. .env.example环境变量模板
**职责**: 环境变量配置模板
**使用流程**:
```bash
# 1. 复制模板
cp .env.example .env
# 2. 修改配置
vim .env
# 3. 启动应用qaup.sh会自动加载.env
./qaup.sh start
```
**包含的环境变量**:
- 数据库配置DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD
- Redis配置REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
- API配置AIRPORT_API_BASE_URL, VEHICLE_API_BASE_URL等
- 日志配置LOG_LEVEL_QAUP, LOG_LEVEL_SPRING
- 其他可选配置
---
## 🚀 使用指南
### 开发环境
#### 方式1: 默认启动(推荐)
```bash
# 在IDEA中直接启动自动使用dev配置
# application.yml 默认激活: dev,druid
```
#### 方式2: 显式指定
```bash
# IDEA Run/Debug Configurations
VM options: -Dspring.profiles.active=dev,druid
```
#### 方式3: 命令行启动
```bash
cd qaup-admin
mvn spring-boot:run -Dspring-boot.run.profiles=dev,druid
```
---
### 生产环境
#### Step 1: 创建环境变量文件
```bash
# 在jar包部署目录
cp .env.example .env
# 编辑配置
vim .env
```
示例 `.env` 文件:
```bash
# 数据库配置
DB_HOST=192.168.1.100
DB_PORT=5432
DB_NAME=qaup_prod
DB_USERNAME=qaup_user
DB_PASSWORD=SecurePassword123
# Redis配置
REDIS_HOST=192.168.1.101
REDIS_PORT=6379
REDIS_PASSWORD=redis_password
# API配置
AIRPORT_API_BASE_URL=http://192.168.1.102:8090
AIRPORT_API_USERNAME=prod_user
AIRPORT_API_PASSWORD=prod_pass
VEHICLE_API_BASE_URL=http://192.168.1.103:8091
```
#### Step 2: 更新启动脚本(待实施)
**⚠️ 重要**: 目前 `qaup.sh` 还未更新,需要手动添加环境变量加载功能。
完整的启动脚本更新方案请参考:[环境变量配置方案](./20250110_环境变量配置方案.md#step-2-修改启动脚本-qaupsh)
**关键修改点**
```bash
# 在 qaup.sh 开头添加
ENV_FILE=$APP_HOME/.env
# 在 start() 函数中添加环境变量加载
if [ -f "$ENV_FILE" ]; then
echo "Loading environment variables from $ENV_FILE"
export $(cat $ENV_FILE | grep -v '^#' | grep -v '^$' | xargs)
echo "Environment variables loaded successfully"
else
echo "Warning: $ENV_FILE not found, using default configuration"
fi
```
#### Step 3: 启动应用
```bash
# 方式1: 使用更新后的 qaup.sh推荐
./qaup.sh start
# qaup.sh 需要在启动命令中指定 profile
nohup java $JVM_OPTS -jar $AppName --spring.profiles.active=prod,druid > /dev/null 2>&1 &
# 方式2: 手动指定(用于测试)
java -jar qaup-admin.jar --spring.profiles.active=prod,druid
```
#### Step 4: 修改配置
```bash
# 1. 编辑 .env
vim .env
# 2. 重启应用
./qaup.sh restart
# 完成无需重新打包jar
```
---
## 📊 配置加载优先级
Spring Boot配置加载优先级从高到低:
1. **命令行参数** - 最高优先级
2. **操作系统环境变量** ⭐ **本方案使用**
3. `config/application-{profile}.yml`(外部)
4. `config/application.yml`(外部)
5. `classpath:application-{profile}.yml`jar内 ⭐ **本方案使用**
6. `classpath:application.yml`jar内 ⭐ **本方案使用**
### 实际加载顺序示例
**开发环境**:
```
1. application.yml (公共配置)
2. application-dev.yml (开发环境配置,覆盖公共配置)
3. application-druid.yml (Druid配置合并)
```
**生产环境**:
```
1. application.yml (公共配置)
2. application-prod.yml (生产环境配置,覆盖公共配置)
3. application-druid.yml (Druid配置合并)
4. 环境变量 (覆盖配置文件中的${VAR:default}值)
```
---
## ✅ 验证配置
### 验证开发环境
```bash
# 启动应用
cd qaup-admin
mvn spring-boot:run
# 检查日志
# 应该看到: The following 2 profiles are active: "dev", "druid"
# 验证配置值
# 数据库: localhost:5432
# Redis: localhost:6379
# API: http://localhost:8090, http://localhost:8091
# 日志级别: debug
```
### 验证生产环境
```bash
# 1. 查看环境变量加载
./qaup.sh start
# 应该看到: Loading environment variables from /path/to/.env
# 2. 检查应用日志
tail -f logs/qaup-admin.jar.log | grep "profiles are active"
# 应该看到: The following 2 profiles are active: "prod", "druid"
# 3. 验证配置值(查看日志中的连接信息)
tail -f logs/qaup-admin.jar.log | grep -E "airport|vehicle|jdbc"
```
---
## 🔄 配置迁移对比
### 迁移前后对比
| 配置项 | 重构前 | 重构后 |
|-------|--------|--------|
| **开发环境配置** | application.yml | application-dev.yml |
| **生产环境配置** | application-prod.yml | application-prod.yml重写 |
| **公共配置** | 分散在各文件 | application.yml集中 |
| **环境变量支持** | ❌ 无 | ✅ 有 |
| **配置修改** | ❌ 需重新打包 | ✅ 修改.env即可 |
| **配置重复** | ❌ 大量重复 | ✅ 无重复 |
| **环境切换** | ❌ 修改文件 | ✅ 切换profile |
---
## 🔒 安全建议
### 1. 保护敏感信息
```bash
# .env文件权限只有owner可读写
chmod 600 .env
# Git忽略
echo ".env" >> .gitignore
echo "*.env" >> .gitignore
echo "!.env.example" >> .gitignore
```
### 2. 配置备份
```bash
# 备份当前配置
cp .env .env.backup-$(date +%Y%m%d-%H%M%S)
# 定期备份添加到crontab
0 2 * * * cp /app/.env /app/config/.env.backup-$(date +\%Y\%m\%d)
```
### 3. 配置审计
```bash
# 记录配置变更
cat > config/CHANGELOG.md << EOF
# 配置变更记录
## 2025-01-10 14:00
- 初始化生产环境配置
- 操作人: xxx
- 原因: 配置重构
EOF
```
---
## 🆚 环境对比表
| 配置项 | 开发环境(dev) | 生产环境(prod) |
|-------|-------------|---------------|
| **Server Port** | 8080 | ${SERVER_PORT:8080} |
| **Threads** | 2000 | 800 |
| **数据库** | localhost:5432 | ${DB_HOST}:${DB_PORT} |
| **Redis** | localhost:6379 | ${REDIS_HOST}:${REDIS_PORT} |
| **Airport API** | localhost:8090 | ${AIRPORT_API_BASE_URL} |
| **Vehicle API** | localhost:8091 | ${VEHICLE_API_BASE_URL} |
| **日志级别** | debug | info |
| **热部署** | ✅ enabled | ❌ disabled |
| **SQL打印** | ✅ 打印 | ❌ 不打印 |
---
## 📝 常见问题
### Q1: 为什么开发环境配置值保持不变?
**A**: 为了确保现有开发流程不受影响,`application-dev.yml` 的所有配置值与原 `application.yml` 完全一致。开发人员无需修改任何配置即可正常工作。
---
### Q2: 环境变量未生效怎么办?
**A**: 检查以下几点:
1. `.env` 文件格式是否正确(无空格、无引号)
2. 是否执行了 `./qaup.sh restart`
3. `qaup.sh` 是否已更新(包含加载环境变量的代码)
4. 查看启动日志确认是否加载了 `.env`
---
### Q3: 如何回滚配置?
**A**:
```bash
# 方式1: 恢复备份的.env
cp .env.backup-20250110-120000 .env
./qaup.sh restart
# 方式2: 恢复原配置文件(需要重新打包)
cp application-prod.yml.backup application-prod.yml
# 重新打包部署
```
---
### Q4: 如何添加新的环境变量?
**A**:
```bash
# 1. 在 application-prod.yml 中添加占位符
new-config:
value: ${NEW_CONFIG_VALUE:default}
# 2. 在 .env 中添加变量
NEW_CONFIG_VALUE=actual_value
# 3. 更新 .env.example
NEW_CONFIG_VALUE=default_value
# 4. 重启应用
./qaup.sh restart
```
---
### Q5: 可以继续使用原来的配置吗?
**A**: 可以,原配置已备份为 `.backup` 文件:
- `application-prod.yml.backup`
- `application-deploy.yml.backup`
如需恢复:
```bash
cp application-prod.yml.backup application-prod.yml
```
---
## ⚠️ 下一步工作(必须完成)
### 1. 更新启动脚本 qaup.sh
**当前状态**: ❌ 未完成
**任务**: 为 `qaup.sh` 添加环境变量加载功能和 profile 指定
**参考文档**: [环境变量配置方案 - Step 2](./20250110_环境变量配置方案.md#step-2-修改启动脚本-qaupsh)
**关键修改**:
1. 添加 `ENV_FILE` 变量定义
2. 在 `start()` 函数中加载 `.env` 文件
3. 在启动命令中添加 `--spring.profiles.active=prod,druid`
### 2. 测试验证
**开发环境测试**:
```bash
# 1. 在IDEA中启动应用
# 2. 检查启动日志确认使用 dev profile
# 3. 验证配置值正确localhost:8090/8091
```
**生产环境测试**(打包后):
```bash
# 1. 打包应用
mvn clean package -DskipTests
# 2. 创建 .env 文件
cp .env.example .env
# 3. 测试启动(需要先更新 qaup.sh
./qaup.sh start
# 4. 验证配置加载正确
```
### 3. 更新项目文档
**需要更新的文件**:
- `README.md` - 添加配置管理说明
- `CLAUDE.md` - 更新配置文件说明
- 部署文档 - 添加环境变量配置步骤
---
## 🎯 后续优化建议
### 短期优化
1. **配置校验**: 添加启动前配置校验脚本
2. **配置加密**: 敏感信息使用加密存储
3. **配置文档**: 完善各环境配置说明
4. **CI/CD集成**: 在部署流程中自动生成 `.env` 文件
### 长期规划
1. **配置中心**: 引入Nacos/Apollo实现配置热更新
2. **多环境扩展**: 添加测试环境、预发布环境配置
3. **配置版本管理**: 建立配置变更审批流程
4. **配置审计**: 记录所有配置变更历史
---
## 📚 相关文档
- [环境变量配置方案](./20250110_环境变量配置方案.md)
- [Spring Boot配置文档](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config)
- [CLAUDE.md - 项目说明](../../CLAUDE.md)
---
## 📞 支持
如有问题,请联系:
- 开发团队
- 查看项目文档:`doc/working/`
---
**文档结束**
**最后更新**: 2025-01-10
**文档版本**: v1.0
**维护者**: QAUP Team

138
doc/working/README.md Normal file
View File

@ -0,0 +1,138 @@
# 工作文档目录
本目录包含QAUP项目的工作文档、设计方案和配置说明。
---
## 📋 文档列表
### 配置管理相关
#### 1. [配置文件重构说明](./20250110_配置文件重构说明.md) ⭐ **主文档**
**状态**: 🔄 配置文件已完成,启动脚本待更新
**内容**:
- 配置文件重构完整说明
- 开发/生产环境配置分离方案
- 环境变量支持方案
- 使用指南和FAQ
**适用场景**:
- 了解配置文件结构
- 开发环境配置说明
- 生产环境部署指南
#### 2. [环境变量配置方案](./20250110_环境变量配置方案.md)
**状态**: ✅ 完整方案文档
**内容**:
- 环境变量原理和使用方式
- 启动脚本修改详细步骤
- `.env` 文件管理最佳实践
- 故障排查指南
**适用场景**:
- 生产环境部署
- 配置修改操作
- 启动脚本更新参考
### 功能设计相关
#### 3. [任务清单接口设计方案](./20250110_任务清单接口设计方案.md)
**状态**: 📝 设计方案(待实施)
**内容**:
- 任务清单接口API设计
- 数据结构定义
- Mock服务实现方案
- 5个任务模板示例
**适用场景**:
- 无人车任务管理功能开发
- Mock服务扩展
---
## 🚀 快速导航
### 场景1: 开发环境配置
1. 阅读 [配置文件重构说明 - 开发环境](./20250110_配置文件重构说明.md#开发环境)
2. 在IDEA中直接启动即可默认使用dev配置
### 场景2: 生产环境部署
1. 阅读 [配置文件重构说明 - 生产环境](./20250110_配置文件重构说明.md#生产环境)
2. 参考 [环境变量配置方案](./20250110_环境变量配置方案.md) 更新启动脚本
3. 创建 `.env` 文件并配置环境变量
4. 启动应用
### 场景3: 修改生产环境配置
1. 编辑 `.env` 文件
2. 执行 `./qaup.sh restart`
3. 无需重新打包jar
### 场景4: 实现任务清单功能
1. 阅读 [任务清单接口设计方案](./20250110_任务清单接口设计方案.md)
2. 按照方案实施
---
## ⚠️ 当前待完成工作
### 高优先级
1. **更新启动脚本 qaup.sh**
- 添加环境变量加载功能
- 添加 profile 指定
- 参考: [环境变量配置方案 - Step 2](./20250110_环境变量配置方案.md#step-2-修改启动脚本-qaupsh)
2. **测试验证配置重构**
- 开发环境启动测试
- 生产环境打包测试
- 环境变量加载测试
### 中优先级
3. **更新项目文档**
- 更新 `README.md`
- 更新 `CLAUDE.md`
- 添加部署文档
4. **实现任务清单接口**
- 在 `mock_unmanned_vehicle.py` 中实现
- 测试验证
---
## 📚 相关资源
### 项目文档
- [CLAUDE.md](../../CLAUDE.md) - 项目总体说明
- [README.md](../../README.md) - 项目介绍
### Spring Boot官方文档
- [外部化配置](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config)
- [配置属性](https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html)
---
## 📝 文档版本记录
| 日期 | 文档 | 版本 | 说明 |
|-----|------|------|------|
| 2025-01-10 | 配置文件重构说明 | v1.0 | 初版 |
| 2025-01-10 | 环境变量配置方案 | v1.0 | 初版 |
| 2025-01-10 | 任务清单接口设计方案 | v1.0 | 初版 |
---
**最后更新**: 2025-01-10
**维护者**: QAUP Team

View File

@ -85,7 +85,7 @@ spring:
data:
redis:
# 地址
host: 172.17.0.4
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
@ -203,7 +203,7 @@ data:
interval: 1000
# 机场数据源配置
airport-api:
base-url: http://10.64.58.228:8090
base-url: http://localhost:8090
endpoints:
login: /login
refresh: /userInfoController/refreshToken
@ -219,7 +219,7 @@ data:
password: dianxin@123
# 无人车厂商数据源配置
vehicle-api:
base-url: http://10.64.58.228:8091
base-url: http://localhost:8091
endpoints:
vehicle-command: /api/VehicleCommandInfo
# 通用车辆状态API端点符合universal_autonomous_vehicle_api规范

View File

@ -0,0 +1,89 @@
# ============================================================
# QAUP 开发环境配置
# 用于本地开发,包含开发专用功能和本地服务地址
# 从原 application.yml 提取的开发环境配置
# ============================================================
# 服务器配置
server:
# 服务器的HTTP端口默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数默认为100
accept-count: 2000
# 使用JDK21虚拟线程不需要限制线程数
threads:
# 虚拟线程模式下可以处理更多请求
max: 2000
# Tomcat启动初始化的线程数
min-spare: 50
# Spring配置
spring:
# 服务模块 - 开发环境热部署
devtools:
restart:
# 热部署开关
enabled: true
# 重启目录
additional-paths: src/main/java
# 排除目录
exclude: WEB-INF/**
# Redis配置 - 开发环境
data:
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 日志配置 - 开发环境(详细日志)
logging:
level:
com.qaup: debug
org.springframework: warn
# 数据采集配置 - 开发环境
data:
collector:
# 数据采集间隔,单位:毫秒(高频采集保证数据新鲜度)
interval: 250
# 检测和推送间隔配置
detection:
# 检测间隔单位毫秒控制围栏检测、冲突检测、违规检测和WebSocket推送频率
interval: 1000
# 机场数据源配置 - 开发环境
airport-api:
base-url: http://localhost:8090
auth:
username: dianxin
password: dianxin@123
# 无人车厂商数据源配置 - 开发环境
vehicle-api:
base-url: http://localhost:8091
timeout: 1000
retry-attempts: 3

View File

@ -4,18 +4,18 @@ spring:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
druid:
# 主库数据源
# 主库数据源(支持环境变量)
master:
url: jdbc:postgresql://localhost:5432/qaup?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: postgres
password: 123456
url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:qaup}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: ${DB_USERNAME:postgres}
password: ${DB_PASSWORD:123456}
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
@ -39,7 +39,7 @@ spring:
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
@ -58,4 +58,4 @@ spring:
merge-sql: true
wall:
config:
multi-statement-allow: true
multi-statement-allow: true

View File

@ -1,9 +1,12 @@
# 本地生产环境配置
# 用于在本地测试生产环境配置
# ============================================================
# QAUP 生产环境配置
# 关键配置项支持环境变量覆盖
# 使用方式:创建 .env 文件,通过启动脚本加载环境变量
# ============================================================
# 服务器配置
server:
port: 8080
port: ${SERVER_PORT:8080}
servlet:
context-path: /
tomcat:
@ -15,52 +18,13 @@ server:
# Spring配置
spring:
# 数据源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
druid:
master:
url: jdbc:postgresql://localhost:5432/qaup?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: postgres
password: 123456
slave:
enabled: false
# Druid连接池配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
connectTimeout: 30000
socketTimeout: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 900000
validationQuery: SELECT version()
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 监控配置
webStatFilter:
enabled: true
statViewServlet:
enabled: true
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 2000
merge-sql: true
wall:
config:
multi-statement-allow: true
# Redis配置
# Redis配置支持环境变量
data:
redis:
host: localhost
port: 6379
database: 0
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:}
timeout: 10s
lettuce:
pool:
@ -69,189 +33,39 @@ spring:
max-active: 8
max-wait: -1ms
# Flyway数据库迁移配置
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
baseline-version: 1.0.0
baseline-description: "Initial baseline from existing database"
validate-on-migrate: true
clean-disabled: true
out-of-order: false
encoding: UTF-8
placeholder-replacement: false
# JPA配置
jpa:
hibernate:
ddl-auto: none
show-sql: false
properties:
hibernate:
format_sql: false
jdbc:
lob:
non_contextual_creation: true
batch_size: 50
fetch_size: 50
cache:
use_second_level_cache: false
use_query_cache: false
order_inserts: true
order_updates: true
batch_versioned_data: true
generate_statistics: false
# 资源信息
messages:
basename: i18n/messages
# 文件上传
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
# Jackson配置
jackson:
date-format: yyyy-MM-dd HH:mm:ss
serialization:
indent_output: false
fail_on_empty_beans: false
deserialization:
fail_on_unknown_properties: false
# 项目配置
qaup:
name: QAUP
version: 1.0.1
copyrightYear: 2025
profile: /tmp/qaup/uploadPath
addressEnabled: false
captchaType: math
# 用户配置
user:
password:
maxRetryCount: 5
lockTime: 10
# Token配置
token:
header: Authorization
secret: abcdefghijklmnopqrstuvwxyz
expireTime: 30
# MyBatis配置
mybatis:
typeAliasesPackage: com.qaup.system.domain,com.qaup.common.core.domain.entity,com.qaup.generator.domain,com.qaup.quartz.domain,com.qaup.collision.common.model.spatial,com.qaup.collision.datacollector.model.dto,com.qaup.collision.geofence.model.entity
mapperLocations: classpath*:mapper/**/*Mapper.xml
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: postgresql
reasonable: true
supportMethodsArguments: true
params: count=countSql
# 日志配置
# 日志配置(生产环境简洁日志)
logging:
level:
com.qaup: info
org.springframework: warn
com.qaup: ${LOG_LEVEL_QAUP:info}
org.springframework: ${LOG_LEVEL_SPRING:warn}
org.hibernate: warn
com.alibaba.druid: warn
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
# XSS防护
xss:
enabled: true
excludes: /system/notice
urlPatterns: /system/*,/monitor/*,/tool/*
# 数据采集配置
# 数据采集配置(支持环境变量)
data:
collector:
interval: 250
interval: ${DATA_COLLECTOR_INTERVAL:250}
detection:
interval: 1000
interval: ${DATA_DETECTION_INTERVAL:1000}
# 机场数据源配置(支持环境变量)
airport-api:
base-url: http://localhost:8090
endpoints:
login: /login
refresh: /userInfoController/refreshToken
aircraft: /openApi/getCurrentFlightPositions
vehicle: /openApi/getCurrentVehiclePositions
arrival-route: /runwayPathPlanningController/findArrTaxiwayByRunwayAndContactCrossAndSeat
departure-route: /runwayPathPlanningController/findDepTaxiwayByRunwayAndContactCrossAndSeat
aircraft-status: /aircraftStatusController/getAircraftStatus
base-url: ${AIRPORT_API_BASE_URL:http://localhost:8090}
auth:
username: dianxin
password: dianxin@123
username: ${AIRPORT_API_USERNAME:dianxin}
password: ${AIRPORT_API_PASSWORD:dianxin@123}
# 无人车厂商数据源配置(支持环境变量)
vehicle-api:
base-url: http://localhost:8091
endpoints:
vehicle-command: /api/VehicleCommandInfo
universal-status: /api/v1/vehicles/{vehicleId}/status
timeout: 1000
retry-attempts: 3
unmanned-vehicle:
persistence:
enabled: true
batch-size: 50
location-retention-days: 90
command-retention-days: 365
command:
timeout: 1000
retry-attempts: 3
validation:
enabled: true
strict-mode: false
retention:
redis-expire-seconds: 60
postgresql-days: 30
base-url: ${VEHICLE_API_BASE_URL:http://localhost:8091}
timeout: ${VEHICLE_API_TIMEOUT:1000}
retry-attempts: ${VEHICLE_API_RETRY:3}
# 红绿灯系统配置
traffic:
light:
tcp:
enabled: true
port: 8082
max-connections: 50
connection-timeout: 30000
heartbeat-timeout-minutes: 5
intersection:
default-id: "DEFAULT_INTERSECTION"
processing:
enable-statistics: true
statistics-interval: 60000
enable-debug-log: false
signal-process-timeout: 5000
# 坐标系统配置
coordinate-system:
airport:
center-longitude: 120.0834104
center-latitude: 36.35406879
# 管理端点配置
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
metrics:
export:
simple:
enabled: true
enable:
hikari: true
jvm: true
jmx:
enabled: true
enabled: ${TRAFFIC_LIGHT_TCP_ENABLED:true}
port: ${TRAFFIC_LIGHT_TCP_PORT:8082}

View File

@ -1,3 +1,9 @@
# ============================================================
# QAUP 公共配置文件
# 适用于所有环境dev/test/prod
# 环境特定配置请在 application-{profile}.yml 中定义
# ============================================================
# 项目相关配置
qaup:
# 名称
@ -13,31 +19,6 @@ qaup:
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数默认为100
accept-count: 2000
# 使用JDK21虚拟线程不需要限制线程数
threads:
# 虚拟线程模式下可以处理更多请求
max: 2000
# Tomcat启动初始化的线程数
min-spare: 50
# 日志配置
logging:
level:
com.qaup: debug
org.springframework: warn
# 用户配置
user:
password:
@ -46,14 +27,17 @@ user:
# 密码锁定时间默认10分钟
lockTime: 10
# Spring配置
# Spring公共配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
# 默认激活的profile开发环境
profiles:
active: dev,druid
# 文件上传
servlet:
multipart:
@ -61,15 +45,8 @@ spring:
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# 重启目录
additional-paths: src/main/java
# 排除目录
exclude: WEB-INF/**
# Jackson配置
jackson:
# 日期格式化
date-format: yyyy-MM-dd HH:mm:ss
@ -81,32 +58,9 @@ spring:
deserialization:
# 允许对象忽略json中不存在的属性
fail_on_unknown_properties: false
# redis 配置
data:
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# ==================== CollisionAvoidanceSystem 配置整合 ====================
# Flyway数据库迁移配置
flyway:
# 启用Flyway
@ -127,7 +81,7 @@ spring:
encoding: UTF-8
# 占位符配置
placeholder-replacement: false
# JPA配置collision模块空间数据处理
jpa:
hibernate:
@ -168,11 +122,11 @@ mybatis:
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
pagehelper:
helperDialect: postgresql
reasonable: true
supportMethodsArguments: true
params: count=countSql
params: count=countSql
# SpringDoc 配置
springdoc:
@ -192,18 +146,11 @@ xss:
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# 数据采集配置collision模块
# 数据采集端点配置(固定不变的部分
data:
collector:
# 数据采集间隔,单位:毫秒(高频采集保证数据新鲜度)
interval: 250
# 检测和推送间隔配置
detection:
# 检测间隔单位毫秒控制围栏检测、冲突检测、违规检测和WebSocket推送频率
interval: 1000
# 机场数据源配置
# 机场数据源端点配置
airport-api:
base-url: http://localhost:8090
endpoints:
login: /login
refresh: /userInfoController/refreshToken
@ -214,18 +161,13 @@ data:
aircraft-status: /aircraftStatusController/getAircraftStatus
flight-notification: /openApi/getInboundAndOutboundFlightsNotification
auth:
username: dianxin
password: dianxin@123
# 无人车厂商数据源配置
# 无人车厂商端点配置
vehicle-api:
base-url: http://localhost:8091
endpoints:
vehicle-command: /api/VehicleCommandInfo
# 通用车辆状态API端点符合universal_autonomous_vehicle_api规范
universal-status: /api/v1/vehicles/{vehicleId}/status
timeout: 1000
retry-attempts: 3
# 无人车数据持久化配置
unmanned-vehicle:
persistence:
@ -239,6 +181,8 @@ data:
validation:
enabled: true
strict-mode: false
# 数据保留策略
retention:
redis-expire-seconds: 60
postgresql-days: 30
@ -257,11 +201,11 @@ traffic:
connection-timeout: 30000
# 心跳超时时间(分钟)
heartbeat-timeout-minutes: 5
intersection:
# 默认路口ID当信号中没有指定时使用
default-id: "DEFAULT_INTERSECTION"
processing:
# 是否启用统计功能
enable-statistics: true

74
qaup.sh
View File

@ -3,10 +3,19 @@
AppName=qaup-admin.jar
# JVM参数
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
# 应用目录和日志路径
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log
# 环境变量配置文件路径
ENV_FILE=$APP_HOME/.env
# Spring Profile配置生产环境使用prod开发环境使用dev
# 可通过环境变量 SPRING_PROFILES_ACTIVE 覆盖,默认为 prod,druid
SPRING_PROFILES=${SPRING_PROFILES_ACTIVE:-prod,druid}
if [ "$1" = "" ];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
@ -23,36 +32,51 @@ function start()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
else
nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 &
echo "Start $AppName success..."
fi
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
else
# ========== 加载环境变量配置 ==========
if [ -f "$ENV_FILE" ]; then
echo "Loading environment variables from $ENV_FILE"
# 导出环境变量,忽略注释行和空行
export $(cat $ENV_FILE | grep -v '^#' | grep -v '^$' | xargs)
echo "Environment variables loaded successfully"
else
echo "Warning: $ENV_FILE not found, using default configuration"
fi
# ========================================
echo "Starting $AppName with profile: $SPRING_PROFILES"
# 启动应用指定Spring Profile
nohup java $JVM_OPTS -jar $AppName --spring.profiles.active=$SPRING_PROFILES > /dev/null 2>&1 &
echo "Start $AppName success..."
fi
}
function stop()
{
echo "Stop $AppName"
PID=""
query(){
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
}
PID=""
query(){
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
}
query
if [ x"$PID" != x"" ]; then
kill -TERM $PID
echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ]
do
sleep 1
query
done
echo "$AppName exited."
else
echo "$AppName already stopped."
fi
query
if [ x"$PID" != x"" ]; then
kill -TERM $PID
echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ]
do
sleep 1
query
done
echo "$AppName exited."
else
echo "$AppName already stopped."
fi
}
function restart()
@ -82,5 +106,5 @@ case $1 in
status)
status;;
*)
echo -e "\033[0;31m 未知操作 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
esac