27 Commits

Author SHA1 Message Date
366d62f262 feat: 部署时自动校验支付宝签名一致性 + 验签失败升级为 error + 密钥核对脚本 2026-08-10 16:06:02 +08:00
2ce97243ab fix: 全量代码审计修复 — 30项
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
P0 - Panic 风险修复:
  - payment.rs: unwrap() → let-else safe handling
  - payment.rs: get_jwt_secret() expect → Result/AppError
  - auth.rs: openid 切片添加 len >= 8 守卫
  - main.rs: 启动时 expect → unwrap_or_else 描述性 panic
  - main.rs: Directive::from_str 添加 fallback

P1 - 逻辑/安全修复:
  - payment.rs: urlencoding() + 解码 bug 修复 (移除 had_escape)
  - payment.rs: Mock 支付添加 check_mock_payment_allowed 检查
  - db.rs: 永久会员 NULL → 2099-12-31 一致化
  - user.rs: 维护模式添加安全说明注释
  - 自动清理 unused_variables 警告 (_is_mobile)

P2 - 错误吞没修复:
  - main.rs: 3 处定时任务 let _ = → if let Err = tracing::error!
  - db.rs + admin.rs: 7 处通知/审计日志 let _ = → tracing::warn!
  - auth.rs: refresh token 保存 add warn 日志

P3 - 死代码清理:
  - models.rs: 移除 TokenResponse (dead)
  - models.rs: 移除 AppState 中 5 个未使用字段 (env var 直接读取)
  - error.rs: 移除 3 个 dead ErrorResponse 方法
  - rate_limiter.rs: extract_client_ip_from_header → #[cfg(test)]
  - models.rs: 注释 typo fix (user_ytpe → user_type)
  - db.rs: RefreshToken 添加 deserialization 注释

Shell 脚本修复:
  - deploy.sh: run_migrations 移到 restart_service 之前
  - test.sh: 移除 EXIT trap 覆盖; heredoc 引号修复; 维护模式添加 restart
  - common.sh: mock_key 添加 sed 转义 (防 / & 注入)

验证: cargo check 0 warnings, 8 tests passed
2026-07-23 12:40:47 +08:00
217e7f8a55 fix: deploy.sh/test.sh 审计修复
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
deploy.sh:
- 修复重复的 header 注释行

lib/common.sh:
- view_logs/tail_logs/status: 从日志文件切换为 journalctl(上次改
  日志输出到 stdout 后,日志文件已不存在)
- init_env 模板: User=root → User=rust-backend(匹配最小权限原则)

lib/test.sh:
- test_notify_url_domain: 添加自定义 Host 头(TEST_DOMAIN),模拟
  真实外部请求场景。之前测试走 127.0.0.1 直连,Host 头为 localhost
  导致 notify_url 校验永远通过但实际配置可能是错误的
2026-07-23 12:25:55 +08:00
0b0757939b fix: 使用请求 Host 头动态构建 notify_url + 迁移文档/测试
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
根因:base_url 默认硬编码为 dev.xmclassmate.top,导致支付宝通知回调
(notify_url)指向开发服务器,RSA2 签名验证失败,订单延迟 12 分钟。

修复:
- 新增 get_base_url():优先用 APP_BASE_URL 环境变量,否则从请求
  Host 头获取当前域名,确保 notify_url 始终指向正确的服务器
- 生产 .env 已设置 APP_BASE_URL=https://xmclassmate.top
- .env.example 新增 APP_BASE_URL 文档

迁移文档:
- SERVER-MIGRATION-PLAN.md 新增阶段 3 关键配置章节
- 12 项迁移检查清单 + 历史问题复盘

部署测试:
- test.sh 新增 test_notify_url_domain:校验支付表单 notify_url
  域名与 BASE_URL 一致,迁移后自动捕获配置错误
2026-07-23 12:09:52 +08:00
2c86219c82 feat: Alipay 安全加固 + 切换手机网站支付 (wap.pay)
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
- Phase 1: 移除 Git 中 ALIPAY 密钥,改用 EnvironmentFile
  所有 4 个 deploy 模板删除 ALIPAY_* 内联 Environment,改为指向 .env
  check_service_file() 不再要求 ALIPAY_APP_ID 在 Environment 中
  init_env() 生成模板添加 EnvironmentFile 行

