添加qiming-rcoder模块
This commit is contained in:
@@ -0,0 +1,328 @@
|
||||
# Docker Compose部署
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [Dockerfile](file://docker/Dockerfile)
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
- [config.yml](file://config.yml)
|
||||
- [README.md](file://README.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文档全面阐述了RCoder项目的Docker Compose部署方案。通过分析`docker-compose.yml`文件、构建脚本和部署流程,详细说明了一键部署的实现机制。文档涵盖了服务编排、环境配置、多环境差异、部署对比以及常见问题的排查方法,旨在为新手和经验丰富的运维人员提供完整的部署指导。
|
||||
|
||||
## 项目结构
|
||||
RCoder项目采用模块化设计,主要包含crates核心组件、docker部署脚本和配置文件。部署相关文件集中在docker目录下,包括Dockerfile、docker-compose.yml和一系列shell脚本。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "部署脚本"
|
||||
build[build.sh]
|
||||
deploy[deploy.sh]
|
||||
start[start-rcoder.sh]
|
||||
end
|
||||
subgraph "配置文件"
|
||||
compose[docker-compose.yml]
|
||||
dockerfile[Dockerfile]
|
||||
config[config.yml]
|
||||
end
|
||||
subgraph "核心代码"
|
||||
crates[crates/]
|
||||
end
|
||||
build --> dockerfile
|
||||
deploy --> compose
|
||||
deploy --> build
|
||||
start --> compose
|
||||
config --> compose
|
||||
compose --> dockerfile
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
**节源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
## 核心组件
|
||||
本节分析Docker Compose部署的核心组件,包括服务定义、构建流程和启动机制。通过环境变量注入、卷挂载和网络配置,实现了灵活的部署方案。
|
||||
|
||||
**节源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [Dockerfile](file://docker/Dockerfile)
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
|
||||
## 架构概述
|
||||
RCoder的Docker Compose部署采用单服务架构,主服务rcoder包含所有必要组件。部署架构通过分层设计实现了构建、部署和运行的分离。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[用户] --> B[deploy.sh]
|
||||
B --> C{镜像存在?}
|
||||
C --> |否| D[build.sh]
|
||||
C --> |是| E[docker-compose up]
|
||||
D --> F[Docker构建]
|
||||
F --> G[rcoder镜像]
|
||||
G --> E
|
||||
E --> H[rcoder容器]
|
||||
H --> I[项目工作目录]
|
||||
H --> J[Docker Socket]
|
||||
H --> K[日志目录]
|
||||
style H fill:#f9f,stroke:#333
|
||||
style I fill:#bbf,stroke:#333
|
||||
style J fill:#f96,stroke:#333
|
||||
style K fill:#6f9,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
## 详细组件分析
|
||||
### Docker Compose配置分析
|
||||
`docker-compose.yml`文件定义了rcoder服务的完整配置,包括镜像、端口、环境变量、卷挂载和健康检查。
|
||||
|
||||
#### 服务定义
|
||||
```mermaid
|
||||
classDiagram
|
||||
class RcoderService {
|
||||
+image : string
|
||||
+ports : array
|
||||
+environment : array
|
||||
+volumes : array
|
||||
+command : array
|
||||
+healthcheck : object
|
||||
+restart : string
|
||||
+networks : array
|
||||
}
|
||||
RcoderService : "使用" --> DockerSocket
|
||||
RcoderService : "挂载" --> ProjectWorkspace
|
||||
RcoderService : "挂载" --> Logs
|
||||
RcoderService : "挂载" --> Specs
|
||||
RcoderService : "连接" --> AgentNetwork
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
#### 环境变量配置
|
||||
服务通过环境变量实现灵活配置,支持默认值和变量替换机制。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([启动]) --> TZ["设置时区: Asia/Shanghai"]
|
||||
TZ --> RUST_LOG["设置日志级别: debug"]
|
||||
RUST_LOG --> RCODER_PORT["设置服务端口: ${RCODER_PORT:-8087}"]
|
||||
RCODER_PORT --> DOCKER_SOCKET["设置Docker Socket路径"]
|
||||
DOCKER_SOCKET --> End([配置完成])
|
||||
style Start fill:#f9f,stroke:#333
|
||||
style End fill:#f9f,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
### 构建与部署流程
|
||||
#### 构建脚本分析
|
||||
`build.sh`脚本实现了镜像的自动化构建流程,包含错误检查和构建成功提示。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User
|
||||
participant BuildScript
|
||||
participant Docker
|
||||
User->>BuildScript : 执行 ./build.sh
|
||||
BuildScript->>BuildScript : 检查 docker-compose.yml
|
||||
alt 文件存在
|
||||
BuildScript->>Docker : docker build 命令
|
||||
Docker-->>BuildScript : 构建结果
|
||||
alt 构建成功
|
||||
BuildScript-->>User : 显示成功信息
|
||||
else 构建失败
|
||||
BuildScript-->>User : 显示失败信息并退出
|
||||
end
|
||||
else 文件不存在
|
||||
BuildScript-->>User : 显示错误并退出
|
||||
end
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
|
||||
#### 部署脚本分析
|
||||
`deploy.sh`脚本实现了完整的部署流程,包括依赖检查、镜像构建和容器启动。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User
|
||||
participant DeployScript
|
||||
participant BuildScript
|
||||
participant DockerCompose
|
||||
User->>DeployScript : 执行 ./deploy.sh
|
||||
DeployScript->>DeployScript : 检查必要文件
|
||||
alt 文件完整
|
||||
DeployScript->>DeployScript : 检查镜像存在
|
||||
alt 镜像不存在
|
||||
DeployScript->>BuildScript : 调用 ./build.sh
|
||||
BuildScript-->>DeployScript : 构建结果
|
||||
alt 构建失败
|
||||
DeployScript-->>User : 显示失败信息
|
||||
end
|
||||
end
|
||||
DeployScript->>DockerCompose : docker-compose up -d
|
||||
DockerCompose-->>DeployScript : 启动结果
|
||||
alt 启动成功
|
||||
DeployScript-->>User : 显示成功信息和管理命令
|
||||
else 启动失败
|
||||
DeployScript-->>User : 显示失败信息
|
||||
end
|
||||
else 文件缺失
|
||||
DeployScript-->>User : 显示错误并退出
|
||||
end
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
|
||||
### 启动脚本分析
|
||||
`start-rcoder.sh`脚本负责容器内的服务启动和环境初始化。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[启动脚本] --> B[设置环境变量]
|
||||
B --> C[创建必要目录]
|
||||
C --> D[显示环境配置]
|
||||
D --> E[启动rcoder服务]
|
||||
E --> F[执行rcoder二进制]
|
||||
style A fill:#f9f,stroke:#333
|
||||
style F fill:#f9f,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
|
||||
## 依赖分析
|
||||
### 服务依赖关系
|
||||
RCoder服务依赖于宿主机的Docker守护进程,通过挂载Docker Socket实现容器管理功能。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
RcoderService --> DockerDaemon
|
||||
DockerDaemon --> HostSystem
|
||||
RcoderService --> ProjectWorkspace
|
||||
RcoderService --> LogStorage
|
||||
RcoderService --> SpecFiles
|
||||
style RcoderService fill:#f9f,stroke:#333
|
||||
style DockerDaemon fill:#f96,stroke:#333
|
||||
style HostSystem fill:#bbf,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [config.yml](file://config.yml)
|
||||
|
||||
### 配置文件依赖
|
||||
系统通过多层配置机制实现灵活的环境适配,优先级从高到低为:命令行参数 > 环境变量 > 配置文件 > 默认值。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[命令行参数] --> B[环境变量]
|
||||
B --> C[config.yml]
|
||||
C --> D[默认配置]
|
||||
D --> E[应用]
|
||||
style A fill:#f96,stroke:#333
|
||||
style B fill:#f96,stroke:#333
|
||||
style C fill:#f96,stroke:#333
|
||||
style D fill:#f96,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [config.yml](file://config.yml)
|
||||
- [README.md](file://README.md)
|
||||
|
||||
## 性能考虑
|
||||
Docker Compose部署方案在性能方面具有以下特点:
|
||||
- **启动时间**:由于需要拉取镜像和启动容器,首次启动时间较长
|
||||
- **资源占用**:容器化部署增加了少量资源开销,但提供了更好的隔离性
|
||||
- **网络性能**:通过端口映射和内部网络通信,网络延迟极低
|
||||
- **存储性能**:使用卷挂载,文件I/O性能接近原生
|
||||
|
||||
对于生产环境,建议:
|
||||
1. 预先构建镜像以减少部署时间
|
||||
2. 配置适当的资源限制防止资源耗尽
|
||||
3. 使用持久化存储确保数据安全
|
||||
4. 启用健康检查确保服务可用性
|
||||
|
||||
## 故障排除指南
|
||||
### 常见问题及解决方案
|
||||
#### 服务启动失败
|
||||
**可能原因**:
|
||||
- 必要文件缺失
|
||||
- 镜像构建失败
|
||||
- 端口被占用
|
||||
- Docker Socket权限不足
|
||||
|
||||
**解决方案**:
|
||||
1. 检查`docker-compose.yml`和`Dockerfile`是否存在
|
||||
2. 确认Docker服务正在运行
|
||||
3. 检查8087端口是否被其他进程占用
|
||||
4. 确保用户有访问`/var/run/docker.sock`的权限
|
||||
|
||||
#### 网络连接超时
|
||||
**可能原因**:
|
||||
- 容器网络配置错误
|
||||
- 防火墙阻止连接
|
||||
- 服务未正确启动
|
||||
|
||||
**解决方案**:
|
||||
1. 检查`docker-compose.yml`中的网络配置
|
||||
2. 验证容器是否在`agent-network`网络中
|
||||
3. 使用`docker logs`查看服务日志
|
||||
4. 检查防火墙设置
|
||||
|
||||
#### 配置加载异常
|
||||
**可能原因**:
|
||||
- 环境变量未正确设置
|
||||
- 配置文件格式错误
|
||||
- 卷挂载路径不正确
|
||||
|
||||
**解决方案**:
|
||||
1. 检查`deploy.sh`中的环境变量设置
|
||||
2. 验证`config.yml`的YAML格式
|
||||
3. 确认卷挂载路径在宿主机上存在
|
||||
4. 使用`docker exec`进入容器验证配置文件位置
|
||||
|
||||
**节源**
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [config.yml](file://config.yml)
|
||||
|
||||
## 结论
|
||||
RCoder的Docker Compose部署方案提供了一套完整、可靠的部署机制。通过`build.sh`和`deploy.sh`脚本实现了一键部署,降低了部署复杂度。`docker-compose.yml`文件清晰地定义了服务配置,包括端口映射、卷挂载和环境变量注入。
|
||||
|
||||
与独立Docker部署相比,Docker Compose方案具有以下优势:
|
||||
- **简化管理**:通过单一配置文件管理多个服务
|
||||
- **环境一致性**:确保开发、测试和生产环境的一致性
|
||||
- **依赖管理**:自动处理服务间的依赖关系
|
||||
- **可移植性**:配置文件可在不同环境中复用
|
||||
|
||||
对于高级用户,可以进一步集成监控系统、实现自动化CI/CD流水线,并配置高可用集群以满足生产环境需求。
|
||||
320
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/Docker部署.md
Normal file
320
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/Docker部署.md
Normal file
@@ -0,0 +1,320 @@
|
||||
# Docker部署
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Dockerfile](file://docker/Dockerfile)
|
||||
- [build-docker-image.sh](file://docker/scripts/build-docker-image.sh)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [.dockerignore](file://.dockerignore)
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh)
|
||||
- [generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh)
|
||||
- [diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh)
|
||||
- [config.yml](file://config.yml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文档详细介绍了Rcoder项目的Docker部署方案。文档深入解析了多阶段构建过程、基础镜像选择、依赖安装和二进制文件复制策略。通过实际代码库中的具体示例,展示了构建脚本`build-docker-image.sh`的使用方法和参数配置。文档还记录了环境变量、挂载卷和网络配置的最佳实践,解释了Docker部署与rcoder主服务的集成关系,并提供了常见构建失败、权限问题和容器启动错误的解决方案。为初学者提供逐步指导的同时,也为高级用户提供性能优化和安全加固建议。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Docker["Docker 部署"]
|
||||
Docker --> Scripts["docker/scripts/"]
|
||||
Docker --> Config["docker/"]
|
||||
Docker --> Root["项目根目录"]
|
||||
Scripts --> build_image["build-docker-image.sh"]
|
||||
Scripts --> deploy["deploy.sh"]
|
||||
Scripts --> start["start-rcoder.sh"]
|
||||
Scripts --> analyze["analyze-rcoder.sh"]
|
||||
Scripts --> diagnose["diagnose-blocking.sh"]
|
||||
Scripts --> flamegraph["generate-flamegraph.sh"]
|
||||
Config --> Dockerfile["Dockerfile"]
|
||||
Config --> compose["docker-compose.yml"]
|
||||
Config --> start_script["start-rcoder.sh"]
|
||||
Root --> dockerignore[".dockerignore"]
|
||||
Root --> service_script["rcoder-service.sh"]
|
||||
Root --> config["config.yml"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/](file://docker/scripts/)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/](file://docker/scripts/)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
## 核心组件
|
||||
|
||||
本文档的核心组件包括Docker多阶段构建系统、调试工具集、部署脚本和配置管理。Dockerfile采用多阶段构建策略,分离编译和运行环境,确保生产镜像的轻量化和安全性。构建脚本`build-docker-image.sh`自动化了镜像构建流程,而`deploy.sh`脚本则提供了完整的部署解决方案。调试工具集包括`analyze-rcoder.sh`、`diagnose-blocking.sh`和`generate-flamegraph.sh`,为生产环境的问题诊断提供了强大支持。
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh)
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
## 架构概述
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Build["构建阶段"]
|
||||
Runtime["运行时阶段"]
|
||||
Deployment["部署阶段"]
|
||||
Debug["调试工具"]
|
||||
Build --> |"FROM rust:1.90-bookworm AS builder"| Builder["编译器镜像"]
|
||||
Builder --> |"cargo build --release"| Binary["rcoder 二进制"]
|
||||
Runtime --> |"FROM rust:1.90-bookworm"| RuntimeImage["运行时镜像"]
|
||||
RuntimeImage --> |"COPY --from=builder"| CopyBinary["复制二进制"]
|
||||
RuntimeImage --> |"安装调试工具"| DebugTools["调试工具集"]
|
||||
RuntimeImage --> |"创建用户和目录"| Setup["环境设置"]
|
||||
Deployment --> |"docker-compose up"| Container["容器实例"]
|
||||
Container --> |"挂载卷"| Volumes["卷挂载"]
|
||||
Container --> |"环境变量"| Env["环境配置"]
|
||||
Container --> |"网络配置"| Network["网络设置"]
|
||||
Debug --> |"analyze-rcoder"| Process["进程分析"]
|
||||
Debug --> |"diagnose-blocking"| Blocking["阻塞诊断"]
|
||||
Debug --> |"generate-flamegraph"| Performance["性能分析"]
|
||||
Build --> Runtime
|
||||
Runtime --> Deployment
|
||||
Deployment --> Debug
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [docker/scripts/](file://docker/scripts/)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Docker多阶段构建分析
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Stage1["构建阶段"]
|
||||
Stage2["运行时阶段"]
|
||||
subgraph Stage1
|
||||
A["基础镜像: rust:1.90-bookworm"]
|
||||
B["安装编译依赖"]
|
||||
C["复制源码"]
|
||||
D["编译release版本"]
|
||||
E["安装Rust调试工具"]
|
||||
A --> B --> C --> D --> E
|
||||
end
|
||||
subgraph Stage2
|
||||
F["基础镜像: rust:1.90-bookworm"]
|
||||
G["设置环境变量"]
|
||||
H["安装运行时和调试依赖"]
|
||||
I["创建应用用户和目录"]
|
||||
J["从构建阶段复制二进制"]
|
||||
K["复制启动脚本"]
|
||||
L["创建调试工具脚本"]
|
||||
M["设置工作目录和权限"]
|
||||
N["暴露端口"]
|
||||
O["健康检查"]
|
||||
P["启动命令"]
|
||||
F --> G --> H --> I --> J --> K --> L --> M --> N --> O --> P
|
||||
end
|
||||
E --> |"COPY --from=builder"| J
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L12-L304)
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L12-L304)
|
||||
|
||||
### 构建脚本分析
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start["开始构建"]
|
||||
Start --> Check["检查Dockerfile存在"]
|
||||
Check --> |"存在"| BuildBinary["构建rcoder二进制"]
|
||||
Check --> |"不存在"| Error1["报错退出"]
|
||||
BuildBinary --> |"成功"| BuildImage["构建Docker镜像"]
|
||||
BuildBinary --> |"失败"| Error2["报错退出"]
|
||||
BuildImage --> |"成功"| Success["构建成功"]
|
||||
BuildImage --> |"失败"| Error3["报错退出"]
|
||||
Success --> Info["显示使用方式"]
|
||||
Info --> End["结束"]
|
||||
Error1 --> End
|
||||
Error2 --> End
|
||||
Error3 --> End
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh#L1-L38)
|
||||
|
||||
**本节来源**
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh#L1-L38)
|
||||
|
||||
### 部署脚本分析
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start["开始部署"]
|
||||
Start --> CheckFiles["检查必要文件"]
|
||||
CheckFiles --> |"存在"| CheckImage["检查镜像是否存在"]
|
||||
CheckFiles --> |"不存在"| Error1["报错退出"]
|
||||
CheckImage --> |"存在"| StartService["启动服务"]
|
||||
CheckImage --> |"不存在"| BuildImage["构建镜像"]
|
||||
BuildImage --> |"成功"| StartService
|
||||
BuildImage --> |"失败"| Error2["报错退出"]
|
||||
StartService --> |"成功"| Success["部署成功"]
|
||||
StartService --> |"失败"| Error3["报错退出"]
|
||||
Success --> Commands["显示管理命令"]
|
||||
Commands --> End["结束"]
|
||||
Error1 --> End
|
||||
Error2 --> End
|
||||
Error3 --> End
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh#L1-L42)
|
||||
|
||||
**本节来源**
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh#L1-L42)
|
||||
|
||||
### 调试工具分析
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
DebugTools["调试工具集"]
|
||||
DebugTools --> Analyze["analyze-rcoder.sh"]
|
||||
DebugTools --> Diagnose["diagnose-blocking.sh"]
|
||||
DebugTools --> Flamegraph["generate-flamegraph.sh"]
|
||||
Analyze --> |"功能"| A1["进程基本信息"]
|
||||
Analyze --> |"功能"| A2["线程状态"]
|
||||
Analyze --> |"功能"| A3["网络连接"]
|
||||
Analyze --> |"功能"| A4["文件描述符"]
|
||||
Analyze --> |"功能"| A5["内存使用"]
|
||||
Diagnose --> |"功能"| D1["进程状态"]
|
||||
Diagnose --> |"功能"| D2["网络队列"]
|
||||
Diagnose --> |"功能"| D3["阻塞线程"]
|
||||
Diagnose --> |"功能"| D4["系统资源"]
|
||||
Diagnose --> |"功能"| D5["错误日志"]
|
||||
Diagnose --> |"功能"| D6["死锁检查"]
|
||||
Flamegraph --> |"功能"| F1["性能采样"]
|
||||
Flamegraph --> |"功能"| F2["火焰图生成"]
|
||||
Flamegraph --> |"功能"| F3["结果分析"]
|
||||
Flamegraph --> |"功能"| F4["问题定位"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/scripts/analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh)
|
||||
- [docker/scripts/diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh)
|
||||
- [docker/scripts/generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh)
|
||||
|
||||
**本节来源**
|
||||
- [docker/scripts/analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh)
|
||||
- [docker/scripts/diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh)
|
||||
- [docker/scripts/generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Dockerfile --> rust["rust:1.90-bookworm"]
|
||||
Dockerfile --> cargo["Cargo"]
|
||||
Dockerfile --> apt["apt-get"]
|
||||
build_script --> docker["Docker"]
|
||||
build_script --> cargo["Cargo"]
|
||||
deploy_script --> docker_compose["docker-compose"]
|
||||
deploy_script --> build_script["build.sh"]
|
||||
start_script --> rcoder["rcoder 二进制"]
|
||||
start_script --> bash["bash"]
|
||||
config --> yaml["YAML"]
|
||||
rust --> openssl["libssl-dev"]
|
||||
rust --> protobuf["protobuf-compiler"]
|
||||
rust --> build_essential["build-essential"]
|
||||
runtime --> curl["curl"]
|
||||
runtime --> jq["jq"]
|
||||
runtime --> gdb["gdb"]
|
||||
runtime --> strace["strace"]
|
||||
runtime --> htop["htop"]
|
||||
runtime --> tcpdump["tcpdump"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh)
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh)
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
Rcoder的Docker部署在性能方面进行了多项优化。多阶段构建确保了运行时镜像的轻量化,减少了攻击面和启动时间。调试镜像包含了完整的性能分析工具集,包括`perf`、`flamegraph`和`strace`,可以进行深入的性能分析。`generate-flamegraph.sh`脚本自动化了火焰图的生成过程,帮助开发者快速定位性能瓶颈。`diagnose-blocking.sh`脚本专门用于诊断阻塞问题,通过分析线程状态和系统调用,快速发现潜在的性能问题。
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/scripts/generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh)
|
||||
- [docker/scripts/diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见构建失败解决方案
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
BuildFail["构建失败"]
|
||||
BuildFail --> CheckDockerfile["检查Dockerfile存在"]
|
||||
CheckDockerfile --> |"不存在"| CreateDockerfile["创建Dockerfile"]
|
||||
CheckDockerfile --> |"存在"| CheckNetwork["检查网络连接"]
|
||||
CheckNetwork --> |"连接失败"| FixNetwork["修复网络"]
|
||||
CheckNetwork --> |"连接正常"| CheckDependencies["检查依赖"]
|
||||
CheckDependencies --> |"依赖缺失"| InstallDependencies["安装依赖"]
|
||||
CheckDependencies --> |"依赖完整"| CheckSource["检查源码"]
|
||||
CheckSource --> |"源码损坏"| RestoreSource["恢复源码"]
|
||||
CheckSource --> |"源码正常"| CheckDisk["检查磁盘空间"]
|
||||
CheckDisk --> |"空间不足"| FreeSpace["清理空间"]
|
||||
CheckDisk --> |"空间充足"| CheckPermissions["检查权限"]
|
||||
CheckPermissions --> |"权限不足"| FixPermissions["修复权限"]
|
||||
CheckPermissions --> |"权限正常"| CheckConfig["检查配置"]
|
||||
CheckConfig --> |"配置错误"| FixConfig["修复配置"]
|
||||
CheckConfig --> |"配置正确"| SeekHelp["寻求帮助"]
|
||||
```
|
||||
|
||||
**本节来源**
|
||||
- [docker/scripts/build-docker-image.sh](file://docker/scripts/build-docker-image.sh)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
|
||||
### 权限问题解决方案
|
||||
|
||||
当遇到权限问题时,首先检查Docker守护进程是否正在运行,并确保当前用户有权限访问Docker socket。如果使用`sudo`运行Docker命令,考虑将用户添加到`docker`组以避免权限问题。对于容器内部的权限问题,检查Dockerfile中是否正确创建了应用用户,并确保挂载卷的权限设置正确。
|
||||
|
||||
**本节来源**
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml)
|
||||
|
||||
### 容器启动错误解决方案
|
||||
|
||||
容器启动错误可能由多种原因引起。首先检查`docker-compose.yml`文件中的配置是否正确,特别是端口映射和卷挂载。使用`docker logs`命令查看容器日志,定位具体的错误信息。如果遇到依赖缺失问题,确保所有必要的依赖都已正确安装。对于网络问题,检查容器的网络配置和防火墙设置。
|
||||
|
||||
**本节来源**
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [docker/scripts/deploy.sh](file://docker/scripts/deploy.sh)
|
||||
|
||||
## 结论
|
||||
|
||||
Rcoder项目的Docker部署方案设计精良,采用了多阶段构建策略,确保了生产环境的安全性和效率。调试镜像包含了丰富的诊断工具,为生产环境的问题排查提供了强大支持。构建和部署脚本自动化了整个流程,降低了人为错误的风险。通过合理的配置管理和卷挂载策略,实现了配置与代码的分离,提高了部署的灵活性。整体方案既适合初学者快速上手,也为高级用户提供了深入优化和调试的可能性。
|
||||
296
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/systemd服务管理.md
Normal file
296
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/systemd服务管理.md
Normal file
@@ -0,0 +1,296 @@
|
||||
# systemd服务管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [rcoder-service.sh](file://rcoder-service.sh)
|
||||
- [README.md](file://README.md)
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [Cargo.toml](file://Cargo.toml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向运维与开发团队,系统性阐述如何将 rcoder 服务通过 systemd 进行开机自启、自动重启与状态监控,并结合仓库内的脚本与配置,给出完整的集成方案与最佳实践。重点覆盖:
|
||||
- rcoder-service.sh 与 systemd 的集成方式与差异
|
||||
- systemd 服务单元文件的编写要点([Service]、[Install]、[Timer])
|
||||
- start-rcoder.sh 在 systemd 上下文中的执行流程与环境准备
|
||||
- 日志查看、状态查询与故障排查的标准操作
|
||||
- 权限管理、资源限制与安全沙箱的配置建议
|
||||
- 常见问题(启动失败、权限不足、依赖未就绪)的定位与解决
|
||||
|
||||
## 项目结构
|
||||
围绕 systemd 集成的关键文件与位置如下:
|
||||
- systemd 服务单元示例位于 README.md 中,提供标准的 [Unit]/[Service]/[Install] 配置模板
|
||||
- rcoder-service.sh 是传统“手动服务管理脚本”,用于本地或非 systemd 场景
|
||||
- docker/scripts/start-rcoder.sh 是容器场景下的启动脚本,展示环境变量与工作目录准备
|
||||
- docker/Dockerfile 与 docker/docker-compose.yml 展示了容器内健康检查与重启策略
|
||||
- Cargo.toml 描述了项目依赖与运行时特性,有助于理解 systemd 下的运行环境
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["系统服务管理<br/>systemd"] --> B["rcoder 服务单元<br/>rcoder.service"]
|
||||
B --> C["可执行文件<br/>/opt/rcoder/target/release/rcoder"]
|
||||
B --> D["工作目录<br/>/opt/rcoder"]
|
||||
B --> E["环境变量<br/>RUST_LOG, RCODER_PORT 等"]
|
||||
F["rcoder-service.sh<br/>本地脚本管理"] -.-> C
|
||||
G["docker/scripts/start-rcoder.sh<br/>容器启动脚本"] -.-> C
|
||||
H["docker/Dockerfile<br/>健康检查/暴露端口"] --> I["健康检查<br/>/health"]
|
||||
J["docker/docker-compose.yml<br/>重启策略/restart: always"] --> B
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L134-L191)
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh#L1-L23)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L293-L304)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml#L30-L33)
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L1-L328)
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh#L1-L23)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L293-L304)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml#L30-L33)
|
||||
|
||||
## 核心组件
|
||||
- systemd 服务单元:定义服务行为、用户、工作目录、环境变量、重启策略与安装目标
|
||||
- rcoder-service.sh:提供 start/stop/restart/status 的本地脚本化管理,适合非 systemd 场景
|
||||
- start-rcoder.sh:容器内启动脚本,负责环境变量注入、目录创建与执行 rcoder
|
||||
- 健康检查与重启策略:Dockerfile 的 HEALTHCHECK 与 docker-compose.yml 的 restart: always 体现容器层面的自愈能力
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L134-L284)
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh#L1-L23)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L293-L304)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml#L30-L33)
|
||||
|
||||
## 架构总览
|
||||
下图展示了 systemd 与 rcoder 的典型交互:systemd 启动 rcoder,rcoder 通过健康检查对外提供服务;容器场景下,start-rcoder.sh 负责环境准备与进程启动。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant OS as "操作系统"
|
||||
participant SD as "systemd"
|
||||
participant SVC as "rcoder.service"
|
||||
participant BIN as "rcoder 可执行文件"
|
||||
participant LOG as "日志文件"
|
||||
participant NET as "网络端口"
|
||||
OS->>SD : "enable/start"
|
||||
SD->>SVC : "加载单元并初始化"
|
||||
SVC->>BIN : "ExecStart 启动进程"
|
||||
BIN->>LOG : "写入日志"
|
||||
BIN->>NET : "监听端口"
|
||||
SVC-->>SD : "健康检查通过/失败"
|
||||
SD-->>OS : "自动重启/通知"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L293-L304)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### systemd 服务单元文件编写指南
|
||||
- [Unit]:描述服务元信息与依赖时机
|
||||
- Description:服务描述
|
||||
- After:在网络就绪后再启动
|
||||
- [Service]:核心执行与生命周期控制
|
||||
- Type:simple(systemd 直接管理 ExecStart 进程)
|
||||
- User:指定运行用户(建议独立非 root 用户)
|
||||
- WorkingDirectory:工作目录(存放配置、日志、PID 文件)
|
||||
- ExecStart:启动命令(建议使用绝对路径)
|
||||
- Restart:always(异常退出后自动重启)
|
||||
- RestartSec:重启间隔(避免频繁抖动)
|
||||
- Environment:注入日志级别、端口等环境变量
|
||||
- [Install]:安装目标
|
||||
- WantedBy:multi-user.target(多用户运行级别)
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
|
||||
### rcoder-service.sh 与 systemd 的差异与迁移建议
|
||||
- rcoder-service.sh 的职责
|
||||
- 依赖检查(可执行文件、Bun/NPM 等)
|
||||
- PID 文件管理与进程状态判断
|
||||
- 日志输出与错误提示
|
||||
- 启停与状态查询
|
||||
- 与 systemd 的差异
|
||||
- rcoder-service.sh 为“前台”脚本,systemd 期望“后台”守护进程
|
||||
- rcoder-service.sh 自带 nohup 与日志重定向,systemd 通过 StandardOutput/StandardError 管理日志
|
||||
- rcoder-service.sh 依赖本地 PATH 与工作目录,systemd 通过 WorkingDirectory 与 Environment 管理
|
||||
- 迁移建议
|
||||
- 若仍使用 rcoder-service.sh,建议将其作为 ExecStart 的入口脚本,但需确保其按 systemd 期望的“后台”方式运行
|
||||
- 更推荐直接使用 ExecStart 指向 rcoder 可执行文件,并通过 Environment 注入所需变量
|
||||
|
||||
章节来源
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L68-L103)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L134-L191)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L193-L236)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L246-L284)
|
||||
|
||||
### start-rcoder.sh 在 systemd 上下文中的执行流程与环境准备
|
||||
- 环境变量准备
|
||||
- RUST_LOG:日志级别
|
||||
- PORT:服务端口
|
||||
- DOCKER_SOCKET_PATH:Docker 套接字路径
|
||||
- RCODER_WORKSPACE:工作区目录
|
||||
- 目录创建
|
||||
- logs 与 workspace 目录确保存在
|
||||
- 启动 rcoder
|
||||
- 使用 exec 方式启动,使 systemd 能正确接管进程
|
||||
- 通过 -- 参数传递端口给 rcoder
|
||||
|
||||
章节来源
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh#L1-L23)
|
||||
|
||||
### systemd 与容器场景的协同
|
||||
- docker/Dockerfile
|
||||
- EXPOSE 暴露端口(含 tokio-console 端口)
|
||||
- HEALTHCHECK 对 /health 进行健康检查
|
||||
- docker/docker-compose.yml
|
||||
- restart: always 提供容器层面的自愈
|
||||
- 健康检查与端口映射配合 systemd 的外部可用性
|
||||
|
||||
章节来源
|
||||
- [docker/Dockerfile](file://docker/Dockerfile#L293-L304)
|
||||
- [docker/docker-compose.yml](file://docker/docker-compose.yml#L30-L33)
|
||||
|
||||
## 依赖关系分析
|
||||
- rcoder 服务对运行时环境的依赖
|
||||
- Rust 运行时与日志库(tracing、tracing-subscriber)
|
||||
- HTTP 与异步运行时(tokio、axum、tower)
|
||||
- OpenTelemetry 与 Tokio Console(可选)
|
||||
- systemd 对服务的依赖
|
||||
- 可执行文件路径与权限
|
||||
- 工作目录与日志目录的可写权限
|
||||
- 环境变量(端口、日志级别、Docker 套接字等)
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A["rcoder 可执行文件"] --> B["HTTP 服务<br/>端口监听"]
|
||||
A --> C["日志系统<br/>tracing/tracing-subscriber"]
|
||||
A --> D["异步运行时<br/>tokio/axum/tower"]
|
||||
A --> E["可观测性<br/>OpenTelemetry/Tokio Console"]
|
||||
F["systemd"] --> A
|
||||
F --> G["工作目录/日志目录"]
|
||||
F --> H["环境变量"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Cargo.toml](file://Cargo.toml#L54-L102)
|
||||
- [Cargo.toml](file://Cargo.toml#L92-L102)
|
||||
- [Cargo.toml](file://Cargo.toml#L199-L205)
|
||||
|
||||
章节来源
|
||||
- [Cargo.toml](file://Cargo.toml#L54-L102)
|
||||
- [Cargo.toml](file://Cargo.toml#L92-L102)
|
||||
- [Cargo.toml](file://Cargo.toml#L199-L205)
|
||||
|
||||
## 性能考虑
|
||||
- 日志级别与性能
|
||||
- RUST_LOG=info 适合生产;debug 会增加 IO 与 CPU 开销
|
||||
- 端口与网络
|
||||
- 确保端口未被占用;合理规划防火墙规则
|
||||
- 健康检查与重启
|
||||
- HEALTHCHECK 与 restart: always 可提升可用性,但需避免过度重启导致抖动
|
||||
- 资源限制
|
||||
- systemd 可通过 LimitNOFILE、LimitMEM/CPU 等进行资源约束(建议在单元文件中配置)
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 启动失败
|
||||
- 检查 ExecStart 路径与权限
|
||||
- 查看日志:journalctl -u rcoder -f
|
||||
- 验证环境变量是否正确注入
|
||||
- 权限不足
|
||||
- 确认 User 拥有工作目录与日志目录的读写权限
|
||||
- 端口是否需要 root 权限(建议使用非特权端口)
|
||||
- 依赖服务未就绪
|
||||
- 使用 After=network.target 等依赖时机
|
||||
- 在容器场景下,确认 Docker 套接字挂载与权限
|
||||
- 日志查看与状态查询
|
||||
- 日志:journalctl -u rcoder -n 100
|
||||
- 状态:systemctl status rcoder
|
||||
- 启停:systemctl start/stop/restart rcoder
|
||||
- 常见问题定位
|
||||
- 端口占用:调整 RCODER_PORT 或停止占用进程
|
||||
- 端口被占用:参考 README 中的端口调整示例
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L134-L191)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L193-L236)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L246-L284)
|
||||
|
||||
## 结论
|
||||
- systemd 集成 rcoder 的关键在于:明确的单元文件、正确的 ExecStart、合理的环境变量与工作目录、以及可靠的健康检查与重启策略
|
||||
- 若采用容器部署,start-rcoder.sh 提供了清晰的环境准备与启动流程,可作为 systemd ExecStart 的入口脚本
|
||||
- 生产环境中建议结合日志级别控制、资源限制与健康检查,确保服务稳定与可观测
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### systemd 服务单元文件编写示例(基于仓库内容)
|
||||
- [Unit]
|
||||
- Description:RCoder AI Development Platform
|
||||
- After:network.target
|
||||
- [Service]
|
||||
- Type:simple
|
||||
- User:rcoder
|
||||
- WorkingDirectory:/opt/rcoder
|
||||
- ExecStart:/opt/rcoder/target/release/rcoder --port 3000
|
||||
- Restart:always
|
||||
- RestartSec:5
|
||||
- Environment:RUST_LOG=info;RCODER_PORT=3000
|
||||
- [Install]
|
||||
- WantedBy:multi-user.target
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
|
||||
### start-rcoder.sh 在 systemd 上下文中的执行流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 systemd"]) --> Prep["准备环境变量<br/>RUST_LOG/PORT/DOCKER_SOCKET_PATH/RCODER_WORKSPACE"]
|
||||
Prep --> Mkdir["创建日志与工作目录"]
|
||||
Mkdir --> Exec["exec 启动 rcoder<br/>传递端口参数"]
|
||||
Exec --> Done(["进程由 systemd 管理"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [docker/scripts/start-rcoder.sh](file://docker/scripts/start-rcoder.sh#L1-L23)
|
||||
|
||||
### 日志查看、状态查询与故障排查标准操作
|
||||
- 日志查看
|
||||
- journalctl -u rcoder -f
|
||||
- journalctl -u rcoder -n 100
|
||||
- 状态查询
|
||||
- systemctl status rcoder
|
||||
- 启停控制
|
||||
- systemctl start/stop/restart rcoder
|
||||
- 常见问题
|
||||
- 端口被占用:调整端口或释放占用进程
|
||||
- 权限不足:修正用户与目录权限
|
||||
- 依赖未就绪:检查 After 与 Docker 套接字挂载
|
||||
|
||||
章节来源
|
||||
- [README.md](file://README.md#L560-L583)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L134-L191)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L193-L236)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L246-L284)
|
||||
485
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/生产环境配置.md
Normal file
485
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/生产环境配置.md
Normal file
@@ -0,0 +1,485 @@
|
||||
# 生产环境配置
|
||||
|
||||
<cite>
|
||||
**本文引用的文件列表**
|
||||
- [config.yml](file://config.yml)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs)
|
||||
- [analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh)
|
||||
- [diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh)
|
||||
- [generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh)
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs)
|
||||
- [types.rs(docker_manager)](file://crates/docker_manager/src/types.rs)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs)
|
||||
- [service_config.rs(shared_types)](file://crates/shared_types/src/service_config.rs)
|
||||
- [router.rs(rcoder)](file://crates/rcoder/src/router.rs)
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs)
|
||||
- [main.rs(agent_runner)](file://crates/agent_runner/src/main.rs)
|
||||
- [install.md](file://install.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向系统管理员与运维工程师,系统化梳理生产环境配置,涵盖 config.yml 中的各项参数、性能调优、安全加固、日志级别、资源限制、健康检查、高可用策略、TLS/访问控制/审计日志建议、配置热更新与敏感信息管理、配置版本控制,以及结合 analyze-rcoder.sh、generate-flamegraph.sh 等诊断脚本的生产监控与瓶颈分析方法,并提供生产部署检查清单与优化建议。
|
||||
|
||||
## 项目结构
|
||||
- 配置来源与优先级:命令行参数 > 环境变量 > 配置文件 > 默认值
|
||||
- Docker Compose 通过挂载宿主机 Docker Socket 与工作目录,实现容器内对宿主机资源的可见性与隔离
|
||||
- 服务包含主服务与 AgentRunner 两个子服务,二者共享多镜像配置与资源限制能力
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "宿主机"
|
||||
DC["docker-compose.yml"]
|
||||
WS["项目工作目录<br/>/app/project_workspace"]
|
||||
LOGS["日志目录<br/>/app/logs"]
|
||||
SOCK["Docker Socket<br/>/var/run/docker.sock"]
|
||||
end
|
||||
subgraph "容器: rcoder"
|
||||
SRV["rcoder 主服务"]
|
||||
CFG["配置加载<br/>config.rs"]
|
||||
HEALTH["健康检查端点<br/>/health"]
|
||||
PROXY["Pingora 代理服务"]
|
||||
end
|
||||
DC --> SRV
|
||||
WS --> SRV
|
||||
LOGS --> SRV
|
||||
SOCK --> SRV
|
||||
SRV --> PROXY
|
||||
SRV --> HEALTH
|
||||
SRV --> CFG
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
|
||||
章节来源
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
|
||||
## 核心组件
|
||||
- 配置加载与优先级
|
||||
- 命令行参数覆盖配置文件;环境变量覆盖所有配置;未设置时回退到默认值
|
||||
- Docker 配置支持环境变量覆盖(如网络模式、工作目录、自动清理、容器 TTL)
|
||||
- 健康检查
|
||||
- 主服务提供 /health 健康端点;Compose 健康检查基于该端点
|
||||
- 代理与负载均衡
|
||||
- 基于 Pingora 的反向代理,支持轮询/一致性哈希、健康检查、连接池与 HTTP/2
|
||||
- 资源限制与容器安全
|
||||
- 多镜像配置支持为 rcoder 与 agent-runner 设置独立资源限制(内存/CPU/交换)
|
||||
- 容器安全通过能力降级与网络隔离策略降低风险
|
||||
- 日志与遥测
|
||||
- 按天滚动 JSON 日志;支持 trace_id 传播;控制台与文件双通道输出
|
||||
|
||||
章节来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L24-L30)
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [types.rs(docker_manager)](file://crates/docker_manager/src/types.rs#L51-L82)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs#L274-L320)
|
||||
- [main.rs(agent_runner)](file://crates/agent_runner/src/main.rs#L173-L231)
|
||||
|
||||
## 架构总览
|
||||
生产环境采用“主服务 + 代理 + 多镜像容器”的组合,通过 Docker Compose 统一编排,rcoder 主服务负责业务逻辑与健康检查,Pingora 代理负责端口转发与健康检查,容器内通过资源限制与安全策略保障稳定性与安全性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "客户端"
|
||||
C1["HTTP 客户端"]
|
||||
end
|
||||
subgraph "边缘"
|
||||
PXY["Pingora 代理服务"]
|
||||
HC["健康检查"]
|
||||
end
|
||||
subgraph "应用"
|
||||
RC["rcoder 主服务"]
|
||||
AR["AgentRunner 子服务"]
|
||||
CFG["配置系统"]
|
||||
LOG["日志系统"]
|
||||
end
|
||||
subgraph "运行时"
|
||||
DCK["Docker 引擎"]
|
||||
IMG["镜像仓库"]
|
||||
end
|
||||
C1 --> PXY
|
||||
PXY --> RC
|
||||
RC --> AR
|
||||
RC --> CFG
|
||||
RC --> LOG
|
||||
RC -.-> DCK
|
||||
AR -.-> DCK
|
||||
DCK --> IMG
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 配置系统与优先级
|
||||
- 配置来源与顺序
|
||||
- 命令行参数 > 环境变量 > 配置文件 > 默认值
|
||||
- DockerConfig 支持环境变量覆盖网络模式、工作目录、自动清理、容器 TTL
|
||||
- 关键配置项说明(来自 config.yml 与 rcoder_default.yml)
|
||||
- default_agent:默认 AI 代理类型
|
||||
- projects_dir:项目工作目录
|
||||
- port:主服务端口
|
||||
- proxy_config.listen_port:代理监听端口
|
||||
- proxy_config.default_backend_port:默认后端端口
|
||||
- proxy_config.health_check.*:健康检查策略
|
||||
- docker_config.multi_image_config.*:多镜像配置(含 rcoder 与 agent-runner 的镜像、环境变量、命令、资源限制、挂载、工作目录、网络模式等)
|
||||
- docker_config.auto_cleanup:自动清理
|
||||
- docker_config.container_ttl_seconds:容器存活时间
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["启动"]) --> LoadFile["尝试读取配置文件"]
|
||||
LoadFile --> Parse["解析 YAML 为 AppConfig"]
|
||||
Parse --> ApplyEnv["应用环境变量覆盖"]
|
||||
ApplyEnv --> ApplyCLI["应用命令行参数覆盖"]
|
||||
ApplyCLI --> Validate["校验 Docker 多镜像配置"]
|
||||
Validate --> Final["生成最终配置"]
|
||||
Final --> Run(["运行服务"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
|
||||
章节来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
- [config.yml](file://config.yml#L1-L161)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml#L1-L175)
|
||||
|
||||
### 健康检查与高可用
|
||||
- 主服务健康端点:/health 返回服务状态与时间戳
|
||||
- Compose 健康检查:基于 /health,重试次数、间隔、超时、启动期均配置
|
||||
- 代理健康检查:proxy_config.health_check.* 控制代理后端健康探测
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Compose as "Docker Compose"
|
||||
participant Service as "rcoder 主服务"
|
||||
participant Handler as "健康检查处理器"
|
||||
Client->>Compose : "健康检查请求"
|
||||
Compose->>Service : "GET /health"
|
||||
Service->>Handler : "路由到健康检查"
|
||||
Handler-->>Service : "构造响应"
|
||||
Service-->>Compose : "200 OK {status,timestamp,service}"
|
||||
Compose-->>Client : "健康状态"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L24-L30)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
|
||||
章节来源
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L24-L30)
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
|
||||
### 代理与负载均衡
|
||||
- Pingora 代理支持轮询/一致性哈希、健康检查、连接池与 HTTP/2
|
||||
- 代理端口与后端端口、后端主机、端口参数名均可配置
|
||||
- 代理统计接口可用于观测请求量、成功率、平均响应时间等
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Pxy as "Pingora 代理"
|
||||
participant Svc as "后端服务"
|
||||
participant Stats as "代理统计接口"
|
||||
Client->>Pxy : "请求 /proxy/{port}/path"
|
||||
Pxy->>Svc : "转发到 http : //backend_host : default_backend_port"
|
||||
Svc-->>Pxy : "响应"
|
||||
Pxy-->>Client : "响应"
|
||||
Client->>Stats : "GET /proxy/stats"
|
||||
Stats-->>Client : "统计信息"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [router.rs(rcoder)](file://crates/rcoder/src/router.rs#L1-L50)
|
||||
|
||||
章节来源
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [router.rs(rcoder)](file://crates/rcoder/src/router.rs#L1-L50)
|
||||
|
||||
### 资源限制与容器安全
|
||||
- 多镜像配置支持为 rcoder 与 agent-runner 设置资源限制(内存、CPU、交换),并可配置工作目录、网络模式、挂载、命令、入口点等
|
||||
- 容器安全策略:移除 NET_RAW/NET_ADMIN 能力,禁用特权模式,降低容器逃逸与网络攻击面
|
||||
- 容器 TTL 与自动清理:避免僵尸容器积累
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ServiceResourceLimits {
|
||||
+memory_limit : u64?
|
||||
+cpu_limit : f64?
|
||||
+swap_limit : u64?
|
||||
+disk_limit : u64?
|
||||
+process_limit : u64?
|
||||
}
|
||||
class ServiceImageConfig {
|
||||
+image : string?
|
||||
+arm64_image : string?
|
||||
+amd64_image : string?
|
||||
+default_image : string?
|
||||
+environment : map
|
||||
+mounts : Mount[]
|
||||
+command : string[]
|
||||
+entrypoint : string[]?
|
||||
+work_dir : string
|
||||
+network_mode : string
|
||||
+container_path_template : string
|
||||
+resource_limits : ServiceResourceLimits?
|
||||
}
|
||||
class HostConfig {
|
||||
+cap_drop : string[]
|
||||
+privileged : bool
|
||||
+auto_remove : bool
|
||||
}
|
||||
ServiceImageConfig --> ServiceResourceLimits : "包含"
|
||||
HostConfig --> ServiceImageConfig : "配合运行"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [service_config.rs(shared_types)](file://crates/shared_types/src/service_config.rs#L48-L91)
|
||||
- [types.rs(docker_manager)](file://crates/docker_manager/src/types.rs#L51-L82)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [config.yml](file://config.yml#L31-L161)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml#L31-L175)
|
||||
|
||||
章节来源
|
||||
- [service_config.rs(shared_types)](file://crates/shared_types/src/service_config.rs#L48-L91)
|
||||
- [types.rs(docker_manager)](file://crates/docker_manager/src/types.rs#L51-L82)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [config.yml](file://config.yml#L31-L161)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml#L31-L175)
|
||||
|
||||
### 日志级别与遥测
|
||||
- 日志滚动:按天滚动,保留最近 N 天日志
|
||||
- 输出格式:JSON 文件日志便于采集与分析;控制台简洁输出
|
||||
- 环境变量:RUST_LOG 控制日志级别;RCODER_PORT/RCODER_PROJECTS_DIR 等覆盖端口与工作目录
|
||||
- 追踪传播:支持 trace_id 传播,便于分布式链路追踪
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Init["初始化遥测"] --> FileLayer["文件日志层(JSON)"]
|
||||
Init --> ConsoleLayer["控制台日志层"]
|
||||
FileLayer --> Output["按天滚动输出"]
|
||||
ConsoleLayer --> Output
|
||||
Init --> Trace["设置 TraceContextPropagator"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs#L274-L320)
|
||||
- [main.rs(agent_runner)](file://crates/agent_runner/src/main.rs#L173-L231)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L283-L310)
|
||||
|
||||
章节来源
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs#L274-L320)
|
||||
- [main.rs(agent_runner)](file://crates/agent_runner/src/main.rs#L173-L231)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L283-L310)
|
||||
|
||||
### 诊断脚本与性能分析
|
||||
- analyze-rcoder.sh:进程基本信息、线程状态、网络连接、文件描述符、内存、CPU、上下文切换
|
||||
- diagnose-blocking.sh:阻塞线程分析、futex 等待、系统资源、最近错误日志、推荐下一步诊断
|
||||
- generate-flamegraph.sh:perf 采样、火焰图生成、原始 perf 数据保存、输出位置与分析要点
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
AStart["开始诊断"] --> FindPid["查找 rcoder 进程 PID"]
|
||||
FindPid --> Analyze["执行 analyze-rcoder.sh"]
|
||||
Analyze --> BlockDiag["执行 diagnose-blocking.sh"]
|
||||
BlockDiag --> Flame["执行 generate-flamegraph.sh"]
|
||||
Flame --> Review["查看 SVG 火焰图与原始 perf 数据"]
|
||||
Review --> End["结束"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh#L1-L56)
|
||||
- [diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh#L1-L98)
|
||||
- [generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh#L1-L59)
|
||||
|
||||
章节来源
|
||||
- [analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh#L1-L56)
|
||||
- [diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh#L1-L98)
|
||||
- [generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh#L1-L59)
|
||||
|
||||
## 依赖关系分析
|
||||
- 配置依赖
|
||||
- rcoder 主服务依赖配置系统加载 AppConfig,其中包含代理与 Docker 配置
|
||||
- agent_runner 服务同样依赖配置系统,支持独立的端口与代理配置
|
||||
- 运行时依赖
|
||||
- Docker Compose 依赖 Docker Socket 与工作目录挂载
|
||||
- 代理依赖 Pingora 库提供的服务实例
|
||||
- 安全与资源
|
||||
- 容器安全策略依赖 docker_manager 的 HostConfig 配置
|
||||
- 资源限制依赖 shared_types 的 ServiceResourceLimits
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
CFG["配置系统<br/>config.rs"] --> RC["rcoder 主服务"]
|
||||
CFG --> AR["AgentRunner 服务"]
|
||||
RC --> PXY["Pingora 代理"]
|
||||
RC --> DCK["Docker 引擎"]
|
||||
AR --> DCK
|
||||
DCK --> DM["docker_manager"]
|
||||
DM --> ST["shared_types"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [service_config.rs(shared_types)](file://crates/shared_types/src/service_config.rs#L48-L91)
|
||||
|
||||
章节来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
- [server.rs(pingora-proxy)](file://crates/pingora-proxy/src/server.rs#L38-L72)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [service_config.rs(shared_types)](file://crates/shared_types/src/service_config.rs#L48-L91)
|
||||
|
||||
## 性能考量
|
||||
- 端口与代理
|
||||
- 代理监听端口与默认后端端口应与业务端口一致,减少跨端口转发开销
|
||||
- 健康检查间隔与阈值应平衡探测频率与系统负载
|
||||
- 资源限制
|
||||
- 根据业务峰值合理设置内存/CPU/交换限制,避免 OOM 与资源争抢
|
||||
- 容器 TTL 与自动清理避免长期运行导致的资源泄漏
|
||||
- 日志与追踪
|
||||
- 生产环境建议 INFO 或更高级别,必要时通过 RUST_LOG 动态调整
|
||||
- JSON 日志便于集中采集与分析,控制台仅用于实时观察
|
||||
- 代理统计
|
||||
- 定期检查 /proxy/stats,关注请求量、失败率与平均响应时间
|
||||
|
||||
章节来源
|
||||
- [config.yml](file://config.yml#L14-L30)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml#L14-L30)
|
||||
- [types.rs(docker_manager)](file://crates/docker_manager/src/types.rs#L51-L82)
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs#L274-L320)
|
||||
- [router.rs(rcoder)](file://crates/rcoder/src/router.rs#L1-L50)
|
||||
|
||||
## 故障排查指南
|
||||
- 健康检查失败
|
||||
- 检查 /health 端点可达性与响应体
|
||||
- 查看 Compose 健康检查配置与重试策略
|
||||
- 阻塞与死锁
|
||||
- 使用 diagnose-blocking.sh 检查阻塞线程与 futex 等待
|
||||
- 结合 analyze-rcoder.sh 查看线程、内存、CPU、上下文切换
|
||||
- 性能瓶颈
|
||||
- 使用 generate-flamegraph.sh 生成火焰图,定位热点函数与调用栈
|
||||
- 关注 tokio 运行时、cleanup_task、docker_manager 相关调用
|
||||
- 网络与 I/O
|
||||
- 使用 analyze-rcoder.sh 的网络连接与 FD 统计
|
||||
- 结合 ss、lsof、iostat 等工具进行系统层面分析
|
||||
|
||||
章节来源
|
||||
- [health_handler.rs](file://crates/rcoder/src/handler/health_handler.rs#L1-L36)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L24-L30)
|
||||
- [diagnose-blocking.sh](file://docker/scripts/diagnose-blocking.sh#L1-L98)
|
||||
- [analyze-rcoder.sh](file://docker/scripts/analyze-rcoder.sh#L1-L56)
|
||||
- [generate-flamegraph.sh](file://docker/scripts/generate-flamegraph.sh#L1-L59)
|
||||
|
||||
## 结论
|
||||
生产环境配置应遵循“最小权限、可观测、可恢复”的原则。通过合理的资源限制、健康检查、代理与日志策略,结合诊断脚本与火焰图分析,可以有效提升系统的稳定性与可维护性。建议在上线前完成配置基线评审与演练,并建立变更流程与回滚预案。
|
||||
|
||||
## 附录
|
||||
|
||||
### 生产配置与开发配置的关键差异
|
||||
- 日志级别:生产建议 INFO 或更高;开发可使用 DEBUG
|
||||
- 代理与端口:生产需明确代理监听端口与后端端口,确保与业务端口一致
|
||||
- 资源限制:生产必须设置内存/CPU/交换限制,避免资源滥用
|
||||
- 健康检查:生产需启用并合理配置健康检查间隔与阈值
|
||||
- 安全策略:生产需启用容器安全能力降级与网络隔离
|
||||
|
||||
章节来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L283-L310)
|
||||
- [config.yml](file://config.yml#L14-L30)
|
||||
- [rcoder_default.yml](file://crates/rcoder/src/rcoder_default.yml#L14-L30)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
|
||||
### TLS 加密、访问控制与审计日志(建议)
|
||||
- TLS 加密
|
||||
- 建议在反向代理层(Nginx/Traefik/Caddy)启用 TLS,证书由 ACME 自动签发与续期
|
||||
- 对 rcoder 主服务与 AgentRunner 服务分别配置证书与域名
|
||||
- 访问控制
|
||||
- 在反向代理层添加认证(如 JWT/OAuth)、速率限制与 IP 白名单
|
||||
- 对 /proxy/* 端口访问进行细粒度授权
|
||||
- 审计日志
|
||||
- 启用统一日志采集(Fluent Bit/Vector)与集中存储(ELK/Graylog/Loki)
|
||||
- 对敏感操作(如代理端口访问、容器生命周期事件)进行审计记录
|
||||
|
||||
[本节为概念性建议,不直接分析具体文件,故无章节来源]
|
||||
|
||||
### 配置热更新、敏感信息管理与版本控制
|
||||
- 配置热更新
|
||||
- 通过环境变量覆盖实现动态生效(如 RCODER_PORT、RCODER_PROJECTS_DIR、RCODER_NETWORK_MODE、RCODER_AUTO_CLEANUP、RCODER_CONTAINER_TTL)
|
||||
- 对于 Docker 配置,建议在重启容器或重新拉起服务时应用新配置
|
||||
- 敏感信息管理
|
||||
- 将密钥、令牌放入密钥管理服务(如 HashiCorp Vault、KMS),通过环境变量注入
|
||||
- 避免将敏感信息写入配置文件或镜像
|
||||
- 配置版本控制
|
||||
- 将 config.yml 与 rcoder_default.yml 纳入版本控制,使用分支策略与 PR 审批
|
||||
- 对关键变更进行变更记录与回滚预案
|
||||
|
||||
章节来源
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L283-L310)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L134-L171)
|
||||
|
||||
### 生产部署检查清单
|
||||
- 基础设施
|
||||
- Docker 引擎版本与内核参数满足要求
|
||||
- 系统时间同步(NTP)
|
||||
- 磁盘空间与 inode 足够
|
||||
- 配置验证
|
||||
- config.yml 与 rcoder_default.yml 参数齐全且合理
|
||||
- 环境变量覆盖生效(RCODER_PORT、RCODER_PROJECTS_DIR、RCODER_NETWORK_MODE、RCODER_AUTO_CLEANUP、RCODER_CONTAINER_TTL)
|
||||
- 代理端口与后端端口一致,健康检查阈值合理
|
||||
- 安全加固
|
||||
- 容器能力降级(移除 NET_RAW/NET_ADMIN),禁用特权模式
|
||||
- 网络隔离策略生效
|
||||
- 证书与访问控制已在反向代理层配置
|
||||
- 监控与日志
|
||||
- 日志按天滚动,保留策略合理
|
||||
- /health 与 /proxy/stats 可用
|
||||
- 诊断脚本可用并具备执行权限
|
||||
- 高可用与备份
|
||||
- Compose 健康检查与重启策略配置
|
||||
- 容器 TTL 与自动清理开启
|
||||
- 备份策略(工作目录、日志、配置)
|
||||
|
||||
章节来源
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
- [config.rs(rcoder)](file://crates/rcoder/src/config.rs#L253-L354)
|
||||
- [config.rs(agent_runner)](file://crates/agent_runner/src/config.rs#L110-L191)
|
||||
- [manager.rs(docker_manager)](file://crates/docker_manager/src/manager.rs#L147-L165)
|
||||
- [main.rs(rcoder)](file://crates/rcoder/src/main.rs#L274-L320)
|
||||
- [main.rs(agent_runner)](file://crates/agent_runner/src/main.rs#L173-L231)
|
||||
347
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/部署指南.md
Normal file
347
qiming-rcoder/.qoder/repowiki/zh/content/部署指南/部署指南.md
Normal file
@@ -0,0 +1,347 @@
|
||||
# 部署指南
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Dockerfile](file://docker/Dockerfile)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml)
|
||||
- [rcoder-service.sh](file://rcoder-service.sh)
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh)
|
||||
- [build.sh](file://docker/scripts/build.sh)
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh)
|
||||
- [config.yml](file://config.yml)
|
||||
- [main.rs](file://crates/rcoder/src/main.rs)
|
||||
- [config.rs](file://crates/rcoder/src/config.rs)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [Docker部署](#docker部署)
|
||||
3. [Docker Compose配置](#docker-compose配置)
|
||||
4. [生产环境配置](#生产环境配置)
|
||||
5. [systemd服务实现](#systemd服务实现)
|
||||
6. [常见问题及解决方案](#常见问题及解决方案)
|
||||
7. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
本部署指南详细介绍了RCoder项目的部署流程,包括Docker部署、Docker Compose配置、生产环境配置和systemd服务实现。文档提供了具体的配置选项、参数说明和返回值解释,并阐述了各组件之间的关系。通过本指南,初学者可以快速上手部署,而经验丰富的开发人员可以获得足够的技术深度。
|
||||
|
||||
## Docker部署
|
||||
RCoder项目提供了完整的Docker部署方案,包括多阶段构建、调试工具集成和生产环境优化。
|
||||
|
||||
### Dockerfile分析
|
||||
Dockerfile采用多阶段构建策略,分为编译阶段和运行阶段。编译阶段使用`rust:1.90-bookworm`镜像进行编译,运行阶段则基于相同的镜像但包含完整的调试工具。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Dockerfile] --> B[多阶段构建]
|
||||
B --> C[编译阶段]
|
||||
B --> D[运行阶段]
|
||||
C --> E[安装编译依赖]
|
||||
C --> F[编译release版本]
|
||||
D --> G[安装运行时依赖]
|
||||
D --> H[安装调试工具]
|
||||
D --> I[复制二进制文件]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Dockerfile](file://docker/Dockerfile#L12-L115)
|
||||
|
||||
**Section sources**
|
||||
- [Dockerfile](file://docker/Dockerfile#L1-L305)
|
||||
|
||||
### 构建脚本
|
||||
项目提供了`build.sh`脚本用于构建Docker镜像,该脚本会检查必要的文件并执行构建命令。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始构建]) --> CheckFiles["检查必要文件"]
|
||||
CheckFiles --> BuildImage["执行docker build命令"]
|
||||
BuildImage --> Success["构建成功"]
|
||||
BuildImage --> Failure["构建失败"]
|
||||
Success --> End([结束])
|
||||
Failure --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [build.sh](file://docker/scripts/build.sh#L1-L21)
|
||||
|
||||
**Section sources**
|
||||
- [build.sh](file://docker/scripts/build.sh#L1-L21)
|
||||
|
||||
## Docker Compose配置
|
||||
Docker Compose配置文件定义了RCoder服务的运行环境,包括端口映射、环境变量和卷挂载。
|
||||
|
||||
### docker-compose.yml分析
|
||||
docker-compose.yml文件配置了RCoder服务的关键参数,包括镜像名称、端口映射、环境变量和卷挂载。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[docker-compose.yml] --> B[服务定义]
|
||||
B --> C[镜像配置]
|
||||
B --> D[端口映射]
|
||||
B --> E[环境变量]
|
||||
B --> F[卷挂载]
|
||||
B --> G[健康检查]
|
||||
B --> H[重启策略]
|
||||
C --> I[使用RCODER_IMAGE环境变量]
|
||||
D --> J[映射RCODER_PORT端口]
|
||||
E --> K[设置时区和日志级别]
|
||||
F --> L[挂载Docker socket]
|
||||
F --> M[挂载项目工作目录]
|
||||
F --> N[挂载日志目录]
|
||||
F --> O[挂载启动脚本]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
|
||||
**Section sources**
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L1-L37)
|
||||
|
||||
### 部署脚本
|
||||
`deploy.sh`脚本自动化了部署流程,包括检查必要文件、构建镜像和启动服务。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始部署]) --> CheckFiles["检查必要文件"]
|
||||
CheckFiles --> CheckImage["检查镜像是否存在"]
|
||||
CheckImage --> Build["构建镜像"]
|
||||
CheckImage --> Start["启动服务"]
|
||||
Build --> Start
|
||||
Start --> Success["部署成功"]
|
||||
Start --> Failure["部署失败"]
|
||||
Success --> End([结束])
|
||||
Failure --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh#L1-L42)
|
||||
|
||||
**Section sources**
|
||||
- [deploy.sh](file://docker/scripts/deploy.sh#L1-L42)
|
||||
|
||||
## 生产环境配置
|
||||
生产环境配置涉及多个方面,包括配置文件、环境变量和安全设置。
|
||||
|
||||
### 配置文件
|
||||
`config.yml`文件包含了RCoder服务的主要配置选项,包括默认代理类型、项目工作目录、端口设置和Docker配置。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[config.yml] --> B[基本配置]
|
||||
A --> C[代理配置]
|
||||
A --> D[Docker配置]
|
||||
B --> E[default_agent]
|
||||
B --> F[projects_dir]
|
||||
B --> G[port]
|
||||
C --> H[listen_port]
|
||||
C --> I[default_backend_port]
|
||||
C --> J[backend_host]
|
||||
C --> K[port_param]
|
||||
D --> L[multi_image_config]
|
||||
D --> M[network_mode]
|
||||
D --> N[work_dir]
|
||||
D --> O[auto_cleanup]
|
||||
D --> P[container_ttl_seconds]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.yml](file://config.yml#L1-L161)
|
||||
|
||||
**Section sources**
|
||||
- [config.yml](file://config.yml#L1-L161)
|
||||
|
||||
### 环境变量
|
||||
RCoder服务支持通过环境变量覆盖配置文件中的设置,提供了灵活的配置方式。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[环境变量] --> B[RUST_LOG]
|
||||
A --> C[PORT]
|
||||
A --> D[DOCKER_SOCKET_PATH]
|
||||
A --> E[RCODER_WORKSPACE]
|
||||
A --> F[RCODER_LOGS]
|
||||
A --> G[RCODER_NETWORK_MODE]
|
||||
A --> H[RCODER_WORK_DIR]
|
||||
A --> I[RCODER_AUTO_CLEANUP]
|
||||
A --> J[RCODER_CONTAINER_TTL]
|
||||
B --> K[设置日志级别]
|
||||
C --> L[设置服务端口]
|
||||
D --> M[设置Docker socket路径]
|
||||
E --> N[设置工作目录]
|
||||
F --> O[设置日志目录]
|
||||
G --> P[设置网络模式]
|
||||
H --> Q[设置工作目录]
|
||||
I --> R[设置自动清理]
|
||||
J --> S[设置容器存活时间]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [main.rs](file://crates/rcoder/src/main.rs#L49-L53)
|
||||
- [config.rs](file://crates/rcoder/src/config.rs#L214-L236)
|
||||
|
||||
### 启动脚本
|
||||
`start-rcoder.sh`脚本负责启动RCoder服务,设置了必要的环境变量并创建了所需的目录。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始启动]) --> SetEnv["设置环境变量"]
|
||||
SetEnv --> CreateDir["创建必要目录"]
|
||||
CreateDir --> PrintConfig["打印环境配置"]
|
||||
PrintConfig --> StartService["启动rcoder服务"]
|
||||
StartService --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh#L1-L23)
|
||||
|
||||
**Section sources**
|
||||
- [start-rcoder.sh](file://docker/start-rcoder.sh#L1-L23)
|
||||
|
||||
## systemd服务实现
|
||||
systemd服务实现通过`rcoder-service.sh`脚本提供,支持启动、停止、重启和状态查询等操作。
|
||||
|
||||
### 服务管理脚本
|
||||
`rcoder-service.sh`脚本提供了完整的服务管理功能,包括依赖检查、PID管理、日志记录和信号处理。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[rcoder-service.sh] --> B[配置区域]
|
||||
A --> C[工具函数]
|
||||
A --> D[服务控制函数]
|
||||
A --> E[主函数]
|
||||
B --> F[端口设置]
|
||||
B --> G[可执行文件路径]
|
||||
B --> H[工作目录]
|
||||
B --> I[日志文件]
|
||||
B --> J[PID文件]
|
||||
B --> K[PATH设置]
|
||||
B --> L[日志级别]
|
||||
C --> M[info函数]
|
||||
C --> N[warn函数]
|
||||
C --> O[error函数]
|
||||
C --> P[status_msg函数]
|
||||
C --> Q[check_dependencies函数]
|
||||
C --> R[get_pid函数]
|
||||
C --> S[is_running函数]
|
||||
D --> T[start函数]
|
||||
D --> U[stop函数]
|
||||
D --> V[restart函数]
|
||||
D --> W[status函数]
|
||||
E --> X[main函数]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L1-L328)
|
||||
|
||||
**Section sources**
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L1-L328)
|
||||
|
||||
### 服务控制流程
|
||||
服务控制流程包括启动、停止、重启和状态查询四个主要操作,每个操作都有详细的错误处理和日志记录。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[主函数] --> B[解析命令行参数]
|
||||
B --> C{命令}
|
||||
C --> D[start]
|
||||
C --> E[stop]
|
||||
C --> F[restart]
|
||||
C --> G[status]
|
||||
D --> H[检查依赖]
|
||||
H --> I[启动服务]
|
||||
I --> J[保存PID]
|
||||
E --> K[检查是否运行]
|
||||
K --> L[停止服务]
|
||||
L --> M[清理PID文件]
|
||||
F --> N[调用stop]
|
||||
N --> O[调用start]
|
||||
G --> P[检查运行状态]
|
||||
P --> Q[显示状态信息]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [rcoder-service.sh](file://rcoder-service.sh#L289-L327)
|
||||
|
||||
## 常见问题及解决方案
|
||||
本节列出了部署过程中可能遇到的常见问题及其解决方案。
|
||||
|
||||
### Docker socket权限问题
|
||||
当容器无法访问Docker socket时,会出现权限错误。
|
||||
|
||||
**问题表现**:
|
||||
- 服务启动失败
|
||||
- 日志中出现"Permission denied"错误
|
||||
- 无法创建或管理容器
|
||||
|
||||
**解决方案**:
|
||||
1. 确保Docker服务正在运行
|
||||
2. 检查Docker socket文件是否存在
|
||||
3. 确保用户在docker组中
|
||||
4. 在docker-compose.yml中正确挂载Docker socket
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[权限问题] --> B[检查Docker服务]
|
||||
B --> C[检查socket文件]
|
||||
C --> D[检查用户组]
|
||||
D --> E[正确挂载socket]
|
||||
E --> F[解决问题]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [main.rs](file://crates/rcoder/src/main.rs#L49-L53)
|
||||
- [docker-compose.yml](file://docker/docker-compose.yml#L11-L15)
|
||||
|
||||
### 配置文件加载问题
|
||||
当配置文件不存在或格式错误时,服务可能无法正常启动。
|
||||
|
||||
**问题表现**:
|
||||
- 服务启动失败
|
||||
- 日志中出现"Failed to load config"错误
|
||||
- 使用默认配置而非自定义配置
|
||||
|
||||
**解决方案**:
|
||||
1. 检查配置文件是否存在
|
||||
2. 验证YAML格式是否正确
|
||||
3. 确保配置文件路径正确
|
||||
4. 检查文件权限
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[配置问题] --> B[检查文件存在]
|
||||
B --> C[验证YAML格式]
|
||||
C --> D[检查路径正确]
|
||||
D --> E[检查文件权限]
|
||||
E --> F[解决问题]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.rs](file://crates/rcoder/src/config.rs#L255-L272)
|
||||
|
||||
### 网络隔离配置
|
||||
`setup-network-isolation.sh`脚本用于配置Docker容器的网络隔离规则,防止容器访问内网地址。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始配置]) --> CheckRoot["检查root权限"]
|
||||
CheckRoot --> CheckIptables["检查iptables安装"]
|
||||
CheckIptables --> FindNetworks["查找rcoder-网络"]
|
||||
FindNetworks --> Loop["遍历每个网络"]
|
||||
Loop --> GetSubnet["获取子网"]
|
||||
GetSubnet --> CheckRules["检查规则存在"]
|
||||
CheckRules --> AddRules["添加DROP规则"]
|
||||
AddRules --> Next["下一个网络"]
|
||||
Next --> Loop
|
||||
Loop --> PrintRules["打印当前规则"]
|
||||
PrintRules --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L1-L112)
|
||||
|
||||
**Section sources**
|
||||
- [setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L1-L112)
|
||||
|
||||
## 总结
|
||||
本部署指南详细介绍了RCoder项目的部署流程,涵盖了Docker部署、Docker Compose配置、生产环境配置和systemd服务实现。通过本指南,用户可以全面了解RCoder的部署架构和配置选项,解决常见问题,并根据实际需求进行定制化部署。文档提供了足够的技术深度,既适合初学者快速上手,也为经验丰富的开发人员提供了详细的参考。
|
||||
Reference in New Issue
Block a user