From 11d677d95af13ecd2721870c6678845da14d3370 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Thu, 9 Oct 2025 16:53:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E5=92=8C=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=E5=9C=A8=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=BD=BF=E7=94=A8=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E8=AE=BE=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 64 ++ doc/guide/commands.md | 34 +- doc/guide/配置重构后的编译说明.md | 293 +++++++ doc/working/20250110_qaup.sh更新说明.md | 345 ++++++++ doc/working/20250110_环境变量配置方案.md | 812 ++++++++++++++++++ doc/working/20250110_配置文件重构说明.md | 594 +++++++++++++ doc/working/README.md | 138 +++ ...cation-deploy.yml => application copy.yml} | 6 +- .../src/main/resources/application-dev.yml | 89 ++ .../src/main/resources/application-druid.yml | 18 +- .../src/main/resources/application-prod.yml | 244 +----- qaup-admin/src/main/resources/application.yml | 106 +-- qaup.sh | 74 +- 13 files changed, 2474 insertions(+), 343 deletions(-) create mode 100644 .env.example create mode 100644 doc/guide/配置重构后的编译说明.md create mode 100644 doc/working/20250110_qaup.sh更新说明.md create mode 100644 doc/working/20250110_环境变量配置方案.md create mode 100644 doc/working/20250110_配置文件重构说明.md create mode 100644 doc/working/README.md rename qaup-admin/src/main/resources/{application-deploy.yml => application copy.yml} (98%) create mode 100644 qaup-admin/src/main/resources/application-dev.yml diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..6ecc7eae --- /dev/null +++ b/.env.example @@ -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 使配置生效 +# ============================================================ diff --git a/doc/guide/commands.md b/doc/guide/commands.md index e359d1a2..b47fd8b6 100644 --- a/doc/guide/commands.md +++ b/doc/guide/commands.md @@ -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 ``` \ No newline at end of file diff --git a/doc/guide/配置重构后的编译说明.md b/doc/guide/配置重构后的编译说明.md new file mode 100644 index 00000000..ca1e569f --- /dev/null +++ b/doc/guide/配置重构后的编译说明.md @@ -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 +cp /.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 diff --git a/doc/working/20250110_qaup.sh更新说明.md b/doc/working/20250110_qaup.sh更新说明.md new file mode 100644 index 00000000..db515308 --- /dev/null +++ b/doc/working/20250110_qaup.sh更新说明.md @@ -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 diff --git a/doc/working/20250110_环境变量配置方案.md b/doc/working/20250110_环境变量配置方案.md new file mode 100644 index 00000000..51623d3e --- /dev/null +++ b/doc/working/20250110_环境变量配置方案.md @@ -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 使配置生效 +# ============================================================ +``` + +**设置文件权限**(推荐��: + +```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 +``` + +--- + +## 📊 方案对比 + +### 与其他方案的对比 + +| ��性 | 环境变量方案 | 外部配置文件 | 配置中心 | +|-----|------------|------------|---------| +| 修改便捷性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| 无需重新打包 | ✅ | ✅ | ✅ | +| 是否需要重启 | ✅ 需要 | ✅ 需要 | ❌ 不需要 | +| 实施复杂度 | 简单 | 简单 | 中等 | +| 适用场景 | 生产环境 | 生产环境 | 企业级/微服务 | +| 成本 | 无 | 无 | 需要额外服务 | + +--- + +## 🎯 总结 + +### 优点 + +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 diff --git a/doc/working/20250110_配置文件重构说明.md b/doc/working/20250110_配置文件重构说明.md new file mode 100644 index 00000000..d28fad80 --- /dev/null +++ b/doc/working/20250110_配置文件重构说明.md @@ -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 diff --git a/doc/working/README.md b/doc/working/README.md new file mode 100644 index 00000000..0fca22c3 --- /dev/null +++ b/doc/working/README.md @@ -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 diff --git a/qaup-admin/src/main/resources/application-deploy.yml b/qaup-admin/src/main/resources/application copy.yml similarity index 98% rename from qaup-admin/src/main/resources/application-deploy.yml rename to qaup-admin/src/main/resources/application copy.yml index 52a58426..655f1f0f 100644 --- a/qaup-admin/src/main/resources/application-deploy.yml +++ b/qaup-admin/src/main/resources/application copy.yml @@ -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规范) diff --git a/qaup-admin/src/main/resources/application-dev.yml b/qaup-admin/src/main/resources/application-dev.yml new file mode 100644 index 00000000..46a88551 --- /dev/null +++ b/qaup-admin/src/main/resources/application-dev.yml @@ -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 diff --git a/qaup-admin/src/main/resources/application-druid.yml b/qaup-admin/src/main/resources/application-druid.yml index a7a2e067..3b730271 100644 --- a/qaup-admin/src/main/resources/application-druid.yml +++ b/qaup-admin/src/main/resources/application-druid.yml @@ -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 \ No newline at end of file + multi-statement-allow: true diff --git a/qaup-admin/src/main/resources/application-prod.yml b/qaup-admin/src/main/resources/application-prod.yml index 5fd8079d..ac9344f9 100644 --- a/qaup-admin/src/main/resources/application-prod.yml +++ b/qaup-admin/src/main/resources/application-prod.yml @@ -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 \ No newline at end of file + enabled: ${TRAFFIC_LIGHT_TCP_ENABLED:true} + port: ${TRAFFIC_LIGHT_TCP_PORT:8082} diff --git a/qaup-admin/src/main/resources/application.yml b/qaup-admin/src/main/resources/application.yml index 655f1f0f..3e56dc29 100644 --- a/qaup-admin/src/main/resources/application.yml +++ b/qaup-admin/src/main/resources/application.yml @@ -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 diff --git a/qaup.sh b/qaup.sh index c70c623b..395f2e3d 100644 --- a/qaup.sh +++ b/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