增加了开发和生产环境的配置文件,在生产环境使用环境变量设置参数
This commit is contained in:
parent
4978c9ffaf
commit
11d677d95a
64
.env.example
Normal file
64
.env.example
Normal 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 使配置生效
|
||||
# ============================================================
|
||||
@ -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
|
||||
```
|
||||
293
doc/guide/配置重构后的编译说明.md
Normal file
293
doc/guide/配置重构后的编译说明.md
Normal 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
|
||||
345
doc/working/20250110_qaup.sh更新说明.md
Normal file
345
doc/working/20250110_qaup.sh更新说明.md
Normal 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
|
||||
812
doc/working/20250110_环境变量配置方案.md
Normal file
812
doc/working/20250110_环境变量配置方案.md
Normal 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
|
||||
594
doc/working/20250110_配置文件重构说明.md
Normal file
594
doc/working/20250110_配置文件重构说明.md
Normal 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.yml(Druid数据源配置)
|
||||
|
||||
**职责**: 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
138
doc/working/README.md
Normal 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
|
||||
@ -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规范)
|
||||
89
qaup-admin/src/main/resources/application-dev.yml
Normal file
89
qaup-admin/src/main/resources/application-dev.yml
Normal 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
|
||||
@ -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
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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
74
qaup.sh
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user