Files
reader/plans/docker-deployment-plan.md
T

278 lines
5.6 KiB
Markdown
Raw 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.
# 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 编排路径真实接入和验证。**