feat: add keyword cleanup docs, skill updates, and delivery compatibility fix
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
# reader MCP Docker 部署计划
|
||||
|
||||
## 1. 目标
|
||||
|
||||
将 reader 作为正式 MCP workflow service 以 Docker 方式部署,满足以下原则:
|
||||
|
||||
1. 服务运行在容器内
|
||||
2. 运行态与产物必须外置挂载,不闷在容器内
|
||||
3. 配置统一记录在 `.env`
|
||||
4. 读写行为与当前仓库约定保持一致
|
||||
5. OpenClaw 后续可将该服务作为正式上游 MCP 使用
|
||||
|
||||
---
|
||||
|
||||
## 2. 部署原则
|
||||
|
||||
### 2.1 容器职责
|
||||
|
||||
容器只负责:
|
||||
|
||||
- 提供 reader MCP 服务运行环境
|
||||
- 加载 reader 代码与依赖
|
||||
- 读取挂载进来的配置与状态目录
|
||||
- 对外暴露 MCP 服务入口
|
||||
|
||||
### 2.2 宿主机职责
|
||||
|
||||
宿主机负责持久化:
|
||||
|
||||
- 配置文件
|
||||
- 运行态
|
||||
- outputs 产物
|
||||
- 数据目录
|
||||
- configs
|
||||
|
||||
### 2.3 配置收口原则
|
||||
|
||||
所有环境配置统一放在 `.env`,避免:
|
||||
|
||||
- 零散写在 compose 内
|
||||
- 零散写在 shell 命令里
|
||||
- 零散写在 OpenClaw skill 里
|
||||
|
||||
---
|
||||
|
||||
## 3. 建议部署目录
|
||||
|
||||
建议在 reader 仓库内准备标准部署结构:
|
||||
|
||||
```text
|
||||
/home/ubuntu/zhu/github/reader/
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
.env
|
||||
outputs/
|
||||
data/
|
||||
configs/
|
||||
knowledge-base/
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `Dockerfile`:构建 reader MCP 服务镜像
|
||||
- `docker-compose.yml`:单服务部署编排
|
||||
- `.env`:统一环境变量
|
||||
- `outputs/`:产物、run-state、digest、payload 等外置持久化
|
||||
- `data/`:term index 等数据外置持久化
|
||||
- `configs/`:reader 运行配置外置持久化
|
||||
- `knowledge-base/`:如当前 reader/skill 仍会依赖本地知识目录,可继续挂载
|
||||
|
||||
---
|
||||
|
||||
## 4. 必须挂载的目录 / 文件
|
||||
|
||||
### 必须挂载
|
||||
|
||||
- `.env`
|
||||
- `outputs/`
|
||||
- `data/`
|
||||
- `configs/`
|
||||
|
||||
### 建议挂载
|
||||
|
||||
- `knowledge-base/`
|
||||
|
||||
### 通常不必挂载
|
||||
|
||||
- `docs/`
|
||||
- `plans/`
|
||||
- `.git/`
|
||||
|
||||
---
|
||||
|
||||
## 5. `.env` 统一配置建议
|
||||
|
||||
至少应包含以下配置:
|
||||
|
||||
### FreshRSS
|
||||
|
||||
- `FRESHRSS_API_BASE_URL`
|
||||
- `FRESHRSS_USERNAME`
|
||||
- `FRESHRSS_API_PASSWORD`
|
||||
|
||||
### 主 LLM
|
||||
|
||||
- `LLM_API_URL`
|
||||
- `LLM_API_KEY`
|
||||
- `LLM_MODEL`
|
||||
|
||||
### 单篇总结专用 LLM(如已使用)
|
||||
|
||||
- `ARTICLE_SUMMARY_API_URL`
|
||||
- `ARTICLE_SUMMARY_API_KEY`
|
||||
- `ARTICLE_SUMMARY_MODEL`
|
||||
|
||||
### IMA(如 reader / skill 仍依赖这些配置约定)
|
||||
|
||||
- `IMA_DAILY_KNOWLEDGE_BASE_ID`
|
||||
- `IMA_DAILY_KNOWLEDGE_BASE_NAME`
|
||||
|
||||
### 运行控制
|
||||
|
||||
- `PYTHONUNBUFFERED=1`
|
||||
- 视需要增加日志级别等配置
|
||||
|
||||
原则:
|
||||
|
||||
- 所有会影响服务行为的环境项,都优先进入 `.env`
|
||||
- compose 文件只引用 `.env`,不在 compose 里硬编码业务参数
|
||||
|
||||
---
|
||||
|
||||
## 6. Dockerfile 设计建议
|
||||
|
||||
### 目标
|
||||
|
||||
- 使用 Python 3.11
|
||||
- 安装 reader 依赖
|
||||
- 默认启动 MCP 服务入口
|
||||
|
||||
### 建议思路
|
||||
|
||||
1. 基于 `python:3.11-slim`
|
||||
2. 设置工作目录到 `/app`
|
||||
3. 复制仓库代码
|
||||
4. 安装依赖(如 `pip install -e .`)
|
||||
5. 默认启动 reader MCP 服务
|
||||
|
||||
### 启动入口
|
||||
|
||||
优先使用当前正式服务入口,例如:
|
||||
|
||||
- `summary-mcp`
|
||||
|
||||
如果后续 reader 明确切换到别的稳定入口,再同步更新。
|
||||
|
||||
---
|
||||
|
||||
## 7. docker-compose 设计建议
|
||||
|
||||
建议先保持单服务简单结构,例如:
|
||||
|
||||
- service 名称:`reader-mcp`
|
||||
- `env_file: .env`
|
||||
- 挂载:
|
||||
- `./outputs:/app/outputs`
|
||||
- `./data:/app/data`
|
||||
- `./configs:/app/configs`
|
||||
- `./knowledge-base:/app/knowledge-base`(如需要)
|
||||
- `./.env:/app/.env:ro`(可选,若程序直接读取文件)
|
||||
- `restart: unless-stopped`
|
||||
|
||||
如果当前 MCP 服务是 stdio 型而不是 HTTP 型,需要进一步明确:
|
||||
|
||||
- 它是由 OpenClaw 以本地进程方式拉起
|
||||
- 还是以常驻 sidecar / gateway adapter 方式挂接
|
||||
|
||||
因此 compose 的最终 command 需要结合实际接入方式确认。
|
||||
|
||||
---
|
||||
|
||||
## 8. 部署前确认项
|
||||
|
||||
在正式执行前,需要先确认以下问题:
|
||||
|
||||
### 8.1 MCP 连接方式
|
||||
|
||||
必须确认 reader MCP 服务的正式接入方式是:
|
||||
|
||||
1. **stdio 型**:OpenClaw/调用方本地拉起进程
|
||||
2. **HTTP/SSE 型**:服务常驻监听端口,OpenClaw 远程连接
|
||||
|
||||
这会直接影响:
|
||||
|
||||
- Docker command
|
||||
- 是否需要端口映射
|
||||
- OpenClaw 接入配置
|
||||
|
||||
### 8.2 当前 `summary-mcp` 的服务形态
|
||||
|
||||
需要确认:
|
||||
|
||||
- 现有 `summary-mcp` 是 FastMCP stdio 默认模式
|
||||
- 还是已有可直接 HTTP 化的运行方式
|
||||
|
||||
在这点没确认前,不要盲目写死端口暴露方案。
|
||||
|
||||
### 8.3 OpenClaw 侧接入点
|
||||
|
||||
部署完成后,还需要明确 OpenClaw 将如何引用该 MCP 服务:
|
||||
|
||||
- 本机命令型 MCP
|
||||
- Docker 内服务桥接
|
||||
- 或其它现有 OpenClaw MCP 配置方式
|
||||
|
||||
---
|
||||
|
||||
## 9. 执行顺序(建议)
|
||||
|
||||
### Phase A:部署方案落地
|
||||
|
||||
1. 确认 MCP 服务连接方式(stdio / HTTP)
|
||||
2. 确认最终 Dockerfile 启动命令
|
||||
3. 确认 compose 结构与挂载目录
|
||||
4. 整理 `.env` 字段
|
||||
|
||||
### Phase B:容器化实现
|
||||
|
||||
1. 新建/更新 `Dockerfile`
|
||||
2. 新建/更新 `docker-compose.yml`
|
||||
3. 检查 `.dockerignore`
|
||||
4. 核对路径是否与仓库内当前代码一致
|
||||
|
||||
### Phase C:本地部署验证
|
||||
|
||||
1. `docker compose build`
|
||||
2. `docker compose up -d`
|
||||
3. 验证服务启动
|
||||
4. 验证容器外 `outputs/`、`data/` 等是否正常落盘
|
||||
|
||||
### Phase D:OpenClaw 接入验证
|
||||
|
||||
1. 让 OpenClaw 通过正式 MCP 路径连接 reader
|
||||
2. 真跑一轮:
|
||||
- run
|
||||
- status
|
||||
- payload
|
||||
- report
|
||||
3. 如有需要,验证一次最小 `resume_run`
|
||||
|
||||
---
|
||||
|
||||
## 10. 当前不在本轮范围内的事
|
||||
|
||||
本轮部署计划不直接处理:
|
||||
|
||||
- `rerun_stage`
|
||||
- 更复杂的后台任务系统
|
||||
- 多实例部署
|
||||
- 横向扩展
|
||||
- 生产告警体系
|
||||
|
||||
本轮只做:
|
||||
|
||||
- 单实例
|
||||
- Docker 化
|
||||
- 配置收口
|
||||
- 挂载持久化
|
||||
- OpenClaw 可正式接入
|
||||
|
||||
---
|
||||
|
||||
## 11. 一句话结论
|
||||
|
||||
reader 的下一步不是继续堆内部接口,而是:
|
||||
|
||||
**以 Docker 正式部署成 MCP workflow service,配置进 `.env`,状态和产物目录挂载到宿主机,然后由 OpenClaw 按正式 MCP 编排路径真实接入和验证。**
|
||||
Reference in New Issue
Block a user