chore(配置安全): 进 jar 的配置改为纯占位符/环境变量,本机真实值移至 gitignore 的 config/application.yml;部署说明补密钥分层与轮换步骤 + 测试报告与日结
2个文件已修改
2个文件已添加
120 ■■■■■ 已修改文件
.gitignore 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-26.md 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/打包部署说明.md 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -103,3 +103,4 @@
_tmp_codexhome/
# Codex åº”用在本仓库根目录产生的产物目录(保留在本地,不入库)
outputs/
traffic-audit-server/config/application.yml
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_ÃÜÔ¿Íⲿ»¯Óë´ò°üÈ¥ÃÜ_2026-09-26.md
New file
@@ -0,0 +1,46 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šå¯†é’¥å¤–éƒ¨åŒ–ä¸Žæ‰“åŒ…åŽ»å¯†ï¼ˆ2026-09-26)
> æ—¥æœŸï¼š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 å¯†é’¥ï¼‰ã€‚
## ä¸€ã€åŠŸèƒ½è¯´æ˜Žï¼ˆæ”¹åŠ¨ï¼‰
1. **进 jar çš„配置一律占位符**:`traffic-audit-server/src/main/resources/application.yml`
   - `spring.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:}`(默认空)
   â†’ æ‰“包出的 jar **不再包含任何真实密钥**。
