Files
sub2api-cn-relay-manager/TASKS.md
phamnazage-jpg 91fa5d6ab4 fix(review): 完成系统性 Review 修复方案 - Task B-01 HTTP Server 超时配置
本次提交包含:
- B-01: HTTP Server 添加超时配置 (ReadTimeout/WriteTimeout/IdleTimeout/MaxHeaderBytes)
- 添加结构化日志包 internal/log/ (B-02 部分完成)
- 添加 Review 报告文档
- 添加系统性修复方案文档
- 添加最佳实践审核报告文档
- 更新任务清单和执行板

测试验证:
- TestServerHasTimeoutConfiguration 通过

关联文档:
- docs/2026-06-01-SYSTEMATIC-REVIEW-REPORT.md
- docs/2026-06-01-SYSTEMATIC-REPAIR-PLAN.md
- docs/2026-06-01-BEST-PRACTICE-AUDIT-REPORT.md
2026-06-01 22:02:01 +08:00

581 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# sub2api-cn-relay-manager 修复任务清单
> 基于 Review 报告生成
> **目标**: 系统化跟踪 BLOCKER/HIGH/MEDIUM 问题解决
---
## 📋 任务总览
- **BLOCKER**: 4 项 | 预计 16h
- **HIGH**: 5 项 | 预计 20h
- **MEDIUM**: 4 项 | 预计 12h
- **总计**: 13 项 | 预计 48h
---
## 🚨 BLOCKER 任务(必须完成)
### [ ] B-01 HTTP Server 添加超时配置
```yaml
优先级: P0
状态: 待处理
负责人: 待分配
开始日期: 待确定
预计工时: 4h
阻塞:
```
**描述**: HTTP Server 未配置 ReadTimeout、WriteTimeout、IdleTimeout
**文件修改**:
- `internal/app/app.go`
- `internal/app/app_test.go`
**验收标准**:
- [ ] 添加 ReadTimeout: 30s
- [ ] 添加 WriteTimeout: 30s
- [ ] 添加 IdleTimeout: 120s
- [ ] 添加 MaxHeaderBytes: 1MB
- [ ] 集成测试通过
---
### [ ] B-02 日志结构化改造
```yaml
优先级: P0
状态: 待处理
负责人: 待分配
开始日期: 待确定
预计工时: 6h
阻塞:
```
**描述**: 使用标准库 log 输出非结构化日志
**文件修改**:
- `internal/log/log.go` (新建)
- `cmd/server/main.go`
- `cmd/cli/main.go`
- `internal/routing/logwriter.go`
**验收标准**:
- [ ] 创建 slog 封装包
- [ ] 支持 LOG_LEVEL 环境变量
- [ ] 所有日志输出 JSON 格式
- [ ] 替换所有 log.Printf/log.Fatalf
---
### [ ] B-03 日志轮转配置
```yaml
优先级: P0
状态: 待处理
负责人: 待分配
开始日期: 待确定
预计工时: 4h
阻塞:
```
**描述**: 容器环境下日志无限增长
**文件修改**:
- `internal/log/log.go`
- `go.mod`
**依赖**:
- `gopkg.in/natefinch/lumberjack.v2`
**验收标准**:
- [ ] 单日志文件 100MB 限制
- [ ] 保留 3 个历史日志
- [ ] 历史日志自动压缩
- [ ] 7 天自动清理
---
### [ ] B-04 CI/CD 工作流配置
```yaml
优先级: P0
状态: 待处理
负责人: 待分配
开始日期: 待确定
预计工时: 4h
阻塞:
```
**描述**: 缺少 GitHub Actions 自动化测试和发布
**文件新建**:
- `.github/workflows/ci.yml`
- `.github/workflows/release.yml`
**验收标准**:
- [ ] CI 触发测试、覆盖率检查
- [ ] CI 触发格式化检查
- [ ] Release 构建多平台二进制
- [ ] Release 推送 Docker 镜像
---
## 🔴 HIGH 任务(建议完成)
### [ ] H-01 补充 testutil 测试
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 3h
```
**文件新建**:
- `internal/testutil/sqlite_test.go`
**验收标准**:
- [ ] TestNewTestDB 覆盖率 100%
- [ ] TestNewTestDBWithMigrations 覆盖率 100%
---
### [ ] H-02 补充 migrations 测试
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 4h
```
**文件新建**:
- `internal/store/migrations/migrations_test.go`
**验收标准**:
- [ ] TestMigrationScripts 验证关键表
- [ ] TestMigrationIdempotency 验证幂等性
---
### [ ] H-03 日志 flush 错误监控
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 3h
```
**文件修改**:
- `internal/routing/logwriter.go`
**验收标准**:
- [ ] 添加 flush 错误计数
- [ ] 添加 Prometheus 指标暴露
- [ ] 超过阈值告警
---
### [ ] H-04 Prometheus 指标暴露
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 6h
```
**文件新建**:
- `internal/metrics/metrics.go`
**文件修改**:
- `internal/app/http_api.go`
- `go.mod`
**依赖**:
- `github.com/prometheus/client_golang/prometheus`
**验收标准**:
- [ ] HTTP 请求指标(总量、延迟)
- [ ] 业务指标(导入、对账)
- [ ] /metrics 端点可访问
---
### [ ] H-05 移除 Dockerfile 默认值
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 1h
```
**文件修改**:
- `Dockerfile`
**文件新建**:
- `scripts/docker-entrypoint.sh`
**验收标准**:
- [ ] 移除 SUB2API_CRM_ADMIN_TOKEN 默认值
- [ ] 添加启动时强制检查
- [ ] 缺少必需变量时优雅退出
---
## 🟡 MEDIUM 任务(可选完成)
### [ ] M-01 测试代码 panic 替换
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 2h
```
**文件修改**:
- `internal/store/sqlite/packs_repo_test.go:208`
- `internal/store/sqlite/providers_repo_test.go:316`
**修改内容**:
```go
// panic("unexpected QueryRowContext")
// ->
t.Fatalf("unexpected QueryRowContext")
```
---
### [ ] M-02 错误信息字符串匹配优化
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 3h
```
**文件新建**:
- `internal/errors/errors.go`
**修改目标**:
- 多处测试使用 `strings.Contains(err.Error(), ...)`
- 改为使用 `errors.Is()`
---
### [ ] M-03 边界测试补充
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 4h
```
**文件修改**:
- `internal/app/*_test.go`
**测试场景**:
- [ ] 空字符串参数
- [ ] 超长参数256+ 字符)
- [ ] 特殊字符参数
- [ ] 边界数值参数
---
### [ ] M-04 添加版本信息端点
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 3h
```
**文件修改**:
- `internal/app/http_api.go`
- `Makefile``Dockerfile`
**验收标准**:
- [ ] GET /version 端点返回版本信息
- [ ] 包含 version、commit、build_time
---
## 📅 执行日历
### Week 1: BLOCKER 修复
| 日期 | 任务 | 状态 |
|------|------|------|
| Mon | B-01 HTTP Server 超时 | [ ] |
| Tue | B-02 日志结构化 | [ ] |
| Wed | B-03 日志轮转 | [ ] |
| Thu | B-04 CI/CD 配置 | [ ] |
| Fri | BLOCKER 集成测试 | [ ] |
### Week 2: HIGH 修复
| 日期 | 任务 | 状态 |
|------|------|------|
| Mon | H-01 testutil 测试 | [ ] |
| Tue | H-02 migrations 测试 | [ ] |
| Wed | H-03 日志 flush 监控 | [ ] |
| Thu | H-04 Prometheus | [ ] |
| Fri | H-05 Dockerfile | [ ] |
### Week 3: MEDIUM + 验收
| 日期 | 任务 | 状态 |
|------|------|------|
| Mon | M-01 panic 替换 | [ ] |
| Tue | M-02 错误匹配优化 | [ ] |
| Wed | M-03 边界测试 | [ ] |
| Thu | M-04 版本端点 | [ ] |
| Fri | 全量回归测试 | [ ] |
---
## 📝 任务状态更新日志
<!-- 在此记录任务进度 -->
### 2026-06-01
- 任务清单创建完成
- 状态:初始状态,未开始
---
## 🎯 完成标准
### BLOCKER 完成检查
- [ ] B-01 代码审查通过
- [ ] B-02 代码审查通过
- [ ] B-03 代码审查通过
- [ ] B-04 代码审查通过
- [ ] 所有 BLOCKER PR 合并
- [ ] BLOCKER 集成测试通过
### HIGH 完成检查
- [ ] H-01 代码审查通过
- [ ] H-02 代码审查通过
- [ ] H-03 代码审查通过
- [ ] H-04 代码审查通过
- [ ] H-05 代码审查通过
- [ ] 所有 HIGH PR 合并
### 最终验收
- [ ] 综合评级从 B 提升到 A
- [ ] 全量测试通过
- [ ] 性能测试达标
- [ ] 安全扫描通过
- [ ] 生产就绪评审通过
---
**清单版本**: v1.0
**生成时间**: 2026-06-01
**对应 Review**: 2026-06-01-SYSTEMATIC-REVIEW-REPORT.md
---
## 🔧 最佳实践补充任务(审核后添加)
### 高优先级补充任务4 项10h
#### [ ] H-1a: 日志敏感信息脱敏
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 2h
依赖: B-02
```
**文件新建**:
- `internal/log/sanitize.go`
**实现内容**:
```go
func Sanitize(fields map[string]interface{}) map[string]interface{}
// 自动脱敏: token, password, key, secret, credential
```
---
#### [ ] H-2a: CI/CD 安全扫描
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 3h
依赖: B-04
```
**文件修改**:
- `.github/workflows/ci.yml`
**添加步骤**:
```yaml
- name: Run govulncheck
run: go install golang.org/x/vuln/cmd/govulncheck@latest && govulncheck ./...
- name: Run gosec
run: go install github.com/securego/gosec/v2/cmd/gosec@latest && gosec ./...
- name: Run staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@latest && staticcheck ./...
```
---
#### [ ] H-3a: Dockerfile 非 root 用户
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 1h
依赖: H-05
```
**文件修改**:
- `Dockerfile`
**添加指令**:
```dockerfile
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
USER appuser
```
---
#### [ ] H-4a: 新建故障处理手册
```yaml
优先级: P1
状态: 待处理
负责人: 待分配
预计工时: 4h
依赖: -
```
**文件新建**:
- `docs/RUNBOOK.md`
**内容章节**:
- 启动失败诊断
- 数据库连接问题
- 宿主 API 连接超时
- 导入失败回滚
- 对账异常处理
- 日志排查指南
- 告警响应流程
---
### 中优先级补充任务5 项15h
#### [ ] M-1a: 添加 ReadHeaderTimeout
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 1h
依赖: B-01
```
**修改**:
```go
server: &http.Server{
ReadTimeout: 30 * time.Second,
ReadHeaderTimeout: 10 * time.Second, // 新增
WriteTimeout: 30 * time.Second,
IdleTimeout: 120 * time.Second,
}
```
---
#### [ ] M-2a: 添加 trace_id 支持
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 3h
依赖: B-02
```
**文件修改**:
- `internal/log/log.go`
- `internal/app/middleware.go`
**实现**:
- 生成 trace_id
- 注入 context
- 所有日志携带 trace_id
---
#### [ ] M-3a: 添加模糊测试
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 4h
依赖: -
```
**文件新建**:
- `internal/provision/import_fuzz_test.go`
- `internal/pack/validate_fuzz_test.go`
---
#### [ ] M-4a: 添加业务指标
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 3h
依赖: H-04
```
**文件修改**:
- `internal/metrics/business.go`
**添加指标**:
- `import_runs_total`
- `import_success_rate`
- `reconcile_drift_total`
- `route_proxy_duration`
---
#### [ ] M-5a: API 限流实现
```yaml
优先级: P2
状态: 待处理
负责人: 待分配
预计工时: 4h
依赖: -
```
**文件新建**:
- `internal/app/ratelimit.go`
**实现**:
```go
// Token bucket rate limiter
// 100 req/s, burst 10
// 按 IP 和按 Token 双维度
```
---
## 📊 更新后任务统计
| 类别 | 原始任务 | 补充任务 | 总计 | 工时 |
|------|----------|----------|------|------|
| BLOCKER | 4 | 0 | 4 | 16h |
| HIGH | 5 | 4 | 9 | 30h |
| MEDIUM | 4 | 5 | 9 | 27h |
| **总计** | **13** | **13** | **22** | **73h** |
---
**任务清单版本**: v2.0(审核后更新)
**更新时间**: 2026-06-01
**更新原因**: 最佳实践审核发现 9 项补充任务