pi-courier 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,34 +1,72 @@
1
1
  # pi-courier — Matrix → pi 桥接服务
2
2
  #
3
- # 构建: docker build -t pi-courier .
4
- # 运行: docker compose up -d --build(见 docker-compose.yml)
3
+ # 构建: docker compose build(只构建,不运行)
4
+ # 运行: docker compose up -d(见 docker-compose.yml 与 README.md)
5
5
  #
6
6
  # 说明:
7
- # - 基于 node:24(避开 Node 20 与 pi 的 undici 不兼容问题)
8
- # - 全局安装 pi(peer 依赖)+ pi-courier
7
+ # - 基于 node:24-slim(避开 Node 20 与 pi 的 undici 不兼容问题;glibc 标准
8
+ # 环境保证 agent bash 工具与宿主行为一致)
9
+ # - 多阶段构建:builder 层装依赖后丢弃(npm 缓存/构建垃圾不进最终镜像),
10
+ # runtime 只带 node_modules + 运行时工具 → 体积约省 200-300MB
11
+ # - defaults/ 预置 LLM 三件套模板(entrypoint 首次启动自动拷贝到 /root/.pi/agent)
9
12
  # - 构建期间 npm 会从 GitHub Releases 下载 E2EE 原生库(约 21MB),
10
- # 如果 VPS 网络受限,用 --build-arg HTTPS_PROXY/HTTP_PROXY 传代理
13
+ # 网络受限时用 --build-arg HTTPS_PROXY/HTTP_PROXY 传代理
11
14
 
12
- FROM node:24-slim
15
+ # ============================== builder ======================================
16
+ FROM node:24-slim AS builder
13
17
 
14
- # 构建期代理(可选,仅当 VPS 需要代理访问外网时)
15
18
  ARG HTTPS_PROXY=
16
19
  ARG HTTP_PROXY=
17
20
  ENV https_proxy=${HTTPS_PROXY} \
18
21
  http_proxy=${HTTP_PROXY}
19
22
 