2. **本机开发的真实值单独放**:新建 `traffic-audit-server/config/application.yml`(保存数据库口令、JWT、DeepSeek key),
   Spring Boot é»˜è®¤åŠ è½½ `file:./config/application.yml`,优先级高于 classpath çš„同名配置 â†’ æœ¬æœº `mvn spring-boot:run` è¡Œä¸ºä¸å˜ã€‚
   è¯¥æ–‡ä»¶å·²åŠ å…¥ `.gitignore`(第 106 è¡Œï¼‰ï¼Œ**既不进仓库、也不进 jar**。
3. **部署说明补充**:`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: ""` | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. **jar å†…置配置带真实密钥**(本次根因):Spring Boot å¤–部配置优先级更高,所以线上运行时用的是外部值、功能上没受影响;但 jar å¯è§£åŽ‹ï¼Œæ˜Žæ–‡å¯†é’¥å°±åœ¨é‡Œé¢ï¼ˆäºŒè¿›åˆ¶é‡Œæœä¸åˆ° `sk-` æ˜¯å› ä¸ºè¢« zip åŽ‹ç¼©ï¼Œè§£åŽ‹å³è§ï¼‰ã€‚
   â†’ å·²æŒ‰ä¸Šè¿°æ–¹æ¡ˆæ ¹æ²»ï¼š**以后打包不会再把密钥打进 jar**。
2. **已带出去的那份 jar æ— æ³•收回**:里面的 key ä»åœ¨ã€‚处置建议(必须做):
   - åˆ° DeepSeek æŽ§åˆ¶å°**新建一个 key å¹¶åˆ é™¤æ—§çš„**(旧 key ç«‹å³å¤±æ•ˆï¼Œjar é‡Œçš„那份就废了);
   - åŽ»é‚£å°æœåŠ¡å™¨ä¸ŠæŠŠå¤–éƒ¨ `backend/application.yml` çš„ `deepseek.api-key` æ¢æˆæ–° key(或直接留空,AI åˆ†æžå°±ä¸ç”¨ï¼‰ï¼›
   - é‡å¯åŽç«¯ï¼ˆ`start-backend.cmd`),在页面点一次 AI åˆ†æžç¡®è®¤å¯ç”¨ã€‚
3. æœ¬æœºæ•°æ®åº“ root å£ä»¤åŒæ ·åœ¨æ—§ jar é‡Œï¼šè‹¥é‚£å°æœåŠ¡å™¨ç”¨è¿‡åŒä¸€å£ä»¤ï¼Œå»ºè®®ä¸€å¹¶æ”¹æŽ‰ï¼ˆéƒ¨ç½²æ¨¡æ¿æœ¬æ¥å°±è¦æ±‚çŽ°åœºæ”¹ï¼‰ã€‚
## äº”、结论
配置分层改造完成并通过 7 æ¡ç”¨ä¾‹ï¼šè¿› jar çš„只有占位符,真实值仅存在于本机未跟踪文件或环境变量;本机开发与线上部署行为均未退化。轮换 key çš„æ­¥éª¤å·²å†™å…¥éƒ¨ç½²è¯´æ˜Žã€‚
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-26.md
New file
@@ -0,0 +1,38 @@
# å·¥ä½œæ—¥ç»“_2026-09-26
## ä¸€ã€ä»Šå¤©åšäº†ä»€ä¹ˆ
### 1. æ£€æŸ¥åŒäº‹æœ€è¿‘提交与部署包安全
- å…¬å¸ gitea `main` ä¸Žæœ¬åœ°ä¸€è‡´ï¼ˆ`ecf2b3c`),09-24~09-26 æ— æ–°æäº¤ï¼›åŒäº‹æœ€è¿‘两条是 09-23 çš„ `e5faa88`、`3b68e9e`。服务器实为 Gitblit(无可用 REST API),以 `git ls-remote` ä¸ºå‡†ã€‚
- æ£€æŸ¥ `E:\试验\traffic-audit-deploy-20260913`:
  - å¤–层 `backend/application.yml` é…çš„æ˜¯ `127.0.0.1:3306/traffic_audit`、root、密码占位符、`api-key: ""`(干净);
  - **但 jar å†…ç½® `BOOT-INF/classes/application.yml` å¸¦çœŸå®žå¯†é’¥**(DeepSeek key、本机库口令 3308/root/123456、JWT å¯†é’¥ï¼‰ã€‚
  - git å±‚面是干净的:`application.yml` ä¸Ž `_shots/` éƒ½è¢« gitignore,`git grep`/`git log -S` å‡æ— å‘½ä¸­ã€‚
### 2. é…ç½®åˆ†å±‚改造(打包去密)
- è¿› jar çš„ `src/main/resources/application.yml` å…¨éƒ¨æ”¹ä¸ºå ä½ç¬¦ï¼ˆ`${TRAFFIC_DB_*}`、`${DEEPSEEK_API_KEY:}`、`${TRAFFIC_JWT_SECRET:...}`);
- æœ¬æœºçœŸå®žå€¼ç§»åˆ° `traffic-audit-server/config/application.yml`(Spring çš„ `file:./config/` ä¼˜å…ˆçº§æ›´é«˜ï¼‰ï¼Œå¹¶åŠ å…¥ `.gitignore`;
- `docs/打包部署说明.md` å¢žåŠ "密钥与配置"一节(分层表 + æ‰“包前自查 + éƒ¨ç½²æœºæ¢ key + è½®æ¢æ­¥éª¤ï¼‰ã€‚
### 3. éªŒè¯
- åŽç«¯å¯åЍ OK;登录成功(证明库口令取自本机覆盖文件,否则占位符空口令连不上);`/api/llm/chat` è¿”回"收到"(证明 DeepSeek key å–自本机覆盖文件);
- `git grep` ç¡®è®¤è·Ÿè¸ªæ–‡ä»¶ä¸­æ—  `sk-` å¯†é’¥ï¼›ä»“库内两份部署模板均为占位版。
## äºŒã€æµ‹è¯•结果摘要
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md`(7 æ¡ç”¨ä¾‹å…¨é€šè¿‡ï¼‰ã€‚
## ä¸‰ã€é—留问题与待办
1. **【需用户操作】轮换已泄露的 DeepSeek key**:控制台新建 key â†’ åˆ é™¤æ—§ key â†’ éƒ¨ç½²æœºå¤–部 `application.yml` å¡«æ–° key â†’ é‡å¯éªŒè¯ã€‚æ—§ jar æ— æ³•收回,轮换是唯一根治手段。
2. æœ¬æœºæ•°æ®åº“ root å£ä»¤ï¼ˆ123456)同样在旧 jar é‡Œï¼Œå»ºè®®éƒ¨ç½²æœºæ¢å£ä»¤ã€‚
3. ä¸‹æ¬¡é‡æ–°æ‰“包给部署机时,建议按 `打包部署说明.md` çš„自查步骤确认 jar å†…无真实值,并顺带同步部署包内的旧母版(P2-5)。
4. é¡¹ç›®å…¶å®ƒé—留(P0/P1/P2)见 `docs/交接文档_2026-09-21.md` ç¬¬ 4 èŠ‚ä¸Ž `docs/交接文档_2026-09-23.md`。
## å››ã€æ˜Žå¤©è®¡åˆ’
1. è§†ç”¨æˆ·å®‰æŽ’推进 P0:亿元投资项目按月追列(P0-2)、导出前基数体检 + ç¼ºå¤±æ¸…单页(P0-3)、2026-06/09 æ¯ç‰ˆï¼ˆP0-4)。
2. æ±‡æ€»å¤§è¡¨ 304 æ ¼ã€Œ2025 ç´¯è®¡åˆ—少加 7、8 æœˆã€æ¸…空(业务已确认口径)。
docs/´ò°ü²¿Êð˵Ã÷.md
@@ -219,3 +219,38 @@
- **2026-09-13**:新增一键打包脚本 `package-deploy.py`;jar æ”¹ä¸ºå†…嵌前端(部署机不再需要 nginx);删除 Redis ç›¸å…³è¯´æ˜Žï¼ˆä»£ç æœªä½¿ç”¨ï¼‰ï¼›è¡¥ `sql_wyc.sql` ä¸Ž `summary.template-dir`;补 `jwt.secret` å–值规则;补部署后验证清单。
- 2026-08-27:首版(zip éƒ¨ç½²åŒ… + nginx æ–¹æ¡ˆï¼‰ã€‚
---
## å¯†é’¥ä¸Žé…ç½®ï¼ˆ2026-09-26 èµ·ï¼Œæ‰“包必读)
### åˆ†å±‚约定
| ä½ç½® | ç”¨é€” | æ˜¯å¦è¿› git | æ˜¯å¦è¿› jar |
| --- | --- | --- | --- |
| `traffic-audit-server/src/main/resources/application.yml` | è¿› jar çš„默认配置,**只有占位符**(`${TRAFFIC_DB_PASSWORD:}`、`${DEEPSEEK_API_KEY:}` ç­‰ï¼‰ | å¦ï¼ˆå·² gitignore,用 `application.yml.example` åšæ¨¡æ¿ï¼‰ | **是**(无真实值) |
| `traffic-audit-server/config/application.yml` | æœ¬æœºå¼€å‘真实值(库口令 / JWT / DeepSeek key) | å¦ï¼ˆå·² gitignore) | å¦ |
| jar åŒçº§çš„ `backend/application.yml` | éƒ¨ç½²æœºçœŸå®žå€¼ï¼ˆä¼˜å…ˆçº§é«˜äºŽ jar å†…置) | å¦ | å¦ï¼ˆåœ¨åŒ…外,现场填) |
| çŽ¯å¢ƒå˜é‡ `TRAFFIC_DB_PASSWORD` / `TRAFFIC_DB_USER` / `TRAFFIC_DB_URL` / `TRAFFIC_JWT_SECRET` / `DEEPSEEK_API_KEY` | è¦†ç›–以上任意一项 | å¦ | å¦ |
### æ‰“包前自查(30 ç§’)
```powershell
# 1) ç¡®è®¤è¿› jar çš„配置没有真实密钥(应只看到 ${...})
Select-String -Path traffic-audit-server\src\main\resources\application.yml -Pattern "password:|api-key:|secret:"
# 2) æ‰“完包后再验证一次 jar å†…部
python -c "import zipfile;print(zipfile.ZipFile('traffic-audit-server/target/traffic-audit-server-1.0.0-SNAPSHOT.jar').read('BOOT-INF/classes/application.yml').decode('utf-8'))" | Select-String "password:|api-key:"
```
### éƒ¨ç½²æœºä¸ŠåŠ /换 DeepSeek key
1. æ‰“包上传后,编辑 **jar åŒçº§**的 `backend/application.yml`:`deepseek.api-key: "你的新key"`(留空则页面 AI åˆ†æžä¸å¯ç”¨ï¼Œå…¶ä½™åŠŸèƒ½æ­£å¸¸ï¼‰ï¼›
2. é‡å¯åŽç«¯ï¼š`start-backend.cmd`(或 `java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar`);
3. é¡µé¢é‡Œç‚¹ä¸€æ¬¡ AI åˆ†æžç¡®è®¤å¯ç”¨ï¼›
4. **不要**去改 jar å†…部的配置(改了下次发包就丢),也不要把 key æäº¤è¿›ä»»ä½•仓库文件。
### è½®æ¢ï¼ˆä½œåºŸï¼‰å·²æ³„露的 key
1. ç™»å½• DeepSeek æŽ§åˆ¶å° â†’ API Keys â†’ æ–°å»ºä¸€ä¸ª key;
2. åˆ é™¤/禁用旧 key(旧 key ç«‹åˆ»å¤±æ•ˆï¼Œæ­¤å‰æ‰“包带出去的 jar é‡Œé‚£ä»½å³ä½œåºŸï¼‰ï¼›
3. æŒ‰ä¸Šé¢ç¬¬ 1~3 æ­¥æŠŠæ–° key å¡«åˆ°éƒ¨ç½²æœºçš„外部配置并重启验证。