# 代理工具孵化记录 > 状态:孵化中 | 更新:2026-03-27 --- ## 工具列表 | 工具 | 端口 | 状态 | 项目目录 | |------|------|------|----------| | mysql-proxy | 3307 | 可用 | `mysql-proxy` | | ssh-proxy | 3308 | 可用 | `ssh-proxy` | | mongo-proxy | 3309 | 可用 | `mongo-proxy` | | redis-proxy | 3310 | 可用 | `redis-proxy` | --- ## 新增功能 ### 2026-03-24 1. **redis-proxy** (新工具) - Redis HTTP 代理,会话复用 - 支持 run/get/set/del/keys/info - CLI 模式 + HTTP API 双模式 - 连接: flux_dev 2. **mongo-proxy** (新工具) - MongoDB HTTP 代理,会话复用 - 支持 find/insert/update/delete/aggregate/count - CLI 模式 + HTTP API 双模式 - 连接: suke_dev, suke_pro ### 2026-03-21 1. **ssh-proxy 断线重连** (P0) - exec 方法检测到会话失效时自动清除并重连 - 修复 get_or_create_session TOCTOU 竞态条件 2. **日志智能分级** (P1) - 慢请求告警: >3s WARN, >10s ERROR - 退出码识别: exitCode 0/1/-1 视为正常,>=2 或 127 标记 ERROR - UTF-8 安全截断 3. **服务器配置扩展** (P1) - 新增 server1 (一号机)、server2 (二号机)、ai_sg (新加坡 AI 机器) - 共 5 台服务器 4. **代码优化** (P2) - 移除未使用的 async-trait 依赖 - 用 time crate 替换 40 行手写日期计算 - 清理未使用字段 ### 2026-03-20 1. **ssh-proxy russh 迁移** (P0) - 从 ssh2 迁移到 russh,原生支持 ed25519 密钥 - 修复了 ed25519 认证失败问题 - 使用 async/await 原生 API ### 2026-03-19 1. **请求日志** (P0) - 设置环境变量启用:`MYSQL_PROXY_LOG` / `SSH_PROXY_LOG` - 日志格式:JSON,每行一条记录 2. **ssh-proxy CLI JSON 输出** (P1) ```bash ssh-proxy exec -n flux_dev -c "docker ps" -F json ``` 3. **ssh-proxy 动态添加服务器** (P2) ```bash ssh-proxy add-server -n myserver -H 192.168.1.100 -u root -p password # 或 API curl -X POST http://127.0.0.1:3308/servers/add \ -H "Content-Type: application/json" \ -d '{"name":"myserver","host":"192.168.1.100","user":"root","password":"secret"}' ``` 4. **API 错误友好提示** - 错误时返回 `usage` 字段,引导正确使用 ### 2026-03-18 - mysql-proxy 动态添加连接 API - ssh-proxy Windows 路径修复 - ssh-proxy 读取错误日志修复 --- ## 实测性能 | 操作 | 代理 | 直连 | 提升 | |------|------|------|------| | mysql 首次查询 | ~150ms | ~500ms | 3x | | mysql 复用会话 | ~50ms | ~500ms | 10x | | ssh 首次执行 | ~900ms | ~1500ms | 1.7x | | ssh 复用会话 | ~100-200ms | ~1500ms | 7-15x | --- ## AI 推荐使用方式 > **优先使用 CLI 模式**,命令简洁 ```bash # MySQL 查询 (CLI 优先) mysql-proxy cli -c flux_dev -e "SELECT VERSION()" # MySQL JSON 输出 mysql-proxy cli -c flux_dev -e "SHOW TABLES" -F json # MySQL 执行 DML mysql-proxy cli -c flux_dev -e "UPDATE users SET status=1" -x # SSH 执行 (CLI 优先) ssh-proxy exec -n flux_dev -c "docker ps" # SSH JSON 输出 ssh-proxy exec -n flux_dev -c "docker ps" -F json # 列出服务器 ssh-proxy servers mysql-proxy connections ``` **HTTP API (复杂场景)**: ```bash # MySQL curl -X POST http://127.0.0.1:3307/query \ -H "Content-Type: application/json" \ -d '{"conn":"flux_dev","sql":"SELECT VERSION()"}' # SSH curl -X POST http://127.0.0.1:3308/exec \ -H "Content-Type: application/json" \ -d '{"server":"flux_dev","command":"docker ps"}' ``` **降级方案** (代理不可用): ```bash mysql -h -u -p -D -e "" ssh @ "" ``` **优势**: - CLI 命令简洁,AI 友好 - JSON 格式输出,易于解析 - 会话复用,响应快 - 错误提示友好 --- ## 代码审查 (2026-03-27) > 12 维度并行审查:架构一致性、错误处理、安全性、性能、DRY、日志、配置管理、CLI 一致性、边界条件、依赖、资源清理、代码度量 ### 必须修复 | # | 问题 | 文件 | 说明 | 状态 | |---|------|------|------|------| | 1 | .gitignore 未覆盖 mongo/redis 配置 | `.gitignore` | 含真实密码,随时可能被 `git add` 提交 | ✅ | | 2 | Redis 密码无 URL 编码 | `redis-proxy/src/config.rs` | 密码含 `@` `:` 时 URL 解析失败 | ✅ | | 3 | mongo urlencoding 不完整 | `mongo-proxy/src/config.rs` | 只编码 5 字符,mysql 编码 19 字符 | ✅ | | 4 | Redis 无重连机制 | `redis-proxy/src/db.rs` | Redis 重启后持续失败 5 分钟直到 idle timeout | ✅ | | 5 | mysql-proxy handler 阻塞 tokio runtime | `mysql-proxy/src/handler.rs` | 同步 DB 操作未用 spawn_blocking,阻塞 worker 线程 | ✅ | | 6 | 全部失败路径无日志 | 所有 handler.rs (4 项目) | 约 36 个 map_err/?? 路径跳过 logger.log() | ✅ | | 7 | with_error() 从未调用 | 所有 logger.rs (4 项目) | 错误日志 level 永远是 INFO | ✅ | ### 建议改进 | # | 问题 | 文件 | 说明 | |---|------|------|------| | 8 | get_conn TOCTOU 竞态 | mysql/mongo/redis `db.rs` | 释放锁后重建,可能重复创建连接 | | 9 | mysql `--config` 占用 `-c` | `mysql-proxy/src/main.rs:22` | 与 `--conn` 冲突 | | 10 | LogEntry 字段不一致 | 4 个 `logger.rs` | server/sql/rows/exitCode 各有缺失 | | 11 | logger.rs 等 ~300 行重复 | 4 个项目 | RequestLogger/LogEntry/辅助函数高度重复 | | 12 | ssh-proxy 无 SSH disconnect | `ssh-proxy/src/session.rs` | cleanup 只移除 HashMap 不发 disconnect | | 13 | 无 graceful shutdown | 4 个 `main.rs` | Ctrl+C 不等待进行中请求 | | 14 | redis-proxy 降级提示单行 | `redis-proxy/src/main.rs:52` | 其他 3 个用多行格式 | | 15 | mongo-proxy JSON 模式打印耗时 | `mongo-proxy/src/cli.rs:86` | 破坏 JSON 输出纯度 | | 16 | redis-proxy 无 JSON 输出 | `redis-proxy/src/cli.rs` | 其他 3 个都支持 -F json | | 17 | mongo insert/update 缺 usage 连接列表 | `mongo-proxy/src/handler.rs:224,256` | find/count 有但 insert/update 没有 | | 18 | ssh-proxy 未使用 russh-keys 依赖 | `ssh-proxy/Cargo.toml` | beta 版本,代码用 russh::keys | | 19 | tokio features = ["full"] 过宽 | 4 个 `Cargo.toml` | 实际只需 rt-multi-thread/net/time/sync | | 20 | 日志写入阻塞 tokio | 4 个 `logger.rs` | 同步 writeln 阻塞 worker 线程 | ### 代码度量 | 项目 | 行数 | 文件数 | 最长函数 | unwrap | clone | unsafe | |------|------|--------|---------|-------|-------| | mysql-proxy | 1,209 | 6 | query() 74行 | 10 | 18 | 0 | | ssh-proxy | 997 | 6 | exec() 49行 | 0 | 17 | 0 | | mongo-proxy | 1,422 | 6 | find() 38行 | 9 | 11 | 0 | | redis-proxy | 964 | 6 | run_cmd() 19行 | 10 | 30 | 0 | | **合计** | **4,592** | **24** | -- | **29** | **76** | **0** | > 无 unsafe 代码,无 TODO/FIXME,嵌套深度最大 3 层,函数最长 74 行。代码质量良好。 --- ## 已知问题 ### ssh-proxy - 暂无 (ed25519 已支持) ### mysql-proxy - 暂无 --- ## 待优化 - [ ] 提取 proxy-common 公共 crate (logger/config/error/cli 基础) - [ ] HTTP API 认证机制 (当前仅依赖 127.0.0.1 绑定) - [ ] SSH 主机密钥验证 (当前无条件信任) - [ ] redis-proxy 改用 redis::aio::ConnectionManager (避免 spawn_blocking) - [ ] 日志写入改为 channel + 后台线程 (避免阻塞 tokio) - [ ] 统一 graceful shutdown (with_graceful_shutdown) - [x] .gitignore 补充 mongo/redis 配置文件 - [x] redis/mongo URL 编码对齐 mysql