20
- # 安装 pi pi-courier
23
+ # 仅需要 ca-certificates(npm install 走 https;git 由 runtime 层负责)
24
+ RUN apt-get update \
25
+ && apt-get install -y --no-install-recommends ca-certificates \
26
+ && rm -rf /var/lib/apt/lists/*
27
+
28
+ # 安装 pi 与 pi-courier(pi 先装,pi-courier 的 peer 依赖即满足);
29
+ # 安装后清 npm 缓存(此层最终不会进入 runtime 镜像)
21
30
  RUN npm install -g @earendil-works/pi-coding-agent pi-courier \
22
- && pi --version \
31
+ && npm cache clean --force
32
+
33
+ # ============================== runtime ======================================
34
+ FROM node:24-slim
35
+
36
+ ARG HTTPS_PROXY=
37
+ ARG HTTP_PROXY=
38
+ ENV https_proxy=${HTTPS_PROXY} \
39
+ http_proxy=${HTTP_PROXY}
40
+
41
+ # 系统依赖:
42
+ # - git:pi 的 bash 工具 / `pi install` 需要(slim 基础镜像没有)
43
+ # - ca-certificates:HTTPS 证书
44
+ # - curl:排查网络问题用(可选)
45
+ RUN apt-get update \
46
+ && apt-get install -y --no-install-recommends git ca-certificates curl \
47
+ && rm -rf /var/lib/apt/lists/*
48
+
49
+ # 从 builder 只带 node_modules,然后在 runtime 重建 bin 符号链接
50
+ # (docker COPY 会把符号链接解引用成普通文件,导致相对 import 解析错误,
51
+ # 所以不能直接 COPY /usr/local/bin/pi)
52
+ COPY --from=builder /usr/local/lib/node_modules /usr/local/lib/node_modules
53
+ RUN ln -s /usr/local/lib/node_modules/@earendil-works/pi-coding-agent/dist/cli.js /usr/local/bin/pi \
54
+ && ln -s /usr/local/lib/node_modules/pi-courier/dist/cli.js /usr/local/bin/pi-courier
55
+
56
+ # 验证安装(失败则构建失败)
57
+ RUN pi --version \
23
58
  && pi-courier help >/dev/null 2>&1 \
24
- && echo "node $(node --version), pi and pi-courier installed OK"
59
+ && echo "OK: node $(node --version), pi + pi-courier installed"
25
60
 
26
- # 数据卷:配置 + 会话 + 加密存储(全部在容器内 ~/.pi)
27
- VOLUME ["/root/.pi"]
61
+ # 默认配置模板 + 首次启动初始化脚本
62
+ COPY defaults/ /opt/pi-courier/defaults/
63
+ COPY entrypoint.sh /entrypoint.sh
64
+ RUN chmod +x /entrypoint.sh
28
65
 
29
- # 进程存活检查(pi-courier run 前台运行)
66
+ # 进程存活检查:pid 1 即 entrypoint exec 的 pi-courier run 主进程(kill -0 无需额外工具)
30
67
  HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
31
- CMD pgrep -f "dist/standalone.js" >/dev/null || exit 1
68
+ CMD kill -0 1 || exit 1
32
69
 
33
- # 前台运行(容器主进程;Ctrl+C/SIGTERM 优雅关闭)
70
+ # entrypoint:首次启动把模板拷进 /root/.pi/agent;随后前台运行主进程
71
+ ENTRYPOINT ["/entrypoint.sh"]
34
72
  CMD ["pi-courier", "run"]
@@ -5,11 +5,17 @@
5
5
  ## 目录结构
6
6
 
7
7
  ```
8
- pi-courier/ # 本目录(deploy/docker 的上一级)
9
- ├── Dockerfile
10
- ├── docker-compose.yml
11
- ├── data/ # 自动创建:容器 ~/.pi(配置/会话/加密存储)
12
- └── projects/ # 可选:映射宿主机项目目录
8
+ deploy/docker/
9
+ ├── Dockerfile # 镜像构建(装 pi + pi-courier + 默认配置模板)
10
+ ├── docker-compose.yml # 编排(数据卷 ./data ↔ 容器 /root/.pi)
11
+ ├── entrypoint.sh # 首次启动:自动把默认配置模板拷入数据目录
12
+ ├── defaults/ # 模板源(构建进镜像 /opt/pi-courier/defaults/)
13
+ │ └── agent/
14
+ │ ├── models.json # 完整模型数据(24 模型,开箱即用)
15
+ │ ├── auth.json # API key 占位(唯一需要你填的文件)
16
+ │ └── settings.json # 默认 provider + 模型
17
+ └── data/ # 运行时数据(自动创建;含 key/token,已 gitignore)
18
+ └── agent/ # 首次启动自动从模板填充
13
19
  ```
14
20
 
15
21
  ## 部署步骤
@@ -24,71 +30,85 @@ sudo apt-get install -y docker-compose-plugin
24
30
  ```
25
31
 
26
32
  ```bash
27
- # 获取项目文件(任选其一)
33
+ # 获取项目文件
28
34
  git clone https://github.com/Hi-Barry/pi-courier.git && cd pi-courier/deploy/docker
29
- # 或手动上传 Dockerfile + docker-compose.yml
30
35
  ```
31
36
 
32
- ### 2. 构建并启动
37
+ ### 2. 构建(只构建,不运行)
33
38
 
34
39
  ```bash
35
40
  # 如果 VPS 需要代理访问外网(GitHub 下载 21MB E2EE 库),先导出:
36
41
  # export HTTPS_PROXY=http://<host>:<port>
37
42
  # export HTTP_PROXY=http://<host>:<port>
38
43
 
39
- docker compose up -d --build
40
- docker ps # 确认 pi-courier 容器 running
41
- docker logs pi-courier # 查看启动日志
44
+ docker compose build
42
45
  ```
43
46
 
44
- ### 3. 首次配置(向导)
47
+ ### 3. 配置(只需填 API key)
48
+
49
+ 首次启动会自动把模板拷入 `./data/agent/`。先启动一次容器完成初始化,再填 key:
50
+
51
+ ```bash
52
+ docker compose up -d # 启动(entrypoint 自动初始化 ./data/agent/)
53
+ docker exec pi-courier ls /root/.pi/agent # 确认模板已拷入
54
+ ```
55
+
56
+ 然后编辑宿主 `./data/agent/auth.json`,把占位的 `sk-你的key` 换成真实 API key:
57
+
58
+ ```bash
59
+ # data/agent/auth.json
60
+ { "opencode-go": { "type": "api_key", "key": "sk-真实key" } }
61
+ ```
62
+
63
+ > 默认 provider 是 `opencode-go` / `deepseek-v4-flash`(settings.json)。用其他 provider 的话,改 settings.json 并确认 models.json 里有对应模型。
64
+
65
+ ### 4. Matrix 配置(向导)
45
66
 
46
67
  ```bash
47
- # 容器运行后,进入交互向导(和本机一样,逐步输入)
48
68
  docker exec -it pi-courier pi-courier setup
49
69
  ```
50
70
 
51
- 向导写入容器内 `/root/.pi/pi-courier.json`(宿主 `./data/pi-courier.json`)。
71
+ 按提示输入:homeserver → token(密码登录或粘贴)→ 信任用户 → E2EE → workdir。写入容器内 `/root/.pi/pi-courier.json`(宿主 `./data/pi-courier.json`)。
52
72
 
53
- > 也可以不用向导:直接在宿主 `./data/` 下创建 `pi-courier.json` 和 `agent/` 目录(对应容器 `/root/.pi/`),格式见项目 README FAQ。
73
+ ```bash
74
+ docker compose restart # 让 Matrix 配置生效
75
+ docker logs pi-courier # 应看到 ✅ Matrix connected + ✅ pi RPC connected (model: deepseek-v4-flash)
76
+ ```
54
77
 
55
- ### 4. 使用
78
+ ### 5. 使用
56
79
 
57
80
  - 给 bot 发消息 → 查看验证码: `docker logs pi-courier` → 回复验证码配对
58
81
  - 查看日志: `docker logs -f pi-courier`(或 `docker exec pi-courier pi-courier logs --level debug`)
59
82
  - 重启: `docker compose restart`
60
83
  - 停止: `docker compose down`(数据保留在 ./data)
61
84
 
62
- ### 5. 升级
85
+ ### 6. 升级
63
86
 
64
87
  ```bash
65
88
  # 方式 A:容器内自更新(npm 全局方式)
66
89
  docker exec pi-courier pi-courier update
67
90
 
68
91
  # 方式 B:重建镜像
69
- git pull && docker compose build --no-cache && docker compose up -d
92
+ git pull && docker compose build && docker compose up -d
70
93
  ```
71
94
 
72
- ### 6. 映射宿主机项目目录(可选)
95
+ ### 7. 映射宿主机项目目录(可选)
73
96
 
74
97
  让 pi 在容器里直接操作宿主机上的代码:
75
98
 
76
99
  1. compose 里取消注释 `- ./projects:/root/Projects`
77
- 2. 配置 `workdir` 指向容器内路径:
78
-
79
- ```bash
80
- docker exec -it pi-courier pi-courier setup # workdir 填 /root/Projects/<你的项目>
81
- # 或直接改 ./data/pi-courier.json 的 workdir 后 docker compose restart
82
- ```
83
-
84
- 宿主机代码放 `./projects/<你的项目>`,pi 的工作目录就是 `/root/Projects/<你的项目>`。
100
+ 2. 配置 `workdir` 指向容器内路径(`docker exec -it pi-courier pi-courier setup` 的 workdir 填 `/root/Projects/<你的项目>`)
101
+ 3. 宿主机代码放 `./projects/<你的项目>`
85
102
 
86
103
  ## 常见问题
87
104
 
88
105
  | 问题 | 解决 |
89
106
  |---|---|
90
107
  | 构建很慢 / 卡在下载 | 构建期网络问题,设 `export HTTPS_PROXY` 再 build |
108
+ | 启动显示 `model: unknown` | `./data/agent/auth.json` 没填 key,或 settings.json 的模型不在 models.json |
109
+ | 发消息没有回复 | 按顺序查:`docker logs` 看 Matrix 连接、pi RPC 连接、模型是否 unknown |
91
110
  | `M_BAD_JSON: device_id does not match` | 重登录过,删 `./data/msg-bridge-matrix-crypto` 重启 |
92
111
  | 加密房间解不开新消息 | bot 无交叉签名,改用非加密房间 |
93
112
  | 会话重启丢失 | 0.1.1+ 自动 `--continue`,确认 `./data` 卷没被删 |
94
113
  | 想用新配置 | 改 `./data/pi-courier.json` → `docker compose restart` |
114
+ | workdir 文件丢失(容器重建后) | 未映射 projects 卷;取消注释 `- ./projects:/root/Projects` |
@@ -0,0 +1,4 @@
1
+ # 运行时数据目录(容器 /root/.pi 的宿主挂载点)
2
+ # 包含用户的 API key / token,禁止提交进 git
3
+ *
4
+ !.gitignore
@@ -0,0 +1 @@
1
+ { "opencode-go": { "type": "api_key", "key": "sk-你的key" } }