device-center 0.1.0-beta.1 → 0.2.0-beta.2
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.
- package/CONTRIBUTING.md +1 -1
- package/Dockerfile +2 -2
- package/README.md +37 -127
- package/SECURITY.md +7 -15
- package/bin/device-center.mjs +6 -3
- package/docs/agent-install.md +105 -0
- package/docs/architecture.md +25 -57
- package/docs/connection-routing.md +1 -0
- package/docs/device-profiles.md +56 -0
- package/docs/driver-binding.md +6 -1
- package/docs/friend-trial.md +42 -0
- package/docs/hosted-access.md +52 -0
- package/docs/npm.md +19 -35
- package/docs/onboarding.md +8 -5
- package/docs/remote-access.md +76 -0
- package/docs/roadmap.md +17 -28
- package/docs/security-and-sync.md +9 -64
- package/login.html +1 -1
- package/npm-shrinkwrap.json +304 -0
- package/package.json +22 -4
- package/scripts/access.mjs +48 -0
- package/scripts/driver.mjs +4 -3
- package/scripts/release-check.mjs +4 -0
- package/server/cloudAccess.mjs +13 -6
- package/server/connector.mjs +11 -5
- package/server/drivers/access.mjs +84 -0
- package/server/drivers/certificates.mjs +32 -0
- package/server/drivers/cloudLink.mjs +46 -4
- package/server/drivers/cloudRegistry.mjs +107 -20
- package/server/drivers/deviceProfiles.mjs +47 -0
- package/server/drivers/driverProtocol.mjs +3 -2
- package/server/drivers/inventory.mjs +21 -2
- package/server/drivers/relay.mjs +59 -0
- package/server/drivers/remote.mjs +111 -0
- package/server/index.mjs +44 -13
- package/server/mcp.mjs +5 -3
- package/server/unifiedAccess.mjs +33 -17
- package/src/api.js +4 -1
- package/src/device-state.js +19 -0
- package/src/login.css +4 -0
- package/src/login.js +1 -0
- package/src/main.js +197 -42
- package/src/onboarding.js +62 -0
- package/src/start.css +47 -0
- package/src/start.js +23 -0
- package/src/styles.css +22 -0
- package/start.html +45 -0
package/CONTRIBUTING.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Source distributed in the npm beta package is licensed under MIT (see LICENSE). The GitHub repository publication plan and a private security reporting channel are still pending. This remains a prototype, not an audited remote execution system.
|
|
4
4
|
|
|
5
|
-
Use Node.js 24, `npm run dev`, `npm run check`, and `npm test`. There is no
|
|
5
|
+
Use Node.js 24, `npm ci --ignore-scripts`, `npm run dev`, `npm run check`, and `npm test`. There is no frontend build step; X509 runtime dependencies are pinned in npm-shrinkwrap.json. Native inventory includes the real local Driver by default, with no seeded records. SSH references require explicit user selection. Test fixtures must stay in temporary test directories/databases, never appear in product startup.
|
|
6
6
|
|
|
7
7
|
Preserve the compact sidebar, optional MCP setup, truthful device states, and separate memory/disk observations. The local process represents its machine; a container cannot claim its host. SSH configuration discovery must not execute commands or read keys, and association must not imply connectivity or task authority. Do not restore sample projects, hosted quota displays or simulated cloud synchronization.
|
|
8
8
|
|
package/Dockerfile
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Optional local-only control plane, not a host/resource Agent.
|
|
2
2
|
FROM node:24-bookworm-slim
|
|
3
3
|
WORKDIR /app
|
|
4
|
-
COPY --chown=node:node package.json index.html login.html ./
|
|
4
|
+
COPY --chown=node:node package.json npm-shrinkwrap.json index.html login.html ./
|
|
5
5
|
COPY --chown=node:node server ./server
|
|
6
6
|
COPY --chown=node:node src ./src
|
|
7
|
-
RUN mkdir -p /app/data && chown node:node /app/data
|
|
7
|
+
RUN npm ci --omit=dev --ignore-scripts --no-audit --no-fund && mkdir -p /app/data && chown node:node /app/data
|
|
8
8
|
USER node
|
|
9
9
|
ENV PORT=5173 DEVICE_CENTER_RUNTIME=container DEVICE_CENTER_DB_PATH=/app/data/device-center.sqlite
|
|
10
10
|
CMD ["node", "server/index.mjs"]
|
package/README.md
CHANGED
|
@@ -1,159 +1,69 @@
|
|
|
1
1
|
# Device Center
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
让主力电脑上的智能体,使用自己的闲置设备。MIT · Node.js 24 · macOS / Linux · beta。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
一个本机连接器,加一个可选的云端控制面。真实本机内存、磁盘分别展示;已有 SSH 配置可一键关联并执行固定只读检查;设备 Agent 可通过域名绑定账号,主动回报状态。指定日志经设备主人单独授权后,以双向 TLS 1.3 直连或密文中转读取。没有默认示例设备或虚构在线状态。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 快速使用
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
希望交给本机 Agent 安装时,按[Agent 安装指南](docs/agent-install.md)选择本机、官方托管或已有自建服务。“交给 Agent 安装”可直接复制完整说明;登录和设备绑定仍由用户核对。朋友试用从[一页指南](https://devices.owenshen.top/start)开始,无需先登录。
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
# 只看帮助和范围,不产生身份或联网
|
|
13
|
-
npx --yes device-center@0.1.0-beta.1 --help
|
|
14
|
-
npx --yes device-center@0.1.0-beta.1 plan --cloud https://你的控制面域名
|
|
15
|
-
# 用户主动接入;配对码由终端产生,再单独输入面板核对批准
|
|
16
|
-
npx --yes device-center@0.1.0-beta.1 connect --cloud https://你的控制面域名 --confirm
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
仅本机使用可运行 `npx --yes device-center@0.1.0-beta.1 start`,面板与只读 MCP 默认位于 `http://127.0.0.1:5174/` 和 `/mcp`。数据留在用户应用数据目录。默认不分享 SSH 信息、不安装后台服务;常驻应先固定版本全局安装,不能依赖 npx 缓存。见 [npm 使用与发布说明](docs/npm.md)。当前源码可先用 `node bin/device-center.mjs --help`,Windows 原生管理 Driver 尚未支持。
|
|
11
|
+
0.2.0-beta.2 增加设备命名、类型、用途、标签、手动服务清单及“采集一次”,见[设备说明与手动采集](docs/device-profiles.md)。旧 Driver 需升级后才能响应云端手动采集;服务与应用仍由用户手动登记。
|
|
20
12
|
|
|
21
|
-
|
|
13
|
+
第一次使用可按 [新用户上手教程](docs/quick-start.md) 完成安装、设备配对和指定日志授权;[验收记录](docs/user-acceptance.md)列出已验证项目与限制。
|
|
22
14
|
|
|
23
|
-
|
|
15
|
+
只用本机,不注册账号:
|
|
24
16
|
|
|
25
17
|
```sh
|
|
26
|
-
|
|
18
|
+
npx --yes device-center@0.2.0-beta.2 start
|
|
27
19
|
```
|
|
28
20
|
|
|
29
|
-
打开
|
|
30
|
-
|
|
31
|
-
已配置不等于已连通。点击导入或关联后,新增设备自动排队检查一次当前 SSH 路径,最多两台并发,标记等待、检查中、连通或失败原因;失败可在卡片点“检查 SSH(只读)”重试。目标机无需安装 Node 或本项目。取得资源后在线五分钟,之后显示“待刷新”(数据较早,不代表设备断线或密钥过期)。SSH 连通性与内存、磁盘采集分别显示:认证已通过但目标不支持采集时,指标为空、设备状态仍未知。刷新列表只读取缓存,不会重连。
|
|
32
|
-
|
|
33
|
-
每台设备名称下显示访问路径摘要,点击可看跳板、目标入口、认证与密钥说明。路径来自已核验的配置,详情图区分上次成功检查与未知的后段映射;未启用自动局域网选路。参见[访问路径与局域网优先方案](docs/connection-routing.md)。
|
|
21
|
+
打开 `http://127.0.0.1:5174`,将 `/mcp` 添加到本机智能体。侧栏“开始使用”按管理电脑 → 智能体 → 设备引导;导入 SSH 后检查一次连通性。没有可用 Agent/SSH 的设备保持未知;资源快照过期显示“待刷新”,不代表密钥过期。列表刷新不主动连接 SSH。
|
|
34
22
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
在“连接方式”中,同一台 SSH 设备可同时登记局域网地址/端口和中转方案。中转有三种:用户自建服务器、Device Center 提供的服务、Cloudflare;支持保存局域网优先或仅中转的计划。保存到本机 SQLite,重新打开后恢复;入口仍待验证,中继适配器和自动选路尚未启用,不会修改已有 SSH 配置或托管私钥。
|
|
38
|
-
|
|
39
|
-
智能体通过 MCP 使用本机 Driver。已有 MCP 配置可以继续使用;首次配置时,从侧栏“智能体连接”复制地址,在 Codex 设置的 MCP servers 中添加 Streamable HTTP 服务并重新启动连接。
|
|
40
|
-
|
|
41
|
-
也可以在本机终端配置一次:
|
|
23
|
+
需要在外查看设备、使用日志中转:
|
|
42
24
|
|
|
43
25
|
```sh
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
回到连接设置点“检查接入”。只有服务收到真实 MCP `initialize` 请求后才显示接入记录;这个记录不证明客户端身份或持续在线,也不表示远端已连接。五分钟后记录显示过期。让 Codex 调用 `device_center_list_resources`,返回本机 Driver 和已关联的 SSH 主机;`device_center_list_ssh_candidates` 返回候选及关联状态。
|
|
48
|
-
|
|
49
|
-
```mermaid
|
|
50
|
-
flowchart LR
|
|
51
|
-
AI[本机智能体] --> MCP[MCP]
|
|
52
|
-
MCP --> Driver[本机 Driver 与真实资源读数]
|
|
53
|
-
Driver --> Ref[已关联 SSH 主机引用]
|
|
54
|
-
Ref --> Snapshot[导入后检查或手动重试 · SSH 只读快照]
|
|
55
|
-
Ref -.后续单独授权.-> Task[指定日志或受限任务]
|
|
26
|
+
npx --yes device-center@0.2.0-beta.2 plan
|
|
27
|
+
npx --yes device-center@0.2.0-beta.2 connect --confirm
|
|
28
|
+
# 自建控制面可指定 --cloud https://devices.example.com
|
|
56
29
|
```
|
|
57
30
|
|
|
58
|
-
|
|
31
|
+
默认 [官方控制面](https://devices.owenshen.top),登录自己的 App Services/个人站统一账号。在面板输入终端的五分钟配对码,核对完整公钥指纹和回报范围并批准。私钥留在设备,不放进脚本、prompt 或压缩包。默认不分享 SSH 信息、不开 LAN 端口、不安装后台服务。配对只授权资源回报。
|
|
59
32
|
|
|
60
|
-
|
|
33
|
+
[远程日志:两端授权、直连与中转](docs/remote-access.md) · [常驻与 npm](docs/npm.md) · [账号模式与自建](docs/hosted-access.md) · [故障排查](docs/troubleshooting.md)
|
|
61
34
|
|
|
62
|
-
|
|
35
|
+
## 能做什么
|
|
63
36
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
```sh
|
|
73
|
-
npm run service -- plan
|
|
74
|
-
npm run service -- install --confirm
|
|
75
|
-
npm run service -- status
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
- `plan` 只展示计划,不修改系统。
|
|
79
|
-
- `install --confirm` 是用户主动安装:登记用户级后台服务,登录后启动,失败时由系统服务管理器重启。Node 及仓库必须保留在稳定路径。
|
|
80
|
-
- macOS 数据和日志位于 `~/Library/Application Support/Device Center/`;Linux 数据位于 `~/.local/share/device-center/`,日志由用户 journal 管理。
|
|
81
|
-
- 后台服务使用独立持久数据目录,不自动复制开发数据库。请先停止自己启动的同端口前台进程;脚本不会自动结束其他进程或覆盖已有服务配置。
|
|
82
|
-
- `--port 5174` 可以加在各命令后,安装、状态和卸载应使用相同端口。
|
|
83
|
-
- `npm run service -- uninstall --confirm` 只卸载这份配置对应的用户服务,保留数据目录;修改过的配置须人工处理。
|
|
84
|
-
- Windows 原生 Driver 和后台安装尚未实现;下方 Docker 方案只表示容器资源,不能替代宿主 Driver。
|
|
85
|
-
|
|
86
|
-
本轮验证仅运行 `plan`、前台预览和接口测试,**没有安装常驻服务**。系统服务安装与 Docker 运行还需在各目标平台实际验证。当前仍是源码运行方式,不是给普通用户分发的签名安装包。
|
|
37
|
+
| 能力 | 当前实现 |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| 资源清单 | 本机真实资源;已有 SSH 主机经用户触发检查;云端只显示获准回报 |
|
|
40
|
+
| 账号与设备 | 上游核验账号、租户隔离、短期一次性批准、签名防重放、撤销 |
|
|
41
|
+
| 日志 | 指定标签/绝对文件/管理设备/有效期,最大64KiB;本机审计 |
|
|
42
|
+
| 访问路径 | Agent 精确私网入口优先,网络失败回退官方/自建 HTTPS 密文中转;证书错误停止 |
|
|
43
|
+
| 中转额度 | 每账号100MiB/UTC日、全实例1GiB/日,持久计数、并发与速率限制 |
|
|
44
|
+
| 尚未提供 | 任意远程命令、通用文件传输、Windows 原生 Agent、云端 MCP、CF 专用适配器、计费、自动迁移 |
|
|
87
45
|
|
|
88
|
-
|
|
46
|
+
日志操作通过 `device_center_read_log` 请求,不能用 MCP 授权自身。用户自己的智能体仍需在目标设备单独配置授权。已有 SSH 路径独立使用,SSH“连接计划”不会自动改成新 Agent 通道。Docker 代表容器自身,不能当作宿主机;宿主运行原生 Driver 与本机智能体交互。
|
|
89
47
|
|
|
90
|
-
|
|
48
|
+
## 从源码运行和自建
|
|
91
49
|
|
|
92
50
|
```sh
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
flowchart LR
|
|
100
|
-
AI[宿主机上的 Codex] --> URL[127.0.0.1:端口/mcp]
|
|
101
|
-
URL --> DC[容器中的 Device Center]
|
|
102
|
-
DC --> DB[容器数据卷]
|
|
51
|
+
npm ci --ignore-scripts
|
|
52
|
+
npm run dev
|
|
53
|
+
# 默认 http://127.0.0.1:5173
|
|
54
|
+
npm run check
|
|
55
|
+
npm test
|
|
56
|
+
npm run verify:package
|
|
103
57
|
```
|
|
104
58
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
Compose 只映射 `127.0.0.1`、持久化一个数据卷、设置重启策略,并使用非 root 用户。Docker 引擎需要持续运行,并应使用 28.0.0 或更新版本;旧版本存在同局域网访问回环发布端口的问题,见 [Docker 发布端口说明](https://docs.docker.com/engine/network/port-publishing/)。容器只表示容器 Driver,不显示宿主内存/磁盘,也不读取宿主 SSH 配置。需要宿主设备和已有 SSH 关联时优先在宿主原生运行 Driver;将来可设计独立宿主 Driver 对接容器,不挂载整个 HOME、密钥目录或 Docker socket。不要把没有鉴权的本机模式直接暴露到公网或局域网。
|
|
108
|
-
|
|
109
|
-
## 个人云端面板
|
|
59
|
+
无前端构建步骤;依赖由 npm-shrinkwrap 固定。仅本机模式监听回环地址,不可直接公开。可选 `docker compose up --build -d` 使用本地回环端口映射与非 root 用户,未挂载宿主 HOME/SSH/Docker socket。容器不能代替用户本机 Driver。
|
|
110
60
|
|
|
111
|
-
|
|
61
|
+
云端部署必须设置 `DEVICE_CENTER_RUNTIME=cloud`、`DEVICE_CENTER_PUBLIC_ORIGIN=https://你的域名`、`DEVICE_CENTER_AUTH_FILE=/仓库外/private.json`。已有反向代理仅转发至服务回环端口,覆盖 Host 和 X-Forwarded-Proto,提供 HTTPS。认证配置文件0600:
|
|
112
62
|
|
|
113
63
|
```json
|
|
114
|
-
{
|
|
115
|
-
"provider": "app-services",
|
|
116
|
-
"backendOrigin": "https://appapi.example.com",
|
|
117
|
-
"accountOrigin": "https://example.com",
|
|
118
|
-
"ownerEmail": "owner@example.com"
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
这些值是配置示例。控制面、账号站和 App Services 必须使用同一受信任的父域名,账号站已经设置共享的 HttpOnly `sessionToken` cookie。服务只向配置的 App Services `/v1/me` 验证身份,并检查所有者邮箱;不接受浏览器自报的用户 ID、匿名或手机号会话,不复制账号服务的签名密钥。统一登录只支持这份个人访问限制,不是多用户托管。
|
|
123
|
-
|
|
124
|
-
用户点击“使用统一账号登录”,在个人站通过邮箱或 Google 登录,回到设备面板会自动继续;个人站已登录时直接进入。退出设备面板仅退出本面板;个人站退出或切换账号会使本面板会话失效。身份结果最多缓存10秒,账号服务不可用时拒绝受保护访问,不回退到密码。
|
|
125
|
-
|
|
126
|
-
独立部署仍可显式使用 `provider: "password"`(旧配置可省略 provider):私有文件只保存用户名、16字节盐的十六进制值及 scrypt 哈希,参数 N=32768、r=8、p=1、输出64字节。统一账号模式拒绝本地密码接口;认证配置和凭据不进入源码、部署压缩包或日志。
|
|
127
|
-
|
|
128
|
-
后端继续只监听回环地址,由 HTTPS 反向代理访问;代理必须保留配置的 Host 并覆盖 `X-Forwarded-Proto=https`,不能转发客户端伪造的值。访问者先登录,网页、设备列表、批准/撤销与下载入口受保护。机器配对申请公开但限速,轮询、回报和断开需独立身份签名。云端 MCP / SSH 操作仍不可用。登录、继续和退出要求同源 Origin;本面板会话使用 Secure、HttpOnly、SameSite=Strict cookie,8小时失效,进程重启后重建。统一登录每个会话凭据每分钟最多8次继续尝试,校验并发/缓存大小有上限。此模式只用于个人访问,没有公开注册或多用户权限管理。
|
|
129
|
-
|
|
130
|
-
**面板上线不等于设备接通。** 云端不读取服务器 SSH、不复制本机数据库,云端 MCP 与 SSH 操作仍不可用。点“连接我的电脑”,下载源码、复制命令并在自己的电脑运行,再单独输入配对码、核对指纹和范围;批准并首次回报后才显示真实资源。当前支持 Node.js 24、macOS/Linux 源码 Driver,命令不含凭据。详见[域名绑定、常驻与排查](docs/driver-binding.md)及[部署记录与恢复](docs/deployment-readiness.md)。
|
|
131
|
-
|
|
132
|
-
## 当前真实功能与边界
|
|
133
|
-
|
|
134
|
-
| 真实本地功能 | 尚未实现 |
|
|
135
|
-
| --- | --- |
|
|
136
|
-
| 内置本机 Driver、真实内存/卷磁盘、状态筛选 | 独立设备 Agent、签名安装包 |
|
|
137
|
-
| SSH 候选、显式关联、严格验钥的一次只读资源检查 | 指定日志、构建/算力任务、任意远程命令 |
|
|
138
|
-
| 同一服务上的 HTTP MCP,四个只读工具 | 任务授权与审计 |
|
|
139
|
-
| 真实 MCP 初始化记录、复制本机地址或命令 | 设备可信启动、系统钥匙串封装 |
|
|
140
|
-
| macOS/Linux 管理 Driver 本机身份、一次性配对、签名回报及撤销 | Windows Driver、独立安装器、中继、网络限速、配置迁移 |
|
|
141
|
-
| 用户服务脚本、Docker 配置、个人统一登录与 HTTPS 入口 | 跨平台实际安装验证、多用户托管 |
|
|
142
|
-
|
|
143
|
-
项目位置保留在侧栏,目前没有项目管理或示例项目。“添加设备”只关联用户选中的已配置 SSH 主机;导入后执行一次固定只读检查,后续可在卡片重试,数据库保存引用与采集结果。不复制 HostName、私钥路径或凭据,不把关联当成信任或任务授权。候选只是 SSH 配置条目,可能有多个别名指向同一物理主机。删除系统 SSH 配置后,已有引用保留并提示配置不可用。明确移除产品内引用时,同时删除其快照与连接计划,并记录本地排除项,后续读取或一键导入不会重新加入;不修改系统 SSH 配置或身份文件。排除按租户与具体别名记录,不按客户端名称全局过滤。
|
|
144
|
-
|
|
145
|
-
接入资源设备的后续设计:设备在本机生成身份私钥,服务只登记公钥;短时一次性登记码由用户单独输入,不写入 prompt、脚本、压缩包或日志。Agent 建立安全出站连接。获准的局域网端点可尝试认证直连,失败时回退用户选择的中继。连接与任务授权分开,构建、指定日志和计算各自有目标及额度限制。
|
|
146
|
-
|
|
147
|
-
## 开发与后续
|
|
148
|
-
|
|
149
|
-
```sh
|
|
150
|
-
npm run check
|
|
151
|
-
npm test
|
|
64
|
+
{"provider":"app-services","accountMode":"multi-user","backendOrigin":"https://appapi.example.com","accountOrigin":"https://example.com"}
|
|
152
65
|
```
|
|
153
66
|
|
|
154
|
-
|
|
155
|
-
- [访问路径与局域网优先](docs/connection-routing.md)
|
|
156
|
-
- [安全与配置迁移设计](docs/security-and-sync.md) · [路线图](docs/roadmap.md)
|
|
157
|
-
- [安全边界](SECURITY.md) · [贡献说明](CONTRIBUTING.md)
|
|
67
|
+
需要已有受信任 App Services 共享账号服务与同父域会话;不是通用第三方 OAuth。个人部署可选 personal + ownerEmail。旧个人数据切多用户前按[迁移与回退说明](docs/hosted-access.md)核验原所有者映射;不能只切回旧代码而保留多用户数据库。
|
|
158
68
|
|
|
159
|
-
|
|
69
|
+
当前没有密钥托管、安装时自动联网或远程 shell。安全边界与披露方式见 [SECURITY](SECURITY.md)。npm 包公开不自动改变 GitHub 仓库可见性;本次发布是可追溯工作区快照,不是 main CI 构建。
|
package/SECURITY.md
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
# Security
|
|
2
2
|
|
|
3
|
-
Device Center is a
|
|
3
|
+
Device Center 0.2.0-beta.1 is a beta for macOS/Linux and Node.js 24. Local HTTP/MCP is loopback-only with Host/Origin checks; do not expose it publicly. Cloud deployment requires an exact HTTPS origin, a proxy overwriting Host/scheme, and a private authentication config. App Services identities are verified against the configured upstream; tenant scope comes from verified stable issuer/subject. Authentication outages fail closed.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Device keys remain in owner-private local files. Pairing is short-lived, one-time and separately approved after a full fingerprint comparison. Binding permits telemetry, not operations. Remote log access requires local pinned peer certificates plus a target-owned file/label/expiry grant. Node/OpenSSL TLS 1.3 mutually authenticates both devices over an approved LAN endpoint or opaque HTTPS relay; certificate and hostname verification remain enabled. The control plane sees metadata and ciphertext, not log plaintext or private keys. First-use fingerprint verification requires a trusted channel.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Only bounded log tail reads are available. No arbitrary commands, generic file transfer, Windows native Agent or cloud MCP. Symlink/multiple-hardlink/non-regular log files are rejected. Cloud revocation is checked on both routes. Local audit is bounded and fails closed at capacity. OS administrators, compromised endpoints and already-authorized readers remain trust boundaries. Keys are not TPM/Keychain wrapped. See [permissions, quotas, certificate renewal and limitations](docs/remote-access.md).
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Telemetry inventory never initiates SSH. Explicit local checks use bounded fixed scripts and strict known-host verification; private-key contents and raw SSH output are not imported. Containers do not read host SSH or claim host metrics.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Multi-user rollback requires consistent database and private-config restoration; never activate an older unscoped server against multi-account data. See [migration](docs/hosted-access.md). This release has automated isolation/transport tests, not an independent security audit or SLA.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
## Report a vulnerability
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Active checks use `/usr/bin/ssh` with a temporary isolated configuration for explicit root Host profiles and named ProxyJump aliases. Custom command, conditional and special authentication profiles stop for review; wildcard/global/Include options are not fully inherited. OpenSSH uses existing identity references and known_hosts, strictly verifies host keys, disables new forwarding and host-trust updates, and runs only the fixed macOS/Linux POSIX resource script. No target installation, arbitrary command/path input or key-content import occurs. Checks have a 25-second timeout, 32 KiB output limit and two-operation concurrency cap. SQLite stores alias, timestamp, configuration digest and normalized resources/failure code; raw outputs, identity paths and configuration contents are not stored. Success expires after five minutes; failure or profile changes invalidate online telemetry. This is a one-time observation, not a persistent connection or task grant.
|
|
18
|
-
|
|
19
|
-
The optional Docker recipe publishes to host loopback only, uses a non-root process and its own data volume, and has no host or Docker socket mounts. Its Driver represents the container, not host telemetry or SSH access. Actual container runtime and user-level background installation have not been validated in this task. `DEVICE_CENTER_RUNTIME=container` is a deployment setting, not proof of isolation.
|
|
20
|
-
|
|
21
|
-
Management Driver identity keys are generated only when the user explicitly runs `connect --confirm`. Private keys remain in owner-only 0600 files in 0700 directories; this is not OS keychain/TPM protection. The server stores public keys and fingerprints. Ed25519 requests bind origin, path, ID, time, nonce and payload digest; persistent nonce retention and revocation checks reject replay. Owner approval consumes a five-minute request transactionally. No bearer credential is issued. See [protocol, scope and limitations](docs/driver-binding.md). Short-lived single-use enrollment credentials are entered separately, not put into prompts, scripts, archives or diagnostic logs. Remote operations need independent owner grants scoped to a device, capability, path, time and quota. Hosted service key custody and configuration migration remain design work in `docs/security-and-sync.md`.
|
|
22
|
-
|
|
23
|
-
Tests cover local observations, SSH metadata/profile parsing, fixed checks with injected subprocesses, cache expiry/failures, association, service plans and personal cloud access boundaries. Ephemeral fixture identities exercise signatures, proof boundaries, replay, approval, revocation and expiry through isolated HTTP/SQLite tests. They do not contact real hosts, establish a production identity, validate remote task authority or constitute a protocol audit. External deployment verification is separately recorded in `docs/deployment-readiness.md`. A private security-reporting channel, license and public release plan remain to be selected. Do not post credentials, host metadata or private logs in public issues.
|
|
15
|
+
Do not post private keys, enrollment codes, cookies, logs or live credentials publicly. Contact the maintainer through a private channel before sharing sensitive details. The repository may be private even while the MIT npm package is public; no public issue tracker or bounty is promised. Stop recommending an affected beta and issue a new version rather than overwriting a published artifact.
|
package/bin/device-center.mjs
CHANGED
|
@@ -10,9 +10,8 @@ export function parseCli(argv = []) {
|
|
|
10
10
|
if (argv.length > 1) throw new Error('帮助和版本命令不接受其他参数。');
|
|
11
11
|
return { command: command === '-v' ? '--version' : ['-h', '--help'].includes(command) ? 'help' : command };
|
|
12
12
|
}
|
|
13
|
-
if (!['start', 'plan', 'connect', 'run', 'status', 'disconnect', 'service'].includes(command)) throw new Error('未知命令。运行 device-center --help 查看用法。');
|
|
13
|
+
if (!['start', 'plan', 'connect', 'run', 'status', 'disconnect', 'service', 'access'].includes(command)) throw new Error('未知命令。运行 device-center --help 查看用法。');
|
|
14
14
|
const args = argv.slice(1);
|
|
15
|
-
if (command === 'connect' && !args.includes('--cloud')) throw new Error('请用 --cloud 明确指定自己的 HTTPS 控制面域名。');
|
|
16
15
|
if (command === 'start') {
|
|
17
16
|
let port = 5174;
|
|
18
17
|
if (args.length) {
|
|
@@ -44,7 +43,10 @@ device-center service plan|status|install|uninstall [--port 5174] [--confirm]
|
|
|
44
43
|
|
|
45
44
|
默认端口5174,数据位于本用户的应用数据目录。关闭网页不会停止前台进程。
|
|
46
45
|
默认回报本机名称、系统、内存和磁盘;--share-ssh 需命令申请及面板另行批准。
|
|
47
|
-
|
|
46
|
+
本机无需平台注册;connect 默认申请接入 https://devices.owenshen.top,需登录自己的账号核对批准。
|
|
47
|
+
--cloud 可使用自建域名。device-center access help 查看受限日志授权与可选局域网直连。
|
|
48
|
+
支持 TLS 1.3 双向认证的日志读取与密文中转,默认100MiB/账号/日;不会自动获得操作权限。
|
|
49
|
+
任意远程命令、通用文件传输和 Windows 原生 Driver 尚未提供。安装包不含身份或配对码。
|
|
48
50
|
使用 npx 时只运行前台;常驻请先将本包固定版本安装到长期目录,再单独 install。
|
|
49
51
|
`;
|
|
50
52
|
}
|
|
@@ -53,6 +55,7 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
53
55
|
if (plan.command === 'help') return helpText();
|
|
54
56
|
if (plan.command === '--version') return version();
|
|
55
57
|
if (Number(process.versions.node.split('.')[0]) < 24) throw new Error('需要 Node.js 24 或更高版本。');
|
|
58
|
+
if (plan.command === 'access') return (await import('../scripts/access.mjs')).main(plan.args);
|
|
56
59
|
if (plan.command === 'service') {
|
|
57
60
|
if (plan.args[0] === 'install' && /(?:^|[\\/])_npx[\\/]/.test(ROOT)) throw new Error('npx 缓存会被清理,不能用作常驻目录。请先 npm install -g device-center@固定版本,再运行 device-center service install --confirm。');
|
|
58
61
|
return (await import('../scripts/service.mjs')).main(plan.args);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 让 Agent 安装 Device Center
|
|
2
|
+
|
|
3
|
+
用户选择模式后,把完整安装说明交给**正在目标电脑上运行、具备本机安装能力的 Agent**。网页只复制说明,不会远程替浏览器所在电脑安装软件。
|
|
4
|
+
|
|
5
|
+
`device-center@0.2.0-beta.2` 提供“交给 Agent 安装”、设备说明与手动采集。新用户可在[一页试用指南](https://devices.owenshen.top/start)免登录选择方式并复制完整说明。
|
|
6
|
+
|
|
7
|
+
## 用户只需要选择一种方式
|
|
8
|
+
|
|
9
|
+
| 方式 | 运行在哪里 | 需要账号吗 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 本机使用 | 本机 Driver、面板及 MCP | 不需要;全新安装不申请云端绑定 |
|
|
12
|
+
| 官方托管 | Driver 留在设备;官方服务提供控制面与加密中转 | 登录自己的 App Services/个人站账号并核对配对 |
|
|
13
|
+
| 自建服务 | Driver 留在设备;连接用户已有 HTTPS 控制面 | 使用那套控制面的账号;不会自动部署服务器 |
|
|
14
|
+
|
|
15
|
+
托管的是面板、设备登记与中转服务。设备身份私钥和指定日志授权仍在设备上,不上传私钥,不让服务商代为持有设备登录能力。
|
|
16
|
+
|
|
17
|
+
## Agent 执行顺序
|
|
18
|
+
|
|
19
|
+
只有用户明确要求在当前电脑安装并选择模式后,才能执行以下步骤。阅读本文本身不授予安装、配对或访问其他设备的权限。
|
|
20
|
+
|
|
21
|
+
### 1. 检查现有环境
|
|
22
|
+
|
|
23
|
+
- 当前版只支持 macOS / Linux,需要 Node.js 24 或更高版本与 npm。缺少运行环境时使用官方来源;系统授权或管理员操作交由用户处理。Windows 原生 Driver 尚未支持,不能假称已安装成功。
|
|
24
|
+
- 检查已有 CLI、用户级服务、本机端口和绑定。已安装在下面固定位置时,可以运行 `"$HOME/.local/bin/device-center" status` 与 `"$HOME/.local/bin/device-center" service status --port 5174`,不要直接打开身份私钥文件。配置一致则复用;版本、控制面或启动方式冲突时解释,让用户选择。保留已有身份、数据库、MCP 配置和其他程序。
|
|
25
|
+
- 默认端口 `5174`。若已被其他程序占用,选择明确的可用本机端口,并同步后面的面板、MCP、服务命令。不要停止其他监听进程,不扫描网络。
|
|
26
|
+
|
|
27
|
+
### 2. 固定安装到用户可写位置
|
|
28
|
+
|
|
29
|
+
全新安装可以使用:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
npm install --global --prefix "$HOME/.local" --ignore-scripts device-center@0.2.0-beta.2
|
|
33
|
+
"$HOME/.local/bin/device-center" --version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
无需 `sudo npm install`,不修改全局 npm 配置或 shell 启动文件。后续使用完整命令路径。后台服务必须引用固定安装位置,不能以 `npx` 的临时缓存为常驻目录。
|
|
37
|
+
|
|
38
|
+
### 3. 后台或前台运行
|
|
39
|
+
|
|
40
|
+
选择后台模式时,先核对计划中的用户、Node 路径、包路径、数据目录和回环地址:
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
"$HOME/.local/bin/device-center" service plan --port 5174
|
|
44
|
+
"$HOME/.local/bin/device-center" service install --port 5174 --confirm
|
|
45
|
+
"$HOME/.local/bin/device-center" service status --port 5174
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
macOS 使用当前登录用户的 launchd;Linux 需要可用的 `systemd --user`。不自动启用系统 linger。服务配置已存在、端口冲突或健康检查失败时,保留现场并排查,不自动清理或反复重装。
|
|
49
|
+
|
|
50
|
+
选择仅前台、本机使用时运行:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
"$HOME/.local/bin/device-center" start --port 5174
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
保持进程运行;关闭网页不会停止服务,关闭前台终端会停止。若电脑已有云端绑定,`start` 或后台服务可能恢复它,不能声称已切换成“本机专用”;先说明并让用户选择,不自动解绑。
|
|
57
|
+
|
|
58
|
+
### 4. 托管模式才申请绑定
|
|
59
|
+
|
|
60
|
+
官方服务先预览回报范围,再申请配对:
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
"$HOME/.local/bin/device-center" plan --cloud 'https://devices.owenshen.top' --port 5174
|
|
64
|
+
"$HOME/.local/bin/device-center" connect --cloud 'https://devices.owenshen.top' --port 5174 --confirm
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
自建模式替换为用户明确提供的 HTTPS 控制面域名,不携带路径、账号或参数。不能自动覆盖其他控制面的绑定。
|
|
68
|
+
|
|
69
|
+
用户在该控制面登录自己的账号,核对本机终端的完整公钥指纹,再手动批准新增设备。Agent 不代为批准,不读取密码、cookie 或私钥;配对码留在本机终端,不贴进智能体对话、脚本或链接。若 Agent 的执行工具会把终端配对码自动记录进对话,只把这一步交给用户在本机终端执行,Agent 继续其他检查。
|
|
70
|
+
|
|
71
|
+
前台 `connect` 在批准后启动 Driver;已经运行的用户服务会读取绑定并开始回报。不能仅凭 `configured=true` 宣称云端已收到数据,要核对真实回报和时间。
|
|
72
|
+
|
|
73
|
+
本机模式跳过这一步,全新安装不生成设备身份或申请账号。
|
|
74
|
+
|
|
75
|
+
### 5. 连接当前智能体并验收
|
|
76
|
+
|
|
77
|
+
读取本机 `http://127.0.0.1:5174/api/connector/setup`,通过当前智能体支持的 MCP 配置接口添加 **Streamable HTTP** 地址:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
http://127.0.0.1:5174/mcp
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
复用一致的配置,不覆盖其他 MCP。不能直接配置时,只需用户粘贴这个地址;不要编造握手成功。
|
|
84
|
+
|
|
85
|
+
必须检查实际结果:
|
|
86
|
+
|
|
87
|
+
1. `/api/health` 返回 `ok: true` 且为本机模式;用 CLI `--version` 检查安装版本,并核对服务计划引用的安装目录。健康接口本身不提供版本号。
|
|
88
|
+
2. `/api/overview` 的本机内存、磁盘为真实采集,失败项如实报告。
|
|
89
|
+
3. 选择后台模式时,核实服务实际运行,而不仅是配置文件存在。
|
|
90
|
+
4. 当前智能体实际调用 `device_center_list_resources`。
|
|
91
|
+
5. 托管模式核实绑定与云端收到回报,说明尚需用户完成的步骤。
|
|
92
|
+
|
|
93
|
+
最终向用户给出面板/MCP 地址、启动方式、绑定结果及未完成项。卸载用户服务仅在用户主动要求时执行;默认保留数据和身份:
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
"$HOME/.local/bin/device-center" service uninstall --port 5174 --confirm
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
默认不导入或连接 SSH 主机、不分享 SSH、不扫描局域网、不开放设备入站端口、不配置隧道、不授予日志或命令权限。安装与绑定不等于远程操作授权。
|
|
100
|
+
|
|
101
|
+
## 给 Agent 的公开文档入口
|
|
102
|
+
|
|
103
|
+
当前源码服务提供固定路径 `GET /install/agent.md`,仅返回本文,不需要登录,不含账号、身份或设备清单。官方入口为 https://devices.owenshen.top/install/agent.md;自建服务使用自己的域名与相同路径。
|
|
104
|
+
|
|
105
|
+
使用界面复制的完整安装说明无需 Agent 先访问这个入口。需要指定日志与局域网能力时,另见[远程访问](remote-access.md)并由设备主人逐项授权。
|
package/docs/architecture.md
CHANGED
|
@@ -1,66 +1,34 @@
|
|
|
1
1
|
# 架构
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Device Center 是模块化 Node.js 单体,前端静态文件无构建步骤。Node.js 24 内置 SQLite,Node/OpenSSL 提供 TLS;@peculiar/x509 创建标准证书,依赖由 npm-shrinkwrap 固定。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 两个运行位置
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- `server/drivers/local.mjs` 用 Node OS 接口与 `statfs` 读取真实本机指标;进程运行中为在线。内存含缓存,磁盘范围为用户目录所在卷;两项独立处理失败。容器只表示容器 Driver,不报告宿主指标。
|
|
10
|
-
- `server/drivers/sshConfig.mjs` 有界读取配置、枚举明确 Host 别名;不读取密钥,不调用 OpenSSH、解析动态条件或连接目标。最多 32 个配置文件、每文件 128 KiB、总计 512 KiB、递归 5 层、200 个别名;安全范围外 Include 和条件 Include 跳过并提示。
|
|
11
|
-
- `server/drivers/inventory.mjs` 保存用户勾选的 SSH 别名及时间,按租户命名空间隔离,事务内幂等插入。检查成功五分钟内为在线,之后过期;失败、配置缺失或配置摘要改变为未知。GET 和 MCP 只读取缓存,不连接目标。别名不是物理设备唯一身份。
|
|
12
|
-
- `server/drivers/sshProbe.mjs` 对根配置中的完整明确 Host 和命名 ProxyJump 建立隔离 SSH 配置;涉及 Match、条件 Include 或自定义命令的条目停止审核。OpenSSH 复用现有身份引用、严格校验已有 known_hosts,不写主机信任。固定 POSIX 脚本读取 macOS/Linux 基础资源;25 秒超时、32 KiB 输出、最多两个并发,不接受命令或文件路径。
|
|
13
|
-
- `server/connector.mjs` 共享四个只读 MCP 工具:Driver 状态、实际库存、SSH 配置候选、能力边界说明。没有命令、任意文件、日志或设备操作工具。
|
|
14
|
-
- `server/index.mjs` 提供无状态 HTTP MCP 的 JSON 响应,通知返回 202,不创建会话令牌,不提供 SSE(GET 返回 405)。记录最近有效初始化时间;不将记录当成鉴权、持续在线或设备心跳。
|
|
15
|
-
- `server/mcp.mjs` 兼容原有 stdio 配置,只读同一实际库存。stdio 进程与 HTTP 服务不共享运行状态,所以不会出现在面板的 HTTP 初始化记录中。
|
|
16
|
-
- `scripts/service.mjs` 默认只输出计划;用户显式执行安装才登记 macOS/Linux 用户级服务。
|
|
17
|
-
- Docker 是可选的本机运行容器,MCP 仍由宿主智能体主动连接。没有宿主挂载或 Docker socket 权限。
|
|
18
|
-
|
|
19
|
-
## 请求边界
|
|
20
|
-
|
|
21
|
-
首次使用界面统一为管理电脑、智能体、设备三步,复用同一组本机状态与 API。原生本机资源可读时自动跳过管理电脑步骤;只有近期真实 MCP 初始化记录才跳过智能体步骤。允许稍后接入后直接导入引用,不生成握手或任务操作授权。点击导入会为新增设备排队执行一次固定 SSH 只读检查。独立管理 Driver 可向 HTTPS 域名申请配对,所有者单独输入码、核对指纹并批准后,按固定字段回报资源;未取得回报仍为未知。完整流程见[使用引导](onboarding.md)。
|
|
22
|
-
|
|
23
|
-
页面外框固定为视口高度,侧栏与顶部不参与设备列表滚动。设备用紧凑行展示,内存和磁盘仍为独立列;小屏内部换行,空间不足时仅列表滚动。打开/关闭弹窗、刷新和快照过期重绘保留列表位置;改变搜索或状态筛选回到列表顶部。采集口径移到数值提示和可展开状态说明,失败仍明确显示。
|
|
24
|
-
|
|
25
|
-
`server/drivers/sshRoute.mjs` 从用于只读检查的已核验配置生成非秘密路径节点,面板与 MCP 共用。每台设备显示路径摘要,可打开图示与认证说明;`lastVerifiedRoute` 只在配置摘要与经过认证的检查结果一致时提供,资源采集是否可用单独判断。内部 `expired` 在面板显示“待刷新”,只说明数据时效。当前固定按配置连接,未实现自动 LAN 选路;具体方案与验收见[访问路径与局域网优先](connection-routing.md)。
|
|
26
|
-
|
|
27
|
-
`server/drivers/connectionPlans.mjs` 校验并保存每台已关联 SSH 设备的本机计划:可同时登记 LAN 地址/端口与用户自建、项目托管或 Cloudflare 中转类型,以及 LAN 优先/仅中转策略。写接口要求明确同源 Origin;不接受凭据、任意 URL 或额外字段。新增表不清理或覆盖已有设备、配置与快照。库存与 MCP 读取 `connections`,其中 `effective: false`;未验证入口及未接入中继不会改变在线状态,现有检查仍仅使用原 SSH 配置。
|
|
28
|
-
|
|
29
|
-
原生进程固定监听 `127.0.0.1`。仅接受回环 Host 和同源 Origin,拒绝跨站请求;静态内容有 CSP,不启用 CORS。MCP JSON 请求上限 16 KiB,检查类型、Accept、协议版本和工具参数。MCP 协议按 [2025-11-25 transport](https://modelcontextprotocol.io/specification/2025-11-25/basic/transports) 实现本机无状态只读子集。
|
|
30
|
-
|
|
31
|
-
底层仅保存引用的 `POST /api/devices/ssh`:必须明确同源 Origin、JSON、小于 16 KiB;只接收 aliases 数组,重新核对当前候选,其他字段拒绝。只写本地别名引用,不执行远端操作。MCP 没有关联写入或网络检查工具。
|
|
32
|
-
|
|
33
|
-
初始化预览 `GET /api/ssh/initialization` 在发现结果上增加本机配置检查:`sshInitialization.mjs` 复用隔离配置解析器,并用 stat/access 检查目标与跳板身份文件的引用是否可读取;不读身份内容,不执行 SSH。返回 importable / reason / routeMode,不返回身份路径或配置原文。`POST /api/ssh/initialize` 要求明确同源 Origin、严格 aliases 字段和最多 200 个别名;提交时重新核对可导入状态,再通过原有关联事务保存引用。同名导入幂等,未通过检查时整批拒绝、提示重读;不写快照、连接计划或主机配置,不自动探测、删去无效条目或授予任务权限。此处的初始化与 MCP initialize 握手是两个独立概念。
|
|
34
|
-
|
|
35
|
-
面板使用组合写接口 `POST /api/devices/ssh/associate-and-check` 与 `POST /api/ssh/initialize-and-check`,保存引用后只为新增别名启动一次固定检查。`POST /api/devices/ssh/check-batch` 接受严格的 aliases 数组,最多 200 个、必须已关联且当前仍存在;队列按别名去重,所有检查共享两个并发限制。关闭网页不取消队列,进程重启不恢复未完成检查;已完成结果持久化。GET / MCP 不排队、不重试。前端仅在队列有工作时每秒读取库存,失败三次停止读取并提示刷新。
|
|
36
|
-
|
|
37
|
-
`POST /api/devices/ssh/remove` 也要求明确同源 Origin 和严格 aliases;拒绝移除正在检查或排队的条目。事务内删除指定引用、快照和计划,再写 `ssh_exclusions`。仅排除当前租户指定别名,不改系统配置或身份文件,也不自动删无效候选。排除项跨重启保留,其他租户不受影响。
|
|
38
|
-
|
|
39
|
-
库存 `ssh.connectivity` 区分 unobserved / queued / checking / passed / failed / stale / configuration-changed,并提供检查时间和失败码。通过认证后资源脚本不支持或失败,仍可标记 SSH 连通,指标与设备状态保持未知。只在已通过验钥的 OpenSSH 检查完成或收到远端命令退出状态时作此判断;SSH 错误、超时和资源错误不混淆。成功资源快照的原有五分钟状态仍保留,检查不授予远程任务权限。
|
|
40
|
-
|
|
41
|
-
只读 SSH 解析器按独立范围处理 `Match`。明确且纯静态的 `Match originalhost alias[,alias]` 只让它命中的目标或跳板配置进入人工核验;不将这段条件错误归入紧邻的前一个 Host。条件选项不会进入隔离检查配置;动态、通配或其他复杂条件仍按原规则停止核验,不执行条件命令。
|
|
42
|
-
|
|
43
|
-
`POST /api/devices/ssh/check` 同样要求明确同源 Origin,只接受已关联且当前仍存在的 alias;由所有者主动发起。它会真实执行固定远端只读采集,不能传入任意 shell、路径或命令。仅支持非 Windows 原生管理端;容器没有宿主认证权限。结果保存在独立快照表,原始 stdout/stderr 与私钥内容不进入数据库或响应。
|
|
44
|
-
|
|
45
|
-
本机模式不实施用户鉴权。可信范围仅是同一用户管理的本机,允许读取指标、登记引用和发起固定 SSH 采集;服务使用运行用户已有 SSH 认证,其他本机程序也可能访问端点并触发该采集。租户命名空间不是认证。初始化名称不用于识别所有者。不能只把监听地址改成 `0.0.0.0`。
|
|
46
|
-
|
|
47
|
-
个人云端模式由 `cloudAccess.mjs` 提供请求边界和显式认证方式;`unifiedAccess.mjs` 负责 App Services 身份核验。私有配置指定同父域名的账号站、HTTPS `/v1/me` 服务及唯一所有者邮箱。复用共享 HttpOnly 会话,不解码 JWT 作为信任、不复制签名密钥;身份结果缓存10秒,验证超时/异常拒绝访问,不回退密码。面板会话8小时、只存凭据摘要,需匹配当前共享身份;面板退出不退出其他应用,账号站退出/切换则使面板失效。未登录静态登录页与方式接口可访问;机器配对申请公开并限速,轮询/回报/断开要求独立身份签名,其余网页、库存及所有者写入口受保护;继续/退出严格同源,缓存与验证并发有上限。独立密码方式仍需显式私有scrypt配置,未知方式启动失败。后端回环监听,Nginx覆盖Host/协议头。云端库存与本机库存分开,未绑定时返回空设备,拒绝SSH/MCP设备接口,不读取服务器SSH。管理电脑身份、配对与回报由 driverProtocol.mjs、cloudRegistry.mjs、cloudLink.mjs 独立处理;浏览器会话不能代替机器签名。默认本机指标,SSH 名称/缓存分享需双重显式批准,不上传认证配置或私钥。云端不提供远程操作或多用户权限协议。参见[协议与生命周期](driver-binding.md)。
|
|
48
|
-
|
|
49
|
-
`DEVICE_CENTER_RUNTIME=container` 只供本机 Docker recipe 在容器网络中监听,Compose 对宿主机只发布回环端口。该环境变量并不能证明进程真的位于容器,不是安全鉴权开关;不要在原生启动时设置。Host/Origin 检查仍启用。Docker 默认端口映射经明确 Host IP 限制;实际运行未验证。
|
|
50
|
-
|
|
51
|
-
## 后续角色
|
|
7
|
+
- 本机 Driver:本机真实资源、已有 SSH 别名引用和缓存、回环 HTTP 面板/MCP;原生模式可显式绑定控制面,运行资源 Publisher 与获准日志 Agent。容器只代表自身。
|
|
8
|
+
- 云端控制面:统一账号鉴权、账号隔离的设备登记/回报/撤销、密文 Relay。不会读取服务器 SSH 或把服务器伪装成管理电脑;没有云端远程 shell/MCP。
|
|
52
9
|
|
|
53
10
|
```mermaid
|
|
54
11
|
flowchart LR
|
|
55
|
-
AI[
|
|
56
|
-
MCP
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
Ref -.单独授权的任务适配器.-> Task[指定日志与受限任务]
|
|
61
|
-
Driver -.设备主动连接.-> Agent[资源设备 Agent]
|
|
62
|
-
Agent -.主动安全出站.-> Cloud[控制面与中继]
|
|
63
|
-
MCP -.获准 LAN 直连或中继.-> Cloud
|
|
12
|
+
AI[本机智能体] --> MCP[回环 MCP / 管理 Driver]
|
|
13
|
+
MCP -->|获准精确 LAN 地址 · 双向 TLS| Target[目标 Driver · 日志授权]
|
|
14
|
+
MCP -->|TLS 密文 / 签名 HTTPS| Relay[官方或自建控制面]
|
|
15
|
+
Relay -->|目标主动取帧| Target
|
|
16
|
+
Target -->|签名指标回报| Relay
|
|
64
17
|
```
|
|
65
18
|
|
|
66
|
-
|
|
19
|
+
## 模块
|
|
20
|
+
|
|
21
|
+
| 模块 | 职责 |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| index / cloudAccess / unifiedAccess | 本机请求边界、HTTPS代理验证、固定上游账号核验、会话 |
|
|
24
|
+
| inventory / sshConfig / sshProbe / sshRoute | 被动解析 SSH 元数据、显式只读检查、独立指标和核验路径 |
|
|
25
|
+
| driverProtocol / cloudRegistry | Ed25519 签名上下文、持久防重放、一次性配对、租户归属与资源时效 |
|
|
26
|
+
| certificates | 同设备身份的 X509 创建、指纹与自签验证 |
|
|
27
|
+
| relay | 有界密文帧队列、成员与撤销验证、持久日额度 |
|
|
28
|
+
| access / remote | 本机指纹信任、单文件限时授权、日志尾读、审计、标准双向 TLS、直连及回退 |
|
|
29
|
+
| connector | 四个本机只读工具,另有同账号设备查询和获准日志读取,共六个工具 |
|
|
30
|
+
| scripts/driver / access / service | 显式绑定、端上授权、用户级常驻;不会在 npm 安装钩子中运行 |
|
|
31
|
+
|
|
32
|
+
两条路径使用同一证书身份和端上授权。云端登记不授予日志权限;peer目录不能替换本机核对过的指纹。只有网络不可达可回退,认证错误停止。现有 SSH 设备的“连接计划”仍只保存元数据,与 Agent 通道分离。
|
|
33
|
+
|
|
34
|
+
TLS 记录分片经签名 HTTPS 请求转发,不自行设计密码协议。会话60秒,队列有上限;连接失败后不恢复/重放操作。当前仅只读日志,没有通用任务系统。参见[完整协议边界](remote-access.md)。
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# 访问路径与局域网优先
|
|
2
2
|
|
|
3
|
+
> 0.2.0-beta.1 更新:账号隔离、TLS 1.3 双向认证密文中转、独立授权的日志尾读及获准精确 LAN 优先已实现。旧文中的“尚未实现”传输描述属于此前阶段;实际操作与边界以 [远程日志](remote-access.md) 和 README 为准。通用远程命令、文件传输、Windows 原生 Agent 与自动迁移仍未提供。
|
|
3
4
|
## 当前能做什么
|
|
4
5
|
|
|
5
6
|
面板的每台设备显示配置路径,点击路径可查看节点、地址和端口。MCP 库存读取同一份信息。原生本机由进程直接采集;SSH 设备的路径来自保守解析并用于检查的配置,读取与展示时不调用 `ssh -G`、不解析动态命令、不探测 DNS 或网络。导入后一次检查、或用户手动重试,才实际访问已配置路径。
|