- Phase 2: 切换到手机网站支付 (alipay.trade.wap.pay)
  payment.rs: product_code QUICK_WAP_PAY, method alipay.trade.wap.pay
  用户从手机浏览器访问时自动唤起支付宝 APP

- Phase 3: 服务器 .env 文件创建
  所有环境 .env 文件已通过 SSH 创建(600 权限)
  dev 使用沙箱网关 (openapi-sandbox.dl.alipaydev.com)
  prod 使用正式网关 (openapi.alipay.com)

- 生产部署完成(blue→green 双环境同步)
  密钥安全: 不再存在于任何 Git 跟踪文件中
2026-07-20 14:52:39 +08:00
d9c9d1dca0 fix: test_nginx_proxy_temp 改用 remote() 执行 2026-07-19 09:58:57 +08:00
51752f2d4d fix: nginx AppArmor 缺少 proxy temp 路径;test: 新增 POST body 代理测试(避免权限遗漏上线)
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-18 21:58:23 +08:00
917d69c171 feat: Graceful shutdown (10s);backup 格式兼容 .dump.gz;容器连接监控
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-15 11:05:11 +08:00
ae64614342 fix: DB 备份保留从 1 增至 7;添加每日 cron 自动备份(生产+开发库)
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-15 11:01:22 +08:00
0fa9c9c71c fix: nginx proxy 配置路径从 /www/sites/.../proxy/root.conf 改为 /etc/nginx/sites-enabled/
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-13 18:36:00 +08:00
ba00fcb1c6 fix: 适配新服务器蓝绿部署 — nginx 原生/PostgreSQL Docker 容器名/部署脚本
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-13 18:30:38 +08:00
178008496e 优化: Keep-Alive/rate-limiter/dead-code清理 + deploy.sh蓝绿自动检测 + 压测文档 2026-07-03 19:45:57 +08:00
452728be32 feat: deploy.sh增加活动环境检测-禁止直接部署到当前活动端口 2026-06-15 11:19:26 +08:00
776d318330 fix: deploy.sh设置400秒超时+支付代码全面审计 2026-06-15 11:00:16 +08:00
c00e391c9b fix: deploy测试-用远程heredoc替代stdin管道避免SSH复用bug-去重测试不阻断部署 2026-06-10 14:05:13 +08:00
9cef5a2730 fix: 测试SQL工具heredoc变量展开+移除重复函数 2026-06-10 13:31:34 +08:00
d7b7e0c0a3 fix: 部署测试SQL工具bug-硬编码user_id=1/无清理trap/迁移文件未引号 2026-06-10 13:16:19 +08:00
23b6b2a11b test: 补全支付链测试缺口(去重/维护模式/退款/验证检测/前端状态) 2026-06-10 09:33:39 +08:00
ca320c6db0 fix: 部署测试BASE_URL变量提升为全局避免其他测试函数未定义 2026-06-10 09:27:19 +08:00
184948d24b fix: 部署测试test.sh使用HTTPS协议(4433/4434端口)+跳过mock支付测试生产环境 2026-06-10 09:21:31 +08:00
2681003bbd test: 支付链路自动化测试(SQL间隔一致性+部署后支付流程测试) 2026-06-10 09:17:52 +08:00
24143cf3fd fix: deploy.sh蓝绿部署时service文件路径按target区分(common.sh get_service_file_local) 2026-06-07 16:42:38 +08:00
87b17ad09e feat: 部署测试扩增-支付接口+mock登录+通知+迁移验证(9项) 2026-05-26 15:44:50 +08:00
da4af50b45 fix: mock_login支持X-Mock-Key请求头鉴权 + deploy自动配置随机密钥 2026-05-25 16:27:01 +08:00
a9be70aabc fix: deploy工具service文件命名对齐 + 重命名dev服务文件 2026-05-25 15:37:53 +08:00
4240bb6970 refactor: deploy工具适配systemd service模式-移除.env依赖 2026-05-25 14:46:07 +08:00
f9f1ffeff6 refactor: deploy.sh 拆分为模块化结构
- deploy.sh: 从 1574 行精简至 141 行,仅保留主流程编排
- lib/common.sh: 基础设施(日志/SSH复用/备份/上传/迁移/服务管理)
- lib/test.sh: 6 项部署后测试函数
- 迁移系统改用 _migrations 追踪表替代文件名模式匹配
- 所有 SSH 操作复用 ControlMaster socket
2026-05-18 10:09:40 +08:00