14 KiB
14 KiB
Codebase Concerns
Analysis Date: 2026-03-27
Tech Debt
配置与凭据管理(严重级别:Critical):
- Issue: 仓库内存在已提交的生产/测试环境敏感配置与直连外部基础设施的写法,配置边界没有被代码、脚本和部署文件统一约束。
- Files:
docker-compose.prod.yml,Makefile,pkg/config/defaults/config.yaml,scripts/verify_migration/main.go,scripts/verify_indexes/main.go,docs/deployment/deployment-guide.md - Impact: 凭据轮换成本高;泄漏后影响数据库、Redis、对象存储、短信网关、Gateway 与部署链路;开发、测试、生产边界容易串用。
- Supporting evidence:
docker-compose.prod.yml直接写入数据库、Redis、JWT、对象存储、Gateway、短信服务配置。Makefile的DB_URL内嵌远程数据库连接串。pkg/config/defaults/config.yaml为gateway.app_id、gateway.app_secret提供非空默认值,服务在未显式覆盖时仍会初始化 Gateway 客户端,见cmd/api/main.go:366-383。scripts/verify_migration/main.go与scripts/verify_indexes/main.go直接写死远程 PostgreSQL DSN。docs/deployment/deployment-guide.md把 Registry 凭据与数据库连接示例直接写进文档。
- Fix approach: 把所有密钥迁移到部署平台 Secret/环境注入;默认配置只保留空值;脚本统一改为读取环境变量;把示例文档改成占位符而不是真实值。
- Suggested follow-up investigation topics:
- 盘点
openspec/,docs/,scripts/中所有历史凭据残留。 - 审查 Gitea Secrets、Docker Registry、数据库、Redis、对象存储、短信网关、Gateway 的轮换计划。
- 检查
.env、.env.local是否已在团队机器与 Runner 上扩散。
- 盘点
支付与微信配置迁移未闭环(严重级别:High):
- Issue: 设计已经切到
tb_wechat_config+payment_config_id,但代码与文档仍保留环境变量和单例支付实现,处于半迁移状态。 - Files:
docs/wechat-config-management/功能总结.md,internal/service/order/service.go,internal/service/recharge/service.go,internal/handler/callback/payment.go,docs/environment-variables.md,scripts/verify-wechat.sh,docker-compose.prod.yml - Impact: 多支付配置切换、旧订单验签、客户端支付发起、OAuth 配置一致性存在行为不一致风险;运维很难判断哪些配置源仍然生效。
- Supporting evidence:
docs/wechat-config-management/功能总结.md:232-238明确写着客户端支付发起仍是留桩,OAuth 仍从环境变量读取,且旧JUNHONG_WECHAT_PAYMENT_*“可清理”。internal/service/order/service.go:2107,2163,2356,2362与internal/service/recharge/service.go:271、internal/handler/callback/payment.go:66,143仍保留 TODO/留桩。docs/environment-variables.md:36-69与scripts/verify-wechat.sh仍把微信支付环境变量当成必填启动前置条件。docker-compose.prod.yml注释称“微信配置已迁移至数据库”,但部署文件仍维持部分旧式环境变量与其他支付相关外部配置模式。
- Fix approach: 明确单一配置源;把“已迁移”“留桩”“仍依赖环境变量”的边界写入运维文档;在代码层补齐动态加载或删除旧入口。
- Suggested follow-up investigation topics:
- 核实当前线上 OAuth 与支付分别读哪一套配置。
- 核查
payment_config_id相关回调链路是否覆盖订单、资产充值、代理充值三条路径。 - 为未实现的客户端支付入口建立显式禁用清单。
核心服务体量过大(严重级别:High):
- Issue: 部分核心服务文件已经远超团队规范中的函数/文件规模要求,维护成本和回归风险高。
- Files:
internal/service/order/service.go,AGENTS.md - Impact: 改动难以局部验证;支付、幂等、库存/余额、回调逻辑耦合;新需求更容易引入回归。
- Supporting evidence:
AGENTS.md:371-375要求函数长度 ≤ 100 行,核心逻辑建议 ≤ 50 行。internal/service/order/service.go的 TODO 已出现在 2107、2163、2356、2362 行,说明文件至少超过 2362 行。
- Fix approach: 按支付发起、支付回调、订单状态流转、幂等与锁、钱包扣款等职责拆分子服务/辅助组件。
- Suggested follow-up investigation topics:
- 统计
internal/service/中超长文件与超长函数。 - 识别最常改动的热点段落与共享依赖。
- 统计
Known Bugs
健康检查接口对故障返回 200 成功包裹(严重级别:High):
- Symptoms: PostgreSQL 或 Redis 故障时,
/health仍通过response.Success返回成功包裹,只在data.status中标记degraded。 - Files:
internal/handler/health.go,docker-compose.prod.yml,Dockerfile.api,debug-deployment.sh - Trigger: 数据库或 Redis Ping 失败。
- Workaround: 监控端必须解析响应体里的
data.status与services.*.status,不能只看 HTTP 状态码。 - Supporting evidence:
internal/handler/health.go:101-111注释与实现都明确“端点本身能响应即视为成功”。docker-compose.prod.yml与Dockerfile.api的健康检查只执行wget --spider http://127.0.0.1:3000/health,不会校验 JSON 内容。
- Suggested follow-up investigation topics:
- 确认当前容器健康检查、反向代理、告警系统是否只看 200。
- 评估是否需要新增
readyz/livez区分活性与依赖可用性。
API 路径文档与实际路由不一致(严重级别:Medium):
- Symptoms: 文档仍混用
/api/v1、/api/auth、/api/c/v1,读者很难判断当前真实入口。 - Files:
README.md,internal/routes/routes.go,scripts/check-comment-paths.sh - Trigger: 新人按 README 试运行、按旧注释实现客户端、或依据文档回归接口。
- Workaround: 以
internal/routes/routes.go为准核对真实挂载路径。 - Supporting evidence:
internal/routes/routes.go:21-39当前真实路由为/api/auth、/api/admin、/api/c/v1、/api/callback。README.md:577-583仍展示v1 := app.Group("/api/v1")的旧限流示例;README.md:588-624仍以/api/v1/users讲解请求流。scripts/check-comment-paths.sh只检查internal/handler/中残留/api/v1,并不覆盖README.md、docs/、openspec/。
- Suggested follow-up investigation topics:
- 扫描所有
docs/,README.md,openspec/,specs/中的旧路径。 - 明确哪些旧路径仍需要兼容,哪些应统一下线。
- 扫描所有
Security Considerations
部署流水线绕过 TLS 校验(严重级别:High):
- Risk: 工作流检出步骤通过
GIT_SSL_NO_VERIFY=1跳过证书校验,供应链完整性依赖内网信任而不是证书验证。 - Files:
.gitea/workflows/deploy.yaml - Current mitigation: 注释说明是“内网自签名证书”。
- Recommendations: 为 Gitea/Registry 配置受信 CA;移除跳过校验;至少把跳过范围限制在明确的单一主机与受控 Runner。
- Supporting evidence:
.gitea/workflows/deploy.yaml:23-27设置GIT_SSL_NO_VERIFY=1后执行git clone。
对外/回调错误信息泄漏底层细节(严重级别:Medium):
- Risk: 健康检查与富友回调把底层错误或内部状态直接返回给调用方,不符合统一错误暴露规范。
- Files:
internal/handler/health.go,internal/handler/callback/payment.go,AGENTS.md - Current mitigation: 有统一错误处理规范,但没有覆盖这两个特殊出口。
- Recommendations: 对外返回统一错误码/固定消息,把底层错误仅写日志。
- Supporting evidence:
AGENTS.md:124-129明确禁止直接暴露底层错误。internal/handler/health.go:50-60,82-85直接返回err.Error()。internal/handler/callback/payment.go:178-191直接把err.Error()拼入富友回调失败响应。
Performance Bottlenecks
默认限流仍使用内存存储且默认关闭(严重级别:Medium):
- Problem: 默认配置既不开启限流,也默认使用
memory存储;多实例部署时无法形成统一配额。 - Files:
pkg/config/defaults/config.yaml,cmd/api/main.go,README.md - Cause: 配置更偏向本地开发便利,缺少生产默认值与环境级约束。
- Improvement path: 明确生产必须启用 Redis 存储限流;在部署文档里给出环境变量模板;增加启动日志或自检提示当前限流模式。
- Supporting evidence:
pkg/config/defaults/config.yaml:87-93默认enable_rate_limiter: false、storage: memory。cmd/api/main.go:236-278只有显式开启时才挂载限流,并根据配置选择 Redis 或内存存储。
Fragile Areas
OpenAPI 文档生成依赖手工双点维护(严重级别:Medium):
- Files:
AGENTS.md,docs/api-documentation-guide.md,cmd/api/docs.go,cmd/gendocs/main.go - Why fragile: 新增 Handler 必须同时更新两个文件;流程靠人工记忆,历史上已经出现清单不一致并专门做过修复。
- Safe modification: 每次新增 Handler 时同时检查
cmd/api/docs.go、cmd/gendocs/main.go与生成产物docs/admin-openapi.yaml/logs/openapi.yaml。 - Test coverage: 未发现自动化校验这两份清单一致性的 CI 步骤。
- Supporting evidence:
AGENTS.md:53-65明确要求手工更新两个文件。docs/api-documentation-guide.md多处把“忘记在两个文件中添加新 Handler”列为最常见问题。.gitea/workflows/deploy.yaml中未见go run cmd/gendocs/main.go、diff 校验或文档一致性检查。
部署脚本与运行时约定已漂移(严重级别:Medium):
- Files:
debug-deployment.sh,docker-compose.prod.yml,README.md,docs/deployment/deployment-guide.md - Why fragile: 诊断脚本仍假定旧环境变量名与外置配置文件存在,文档与当前嵌入式配置实现不完全一致。
- Safe modification: 先以
docker-compose.prod.yml、pkg/config/defaults/config.yaml、cmd/api/main.go为准修正运维脚本,再统一更新部署文档。 - Test coverage: 未发现对诊断脚本、部署文档、健康检查语义的自动验证。
- Supporting evidence:
debug-deployment.sh:52-57仍 grepDB_|CONFIG_ENV,并尝试读取/app/configs/config.yaml;当前配置前缀实际是JUNHONG_,配置默认嵌入二进制,见README.md:651-689、pkg/config/defaults/config.yaml。docs/deployment/deployment-guide.md:302-305仍建议从/app/.env拼接迁移命令,但容器实际入口用环境变量构造 DSN,见docker/entrypoint-api.sh:8-17。
Scaling Limits
CI/CD 质量闸门过窄(严重级别:High):
- Current capacity: 当前工作流只做 clone、build、push、main 分支部署。
- Limit: 文档一致性、脚本检查、编译前规范、迁移安全、健康语义等问题都可能直接进入镜像与部署环境。
- Scaling path: 在
.gitea/workflows/deploy.yaml前置独立质量作业,至少执行bash scripts/check-all.sh、go build ./...、OpenAPI 生成/校验,并在部署前验证 compose 文件与镜像健康策略。 - Supporting evidence:
README.md:941-957声称脚本检查会在 CI/CD 自动执行。.gitea/workflows/deploy.yaml未出现scripts/check-all.sh、go test、go vet、go build ./...、OpenAPI 校验等步骤。
Dependencies at Risk
Go 版本与运行基础不统一(严重级别:Medium):
- Risk: 版本声明分散在多个位置,升级与排障时容易出现“本地能过、容器不一致”的问题。
- Impact: 构建环境复现、依赖升级与 bug 排查成本上升。
- Migration plan: 约定单一权威版本源(如
go.mod+.tool-versions/.go-version),并让 Dockerfile、README、部署文档同步引用。 - Supporting evidence:
go.mod:3使用go 1.25.0。Dockerfile.api:4与Dockerfile.worker:4使用golang:1.25.6-alpine。README.md:884写的是Go 1.25.1。
Missing Critical Features
缺少可执行的自动化质量/回归入口(严重级别:High):
- Problem: README、历史设计与测试文档大量提到
go test、IntegrationTestEnv、tests/integration/,但仓库当前未发现对应测试文件或tests/目录。 - Blocks: 无法快速验证重构、支付回调、权限过滤、部署脚本变更;文档中的测试命令无法直接落地。
- Supporting evidence:
AGENTS.md:324-354当前规范明确禁止自动化测试,和README.md:712-756、docs/testing/test-connection-guide.md的测试要求形成正面冲突。- 读取仓库根目录未发现
tests/目录;glob搜索tests/**/*_test.go与internal/**/*_test.go未返回结果。 docs/testing/test-connection-guide.md仍宣称“204 个测试总耗时 ~10.5 秒”并要求所有新测试遵循该规范。
Test Coverage Gaps
部署、配置迁移、运维脚本与文档一致性未见自动验证(优先级:High):
- What's not tested:
docker-compose.prod.yml、debug-deployment.sh、scripts/migrate.sh、OpenAPI 文档生成器双清单、README/部署文档与代码的同步性。 - Files:
.gitea/workflows/deploy.yaml,docker-compose.prod.yml,debug-deployment.sh,scripts/migrate.sh,cmd/api/docs.go,cmd/gendocs/main.go,README.md - Risk: 配置漂移、凭据泄漏、文档错误、健康检查误报、迁移行为变化都可能在上线后才暴露。
- Priority: High
- Suggested follow-up investigation topics:
- 设计最小化“文档/脚本一致性检查”而不是恢复完整自动化测试体系。
- 评估是否要为部署文件与文档生成引入静态检查或 smoke check。
Concerns audit: 2026-03-27