Files
2026-06-01 13:54:52 +08:00

339 lines
14 KiB
Markdown
Raw Permalink 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.
# 变更日志
<cite>
**本文引用的文件**
- [README.md](file://README.md)
- [Cargo.toml](file://Cargo.toml)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs)
- [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs)
- [crates/rcoder/src/handler/proxy_api.rs](file://crates/rcoder/src/handler/proxy_api.rs)
- [crates/pingora-proxy/src/lib.rs](file://crates/pingora-proxy/src/lib.rs)
- [crates/pingora-proxy/src/config.rs](file://crates/pingora-proxy/src/config.rs)
- [crates/docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs)
- [crates/docker_manager/src/types.rs](file://crates/docker_manager/src/types.rs)
- [specs/multi-docker-image-design.md](file://specs/multi-docker-image-design.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件旨在系统化梳理 RCoder 项目在版本迭代中的变更,围绕功能更新、缺陷修复与架构演进,结合代码库中的实际实现,解释变更日志在版本控制、升级路径与向后兼容性中的作用,并提供升级评估与问题排查的最佳实践。由于仓库未包含 CHANGELOG.md 文件,本文将基于现有 README 与源码,对 v0.1.0 版本的现状与关键特性进行总结,并给出面向未来的变更日志模板与生成建议,以便团队在后续版本中持续完善。
## 项目结构
RCoder 采用多 crate 的工作区组织,核心模块包括:
- 主应用与路由rcodes/rcoder
- Pingora 反向代理封装crates/pingora-proxy
- Docker 容器管理crates/docker_manager
- 共享类型与协议crates/shared_types
- 代理适配器与示例acp_adapter、claude-code-agent、codex-acp-agent 等
```mermaid
graph TB
subgraph "工作区"
A["crates/rcoder<br/>主应用/路由/配置/代理启动"]
B["crates/pingora-proxy<br/>Pingora 反向代理库"]
C["crates/docker_manager<br/>Docker 管理器/镜像选择/全局实例"]
D["crates/shared_types<br/>共享模型/多镜像配置"]
E["crates/acp_adapter<br/>ACP 协议适配"]
F["crates/claude-code-agent<br/>Claude 代理示例"]
G["crates/codex-acp-agent<br/>Codex 代理示例"]
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
```
图表来源
- [Cargo.toml](file://Cargo.toml#L1-L20)
- [README.md](file://README.md#L269-L378)
章节来源
- [Cargo.toml](file://Cargo.toml#L1-L20)
- [README.md](file://README.md#L269-L378)
## 核心组件
- 主应用与配置系统:命令行参数、环境变量、配置文件三段式优先级,支持代理与 Docker 配置的加载与覆盖。
- Pingora 反向代理Axum + Pingora 的双服务架构,主服务提供 API/SSEPingora 独立监听代理端口,路径前缀路由到目标后端。
- Docker 管理器:全局单例、镜像选择策略、容器生命周期管理、清理任务与网络/挂载配置。
- 共享类型:多镜像配置结构、服务类型枚举、镜像选择器与缓存策略。
章节来源
- [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L1-L120)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L160-L210)
- [crates/pingora-proxy/src/lib.rs](file://crates/pingora-proxy/src/lib.rs#L1-L120)
- [crates/docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs#L140-L211)
- [specs/multi-docker-image-design.md](file://specs/multi-docker-image-design.md#L40-L120)
## 架构总览
RCoder 采用“主服务 + Pingora 代理”的双服务架构:
- 主服务Axum提供健康检查、聊天、SSE 实时进度、代理状态/配置/统计等接口。
- Pingora 代理:独立监听代理端口,按路径前缀 /proxy/{port}/{path} 转发到指定后端,支持动态后端发现与健康检查。
```mermaid
graph TB
Client["客户端"] --> Axum["主服务(Axum)<br/>端口: config.port"]
Client --> Pingora["Pingora 代理<br/>端口: proxy_config.listen_port"]
Axum --> API["业务 API/SSE"]
Axum --> ProxyDocs["/proxy/* 文档接口"]
Pingora --> Backend["后端服务<br/>127.0.0.1:{port}"]
```
图表来源
- [README.md](file://README.md#L133-L206)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L52-L84)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
章节来源
- [README.md](file://README.md#L133-L206)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L52-L84)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
## 详细组件分析
### 变更日志模板与生成建议
为保证变更日志的可追溯性与可维护性,建议采用如下模板(示例,非仓库既有内容):
- 版本号vX.Y.Z
- 发布日期YYYY-MM-DD
- 关键变更
- 新增:新增 API 端点、代理支持类型扩展、配置系统优化、可观测性增强等
- 修复:缺陷修复、兼容性问题修正、性能回归修复等
- 变更:架构调整、依赖升级、行为变更、弃用项等
- 升级指引:影响范围、破坏性变更、迁移步骤、兼容性说明
- 问题排查:常见问题、诊断方法、相关日志位置
说明:本仓库未包含 CHANGELOG.md 文件,本文基于现有 README 与源码总结 v0.1.0 的现状与关键特性,作为后续版本变更日志的参考。
章节来源
- [README.md](file://README.md#L627-L652)
### v0.1.0 版本要点(基于现有 README 与源码)
- 新增功能
- 基于 ACP 协议的 AI 代理统一管理Codex、Claude Code
- HTTP API 接口与统一 SSE 进度流
- 多层配置系统(命令行 > 环境变量 > 配置文件 > 默认)
- OpenTelemetry 集成与分布式追踪
- Swagger UI API 文档
- 项目文件解析器Nuwax Parser
- 技术特性
- 基于 Rust 2024 Edition
- 异步架构Tokio
- 模块化设计Workspace Crates
- 实时通信SSE
- 结构化日志Tracing
章节来源
- [README.md](file://README.md#L627-L652)
### Pingora 反向代理能力与变更要点
- 能力概述
- 独立监听代理端口,路径前缀路由到目标后端
- 支持动态后端发现与健康检查
- 提供状态、配置、统计等查询接口Axum 文档接口)
- 关键实现
- 主应用在启动时根据配置创建 Pingora 服务器管理器,并在后台启动
- 路由中提供 /proxy/* 文档接口,真实代理请求需直接发送到 Pingora 端口
- 代理库提供便捷函数与错误类型,支持快速启动与错误处理
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Axum as "主服务(Axum)"
participant Router as "路由"
participant Pingora as "Pingora 代理"
participant Backend as "后端服务"
Client->>Axum : "GET /proxy/status"
Axum->>Router : "匹配 /proxy/*"
Router-->>Client : "返回状态/配置/统计(文档接口)"
Client->>Pingora : "GET /proxy/{port}/{path}"
Pingora->>Backend : "转发到 127.0.0.1 : {port}"
Backend-->>Pingora : "响应"
Pingora-->>Client : "返回代理响应"
```
图表来源
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L67-L79)
- [crates/rcoder/src/handler/proxy_api.rs](file://crates/rcoder/src/handler/proxy_api.rs#L1-L120)
- [crates/pingora-proxy/src/lib.rs](file://crates/pingora-proxy/src/lib.rs#L1-L120)
章节来源
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L67-L79)
- [crates/rcoder/src/handler/proxy_api.rs](file://crates/rcoder/src/handler/proxy_api.rs#L1-L120)
- [crates/pingora-proxy/src/lib.rs](file://crates/pingora-proxy/src/lib.rs#L1-L120)
### Docker 容器管理与镜像选择能力
- 能力概述
- 全局 DockerManager 单例,支持自动检测平台、镜像选择与缓存
- 多镜像配置结构支持服务类型rcoder/agent-runner与架构arm64/amd64选择
- 项目级镜像覆盖与环境变量注入
- 关键实现
- DockerManagerConfig 默认配置与全局初始化
- ImageSelector 选择策略ServiceOnly支持缓存与校验
- 容器生命周期管理、清理任务与网络/挂载配置
```mermaid
classDiagram
class DockerManager {
+new(config)
+create_container(config)
+get_multi_image_config()
}
class DockerManagerConfig {
+docker_host
+default_image
+default_platform
+default_network_mode
+default_work_dir
+auto_cleanup
+container_ttl_seconds
+multi_image_config
}
class ImageSelector {
+select_image(service_type, project_overrides)
+get_service_config(service_type)
}
class MultiImageConfig {
+services
+global_defaults
+selection_strategy
+cache_config
}
DockerManager --> DockerManagerConfig : "使用"
DockerManager --> ImageSelector : "创建并使用"
ImageSelector --> MultiImageConfig : "读取配置"
```
图表来源
- [crates/docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs#L140-L211)
- [crates/docker_manager/src/types.rs](file://crates/docker_manager/src/types.rs#L175-L233)
- [specs/multi-docker-image-design.md](file://specs/multi-docker-image-design.md#L120-L200)
章节来源
- [crates/docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs#L140-L211)
- [crates/docker_manager/src/types.rs](file://crates/docker_manager/src/types.rs#L175-L233)
- [specs/multi-docker-image-design.md](file://specs/multi-docker-image-design.md#L120-L200)
### 配置系统与升级影响评估
- 配置优先级
- 命令行参数 > 环境变量 > 配置文件 > 默认配置
- 代理配置
- 主应用根据命令行与配置文件决定是否启用 Pingora 代理及其监听端口、默认后端端口等
- 升级影响评估
- 若新增代理端口参数或健康检查配置项,需确保命令行与环境变量覆盖逻辑一致
- Docker 配置新增字段时,应提供默认值与校验逻辑,避免破坏性变更
```mermaid
flowchart TD
Start(["启动"]) --> ParseCLI["解析命令行参数"]
ParseCLI --> LoadFile["加载配置文件(若存在)"]
LoadFile --> ApplyEnv["应用环境变量覆盖"]
ApplyEnv --> MergeProxy["合并代理配置(端口/默认后端)"]
MergeProxy --> Validate["验证配置(含 Docker 多镜像)"]
Validate --> InitDocker["初始化 DockerManager(全局单例)"]
InitDocker --> StartProxy{"是否启用代理?"}
StartProxy --> |是| RunProxy["启动 Pingora 代理服务"]
StartProxy --> |否| RunMain["启动主服务(Axum)"]
RunProxy --> Done(["完成"])
RunMain --> Done
```
图表来源
- [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L253-L332)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
章节来源
- [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L253-L332)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
## 依赖关系分析
- 工作区与依赖
- 工作区包含多个 crate主应用默认成员包含 rcoder、agent_runner、shared_types、docker_manager、acp_adapter、claude-code-agent、pingora-proxy
- 依赖包括 axum、tokio、clap、utoipa、pingora、bollard 等
- 组件耦合
- rcoder 依赖 pingora-proxy 与 docker_manager通过配置与全局实例进行解耦
- 共享类型在 rcoder 与 docker_manager 之间传递,避免重复定义
```mermaid
graph LR
rcoder["rcoder"] --> pingora_proxy["pingora-proxy"]
rcoder --> docker_manager["docker_manager"]
rcoder --> shared_types["shared_types"]
docker_manager --> shared_types
```
图表来源
- [Cargo.toml](file://Cargo.toml#L1-L20)
章节来源
- [Cargo.toml](file://Cargo.toml#L1-L20)
## 性能考量
- 双服务架构
- 主服务与 Pingora 代理并行运行,互不阻塞,提高吞吐与隔离性
- 代理性能
- 基于 Rust 异步 I/O 的高性能代理,支持动态后端发现与健康检查
- 观测性
- OpenTelemetry 与 Tracing 集成,便于定位性能瓶颈与异常
章节来源
- [README.md](file://README.md#L133-L206)
- [crates/pingora-proxy/src/lib.rs](file://crates/pingora-proxy/src/lib.rs#L1-L120)
## 故障排查指南
- 代理请求未转发
- 确认请求是否发送到 Pingora 监听端口,而非主服务端口
- 检查路径前缀是否符合 /proxy/{port}/{path}
- 后端不可达
- 确认目标后端端口已启动且可访问
- Docker 相关
- 检查 Docker socket 路径、权限与挂载
- 查看全局 DockerManager 初始化日志与清理任务输出
章节来源
- [README.md](file://README.md#L193-L206)
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L322-L351)
## 结论
- v0.1.0 版本已具备核心能力:统一 AI 代理接入、HTTP API 与 SSE、Pingora 反向代理、Docker 容器管理与多镜像配置、可观测性与文档化。
- 变更日志应聚焦于功能新增、缺陷修复与架构变更,并提供升级指引与兼容性说明。
- 建议在后续版本中补充 CHANGELOG.md并建立自动化生成与校验流程确保变更可追溯、可审计。
## 附录
### 变更日志生成最佳实践
- 自动化生成
- 使用 Git 标签与提交信息生成候选条目
- 通过 CI 校验变更类型feat/fix/refactor/chore与语义化版本
- 人工审核
- 评审破坏性变更与迁移成本
- 补充升级指引与兼容性说明
- 模板字段
- 版本号、发布日期、变更类型、影响范围、修复问题、相关 PR/Issue
### 代码级变更示例(基于现有实现)
- 代理端口与默认后端端口
- 主应用根据配置创建 Pingora 服务器管理器并启动
- 路由提供 /proxy/* 文档接口,真实代理请求需直接发送到 Pingora 端口
- Docker 镜像选择
- ImageSelector 采用 ServiceOnly 策略,优先使用服务特定镜像,支持缓存与校验
- DockerManagerConfig 默认配置与全局初始化,支持项目级镜像覆盖
章节来源
- [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209)
- [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L67-L79)
- [specs/multi-docker-image-design.md](file://specs/multi-docker-image-design.md#L250-L415)