日期:2026-09-26 模块:配置/打包(traffic-audit-server 配置分层 + .gitignore + 部署说明) 测试人:Codex
起因:检查部署包E:\试验\traffic-audit-deploy-20260913时发现——外层backend/application.yml是干净的占位版,但 jar 内置的BOOT-INF/classes/application.yml里带着真实密钥(DeepSeek API key、本机数据库口令、JWT 密钥)。
traffic-audit-server/src/main/resources/application.ymlspring.datasource.url: ${TRAFFIC_DB_URL:...}、username: ${TRAFFIC_DB_USER:root}、password: ${TRAFFIC_DB_PASSWORD:}(默认空)jwt.secret: ${TRAFFIC_JWT_SECRET:traffic-audit-dev-jwt-secret-change-me}deepseek.api-key: ${DEEPSEEK_API_KEY:}(默认空)traffic-audit-server/config/application.yml(保存数据库口令、JWT、DeepSeek key),file:./config/application.yml,优先级高于 classpath 的同名配置 → 本机 mvn spring-boot:run 行为不变。.gitignore(第 106 行),**既不进仓库、也不进 jar**。docs/打包部署说明.md 增加"密钥与配置"一节(含服务器上轮换 key 的步骤)。后端 mvn -q spring-boot:run -f traffic-audit-server/pom.xml(8090);MySQL 本机 localhost:3308/traffic_audit;账号 admin/123456。
| 编号 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC-1 | 启动后端(本机覆盖文件存在) | 正常启动 | 日志出现 Started TrafficAuditApplication |
通过 |
| TC-2 | POST /api/auth/login(admin/123456) |
库口令取自 config/application.yml |
登录成功、返回 token(若覆盖文件未生效,占位符默认空口令会连不上库) | 通过 |
| TC-3 | POST /api/llm/chat("只回复两个字:收到") |
DeepSeek key 取自 config/application.yml |
HTTP 200、回答"收到" | 通过 |
| TC-4 | 进 jar 的 application.yml 内容 |
无真实密钥 | 三处均为 ${...} 占位符(口令与 api-key 默认空) |
通过 |
| TC-5 | git check-ignore |
本机真实配置不进库 | .gitignore:106 traffic-audit-server/config/application.yml |
通过 |
| TC-6 | git grep -E "sk-[A-Za-z0-9]{16,}" |
跟踪文件里无密钥 | 无命中(另:09-23 前核查过 git 历史也无命中) | 通过 |
| TC-7 | 仓库内两份部署模板(deploy/.../backend/application.yml、_deploytest/application.yml) |
无真实密钥 | 均为「请改成你的数据库密码」+ api-key: "" |
通过 |
sk- 是因为被 zip 压缩,解压即见)。backend/application.yml 的 deepseek.api-key 换成新 key(或直接留空,AI 分析就不用);start-backend.cmd),在页面点一次 AI 分析确认可用。配置分层改造完成并通过 7 条用例:进 jar 的只有占位符,真实值仅存在于本机未跟踪文件或环境变量;本机开发与线上部署行为均未退化。轮换 key 的步骤已写入部署说明。
powershell setx TRAFFIC_DB_PASSWORD "本机 MySQL 口令" setx DEEPSEEK_API_KEY "DeepSeek key" traffic-audit-server/config/application.yml 改成"只有说明、无明文"的注释文件(值全部由环境变量提供)。HKCU\Environment 读取并注入后端进程,避免"文件里没有、环境变量也读不到"的空档。_shots/all_events.json | 13 处 |_dep_readme.txt | 1 处 |sk-REDACTED,复查全仓库**已无明文 key**。| 编号 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC-8 | start-dev.ps1(在未继承新变量的 shell 里) |
自动从注册表载入 | 输出"已从用户环境变量载入 TRAFFIC_DB_PASSWORD / DEEPSEEK_API_KEY" | 通过 |
| TC-9 | 启动后登录 admin/123456 |
库口令取自环境变量 | 登录成功、token 156 字符 | 通过 |
| TC-10 | POST /api/llm/chat |
key 取自环境变量 | HTTP 200、回答"收到" | 通过 |
| TC-11 | 全仓库扫描 sk-[A-Za-z0-9]{16,} |
无明文 | 清理后复查为 0 | 通过 |
| TC-12 | traffic-audit-server/config/application.yml |
无明文 | 仅注释说明(值走环境变量) | 通过 |
说明:环境变量本身仍是本机明文(存在注册表
HKCU\Environment),适合单机开发;协作/生产请用部署机外部配置或密钥管理工具。轮换 key 仍是根治泄露的唯一手段。
application.yml、start-backend.cmd/.sh、nginx.conf.example、README-部署说明.txt、db 的 4 个建表脚本)只存在未跟踪的旧部署包目录里,删包即丢、且不在版本库。deploy-templates/(可提交、已入库),pack-deploy.ps1 改为从该目录组装。pack-deploy.ps1:构建 jar → 解压自检(占位符校验,命中真实密钥或明文口令即中止) → 重建前端 → 组装完整部署包到 E:\试验\traffic-audit-deploy-<yyyyMMdd>。set-secrets.ps1:交互式更新 DEEPSEEK_API_KEY / TRAFFIC_DB_PASSWORD 用户环境变量(值不落文件)。| 删除对象 | 说明 |
|---|---|
E:\试验\traffic-audit-deploy-20260913(246 文件 / 81.5 MB) |
旧部署包目录(含带密钥 jar) |
E:\试验\traffic-audit-deploy-20260913.zip(69.9 MB) |
旧包压缩件(含带密钥 jar) |
deploy\traffic-audit-deploy-20260913(245 文件 / 81.5 MB) |
仓库内旧包副本 |
_deploytest(201 文件 / 78.1 MB) |
旧的部署测试目录 |
out(空目录)、deploy(清空后的空目录) |
无用空目录 |
traffic-audit-server\target\*.jar(旧) |
被 mvn clean 覆盖为新构建 |
注:这些目录里的文件带只读属性,
Remove-Item -Force被环境策略拦截,改为**先清属性再Remove-Item -Recurse**。
| 编号 | 检查 | 结果 |
|---|---|---|
| TC-13 | 新包 E:\试验\traffic-audit-deploy-20260927 |
336 文件 / 95.95 MB,含 backend(fresh jar+模板+docs)、frontend(dist+nginx 示例)、db、README |
| TC-14 | 新 jar 内置配置 | 全为 ${...} 占位符,含 sk- 明文: False |
| TC-15 | 新前端 dist | 含最新功能(rollupTypes / 「按市州汇总」) |
| TC-16 | 全盘复查(仓库 + E:\试验) |
内置配置带 key 的 jar:**无**;压缩包含 key:**无**;文本含 key:**无** |
| TC-17 | 一键打包脚本实跑 | 输出"[2/5] 去密自检…通过"并成功产出新包 |
唯一仍带明文 key 的地方是**用户环境变量**(设计如此,供本机开发用)与**已带出去/服务器上那份旧 jar**——后者需按第 4 节轮换 key 才算彻底。