@namewta/speculo 1.0.20 → 1.0.21
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/package.json +1 -1
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +1 -1
- package/template/workflows/ops/H-host-manage/H-host-manage.md +4 -0
- package/template/workflows/ops/H-host-manage/references/host-profiles.md +4 -0
- package/template/workflows/ops/I-initialize/I-initialize.md +1 -1
- package/template/workflows/ops/INDEX.md +2 -0
- package/template/workflows/ops/README.md +7 -3
- package/template/workflows/ops/S-server-connect/S-server-connect.md +5 -5
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +2 -0
- package/template/workflows/ops/common/CAPABILITIES.md +2 -0
- package/template/workflows/ops/common/USAGE.md +5 -5
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +29 -2
- package/template/workflows/ops/common/examples/README.md +1 -1
- package/template/workflows/ops/common/examples/register.example.json +7 -3
- package/template/workflows/ops/common/examples/server-connection.example.json +11 -0
- package/template/workflows/ops/common/rules/deployment-layout.md +1 -1
- package/template/workflows/ops/common/rules/host-root-and-onboarding.md +47 -0
- package/template/workflows/ops/common/rules/persistence-and-secrets.md +1 -1
- package/template/workflows/ops/common/rules/research-and-decisions.md +8 -0
- package/template/workflows/ops/common/rules/server-onboarding.md +3 -3
- package/template/workflows/ops/common/rules/workspace-and-authorization.md +2 -2
- package/template/workflows/ops/common/schemas/fleet-view.schema.json +64 -0
- package/template/workflows/ops/common/schemas/host.schema.json +19 -0
- package/template/workflows/ops/common/schemas/plan.schema.json +57 -0
- package/template/workflows/ops/common/schemas/root-confirmation.schema.json +118 -0
- package/template/workflows/ops/common/schemas/server-connection.schema.json +67 -0
- package/template/workflows/ops/common/schemas/server-discovery.schema.json +171 -0
- package/template/workflows/ops/common/schemas/spec.schema.json +19 -0
- package/template/workflows/ops/common/schemas/status.schema.json +19 -0
- package/template/workflows/ops/common/templates/FLEET.html +1 -1
- package/template/workflows/ops/common/templates/HOST-README.md +3 -1
- package/template/workflows/ops/common/tests/test_ops.mjs +3 -3
- package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +30 -2
- package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +225 -0
- package/template/workflows/ops/common/tools/demo-local.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/agent.mjs +26 -0
- package/template/workflows/ops/common/tools/opslib/bootstrap.mjs +50 -24
- package/template/workflows/ops/common/tools/opslib/cli.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/core.mjs +1 -1
- package/template/workflows/ops/common/tools/opslib/docs.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/execution.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/fleet.mjs +26 -4
- package/template/workflows/ops/common/tools/opslib/host_recipes.mjs +34 -0
- package/template/workflows/ops/common/tools/opslib/model.mjs +6 -0
- package/template/workflows/ops/common/tools/opslib/onboarding.mjs +215 -0
- package/template/workflows/ops/common/tools/opslib/planner.mjs +3 -0
- package/template/workflows/ops/common/tools/opslib/transport.mjs +7 -3
- package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +20 -1
- package/template/workflows/ops/common/tools/server-discover.sh +65 -0
- package/template/workflows/ops/common/tools/validate-ops.mjs +1 -1
- package/template/workflows/ops/manifest.json +12 -5
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@ keywords: [ops, project-deploy, 项目, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
## 流程与完成标准
|
|
19
19
|
|
|
20
|
-
先固定 project_id、显式 server_ids
|
|
20
|
+
先固定 project_id、显式 server_ids、环境和实例;读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>,展示每个目标已登记 host.root 和派生项目根,不从 cwd、默认 HOME 或上次目标猜测;新 Host 缺根确认先转 S。公共 MySQL/Redis/MinIO 作为 shared-service 项目,Host.host_services 里的 Nginx/WireGuard 不伪装成项目。服务器缺接入走 S,缺系统基线走 H;已明确授权的前置 H/D specs 可组成同一 task 顺序执行,不重复确认。
|
|
21
21
|
|
|
22
22
|
从用户指定的本地路径或固定 Git commit 读取实际清单;analyze 不执行仓库代码。网络获取源码必须用户允许并固定完整提交,不用浮动 main/tag。修改来源版本用 resource_updates 写进新计划,而非伪造旧部署的源码版本。任务执行所用本地构件/脚本放入 input_paths 冻结,编译器新发现的未审阅输入必须停止。
|
|
23
23
|
|
|
@@ -17,6 +17,10 @@ keywords: [ops, host-manage, 服务器, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
计划、执行或恢复前必须读取 `<Path>{roots.workflows}/ops/common/rules/workspace-and-authorization.md</Path>`、`<Path>{roots.workflows}/ops/common/rules/persistence-and-secrets.md</Path>` 和 `<Path>{roots.workflows}/ops/common/rules/recovery.md</Path>`。按本次 profile 读取 `<Path>{roots.workflows}/ops/H-host-manage/references/host-profiles.md</Path>` 的工具环境、Docker/镜像源、资源清理或系统控制/入口章节。
|
|
19
19
|
|
|
20
|
+
## 最小初始化
|
|
21
|
+
|
|
22
|
+
首次准备 Host 先读 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>,使用 server-initialize-spec 生成 H/prepare 规格,经原批准/执行通道补齐根内目录及双边文档。复用现有目录,不改账号 HOME 权限;Docker、语言环境和入口服务按具体需求补齐。登记成功不等于目录、文档或项目运行环境已就绪。
|
|
23
|
+
|
|
20
24
|
## 计划与执行
|
|
21
25
|
|
|
22
26
|
明确受影响消费者 `acknowledged_consumers`;任务还需列 `related_project_ids` 与相关 server_ids。计划包含下载、系统控制文件、服务重启、默认恢复、持久化和验证。影响项目布局/双边文档时先读 `<Path>{roots.workflows}/ops/common/rules/deployment-layout.md</Path>`;共享服务消费者再读 `<Path>{roots.workflows}/ops/common/rules/shared-services.md</Path>`。
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
只读取当前 H 任务命中的章节;多个 profile 的依赖必须全部过门,不因按需读取省掉适用检查。
|
|
4
4
|
|
|
5
|
+
## 最小初始化
|
|
6
|
+
|
|
7
|
+
读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。server-initialize-spec 只生成缺少目录的 mkdir 规格并交付原生成器文档;不安装 Docker、不迁移已有数据、不修改账号默认环境。重复检查复用已有目录,任何文件类型、权限或 owner 冲突停止受影响步骤。
|
|
8
|
+
|
|
5
9
|
## 工具环境
|
|
6
10
|
|
|
7
11
|
区分系统版本、用户默认、项目 pin、服务环境。environment-spec 支持明确版本的 uv、Volta、SDKMAN 管理配方;管理器缺失先用经过审核的安装器。保留旧默认与旧目录,不能为统一外观先删除旧环境。工作流不擅自改写用户 shell profile;激活新管理器入口是另一个明确的准备动作。
|
|
@@ -21,7 +21,7 @@ keywords: [ops, initialize, 控制端, 持久化, 明确范围]
|
|
|
21
21
|
|
|
22
22
|
使用 init 创建控制端身份与绝对 state 根,记录当前工具版本;不会顺便连接远端或清理当前机器。控制端受限账本和默认凭据文档策略按 `<Path>{roots.workflows}/ops/common/rules/persistence-and-secrets.md</Path>` 初始化,不加载后续服务器部署配方。新文档只含 secret_ref,明文交付必须显式 opt-in;真实 env/配置镜像仍受限保存。
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
服务器登记和根选择交给 S,项目登记/安排交给 D;不编造身份、用户名、旧密码或工具版本。控制端需要作为部署目标时必须另外明确登记 local Host,不能把“本机准备”自动变成项目配置。初始化系统软件时再读取 `<Path>{roots.workflows}/ops/common/rules/workspace-and-authorization.md</Path>` 和原 I/H 的完整 spec/plan;缺少管理员权限就报告阻塞,不绕过 sudo。
|
|
25
25
|
|
|
26
26
|
完成条件:控制端状态有效、目录权限受限、工具盘点有证据,后续入口可以独立运行。未具备的服务器能力明确列为缺口。下一步接入服务器用 S,查看已登记资产用 V。
|
|
27
27
|
|
|
@@ -15,6 +15,8 @@ keywords: [ops, 控制端, 服务器, SSH, 项目, 部署, Docker, 持久化,
|
|
|
15
15
|
|
|
16
16
|
激活后按当前任务读取 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,再读取当前 Work 与必要规则;索引自身不授予执行或永久知识写入权限。
|
|
17
17
|
|
|
18
|
+
使用顺序为控制端初始化、指定 Host 初始化、Project 安排到明确 Host。首次 Host 的持久化根由用户选定,建议真实登录主目录下 ops;换账号后仍复用原根。
|
|
19
|
+
|
|
18
20
|
Controller 是发起任务的本机,Server 对应既有 Host.host_id;Project 是业务或共享服务,Deployment 连接项目、服务器、环境和实例。当前目录、上次服务器和浏览看板都不是隐含执行目标。
|
|
19
21
|
|
|
20
22
|
I-initialize:只准备控制端。
|
|
@@ -9,17 +9,21 @@
|
|
|
9
9
|
- **D-project-deploy** — 项目与共享服务部署:固定一个项目及目标服务器,配置项目容器、依赖、升级与双边文档,不隐式取得整台服务器的维护权限。
|
|
10
10
|
- **H-host-manage** — 服务器环境与治理:只维护一个明确服务器的系统基线、Docker 和主机级入口,不把系统配置误路由到项目。
|
|
11
11
|
- **I-initialize** — 控制端初始化:仅准备发起任务的控制端,建立受限状态根与本机工具证据,不默认登记部署服务器。
|
|
12
|
-
- **S-server-connect** — 服务器接入与登记:处理指定服务器的可信 SSH
|
|
12
|
+
- **S-server-connect** — 服务器接入与登记:处理指定服务器的可信 SSH、真实登录主目录探测、用户确认持久化根及接入登记,不部署项目或隐式改写 sshd。
|
|
13
13
|
- **V-inventory-view** — 服务器与部署资产视图:从现有资源和检查证据生成简单 MD、标准 JSON 与离线 HTML,双向查看服务器与项目,不连接或修改目标。
|
|
14
14
|
|
|
15
15
|
<!-- AUTO-INDEX-END -->
|
|
16
16
|
|
|
17
17
|
## 运行时根
|
|
18
18
|
|
|
19
|
-
先打开 workspace 解析 roots。静态代码在 `<Path>{roots.workflows}/ops/</Path>`,真实状态在 `<Path>{roots.state}/ops/</Path>`;调用 `<Path>{roots.workflows}/ops/common/tools/ops.mjs</Path>` 始终显式传绝对 `--state
|
|
19
|
+
先打开 workspace 解析 roots。静态代码在 `<Path>{roots.workflows}/ops/</Path>`,真实状态在 `<Path>{roots.state}/ops/</Path>`;调用 `<Path>{roots.workflows}/ops/common/tools/ops.mjs</Path>` 始终显式传绝对 `--state`,不能指向静态代码目录。首次连接先只读识别真实登录账号与主目录,建议其 `ops` 子目录;用户明确选择后才登记 host.root。根统一承载文档、项目及运行数据,确认后按 Host 复用,换账号不换根。既有根保留,不自动迁移。完整协议见 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。
|
|
20
20
|
|
|
21
21
|
控制端宜集中复用一个独立运维工作区,APP 源码可在其他目录;不从 cwd 猜服务器或项目,不扫描/合并其他状态根。多个已有账本需要显式迁移,不能复制 status.json 冒充合并。
|
|
22
22
|
|
|
23
|
+
## 三段流程与两个维度
|
|
24
|
+
|
|
25
|
+
I 初始化控制端 → S 接入指定 Host、确认根并登记 → H 最小初始化 Host → D 将指定 Project 部署到明确 Host。服务器与项目分别管理,Deployment 关联二者;V 双向查看。最小初始化不默认安装 Docker 或语言环境,按项目需求补齐。
|
|
26
|
+
|
|
23
27
|
## 启动协议
|
|
24
28
|
|
|
25
29
|
激活时读 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,按 ID 定位最小证据。检查 Node >=22.22.3 <25,Python 仅按项目需要。缺 Node 先只读探测,安装须可信本地安装器、SHA256 与对应确认;不执行 curl|sh。
|
|
@@ -41,7 +45,7 @@
|
|
|
41
45
|
|
|
42
46
|
## 状态字段
|
|
43
47
|
|
|
44
|
-
status.json 保持 schema_version=3 的既有资源模型:hosts、projects、deployments、allocations、bindings、releases、controller、policies、public_ingress、revision、updated_at
|
|
48
|
+
status.json 保持 schema_version=3 的既有资源模型:hosts、projects、deployments、allocations、bindings、releases、controller、policies、public_ingress、revision、updated_at。Host.root_confirmation 可选引用 S 的独立回执(receipt_id/digest);新 Host 登记必需,旧 v3 Host 缺省兼容。S 独占 `<Path>{roots.state}/ops/records/servers/{host_id}/onboarding/</Path>`;双边生成器更新 `<Path>{roots.state}/ops/hosts/{host_id}/docs-receipt.json</Path>`,原 Run 回执保持不覆盖。主机基础入口 Nginx/WireGuard 属于 Host.host_services,不伪装成 APP;公共 MySQL/Redis/MinIO 属于项目。
|
|
45
49
|
|
|
46
50
|
version 与 observed_version 分开,未知/未测/过期不改成成功。部署完成必须有真实业务健康与 `both-sides-verified`;docs_pending 不是全部完成。
|
|
47
51
|
|
|
@@ -3,7 +3,7 @@ id: ops/server-connect
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: ops
|
|
5
5
|
name: 服务器接入与登记
|
|
6
|
-
description: 处理指定服务器的可信 SSH
|
|
6
|
+
description: 处理指定服务器的可信 SSH、真实登录主目录探测、用户确认持久化根及接入登记,不部署项目或隐式改写 sshd。
|
|
7
7
|
keywords: [ops, server-connect, 服务器, 持久化, 明确范围]
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -17,12 +17,12 @@ keywords: [ops, server-connect, 服务器, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
## 流程与完成标准
|
|
19
19
|
|
|
20
|
-
必读 `<Path>{roots.workflows}/ops/common/rules/server-onboarding.md</Path
|
|
20
|
+
必读 `<Path>{roots.workflows}/ops/common/rules/server-onboarding.md</Path>` 和 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。输入为明确 server_id、真实地址/端口、远端账号、已验证主机指纹及私钥/agent 来源;根在连接后识别主目录并由用户选定。已有明确指定直接记录,不重复问确认。
|
|
21
21
|
|
|
22
|
-
按 onboarding 唯一顺序推进:可信接入 → 必要的固定 Node 引导 → enroll/盘点 → server-check base。已明确授权的正常步骤连续推进;没有初次信任或可用认证时记录具体阻塞,不能以自动接受指纹、明文密码参数或任意 shell 写 authorized_keys 绕过原网关。
|
|
22
|
+
按 onboarding 唯一顺序推进:可信接入 → server-discover(不提权)→ 用户选定根 / server-root-confirm → 必要的固定 Node 引导 → enroll/盘点 → server-check base。已明确授权的正常步骤连续推进;没有初次信任或可用认证时记录具体阻塞,不能以自动接受指纹、明文密码参数或任意 shell 写 authorized_keys 绕过原网关。
|
|
23
23
|
|
|
24
|
-
新增 records/servers/ID/checks 只由 server-check 写入,不手工补 pass。完成产物为 status.hosts
|
|
24
|
+
新增 records/servers/ID/checks 只由 server-check 写入,不手工补 pass。完成产物为 status.hosts 资源、账号/根确认回执、原 inventory、接入检查回执及缺口清单;登记成功不等于接入成功,base-ready 不等于可部署所有项目。
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
服务器接入完成后:用户已要求服务器初始化则进入 H 的最小初始化;只要求接入则返回路由。更换账号通过 server-connection-spec 验证同机身份并保留原根,按 S 的精确计划批准更新连接。系统环境用 H,项目部署用 D,列表与查看用 V。不从用户当前项目目录推断部署目标,不将控制端自动登记为目标机器。
|
|
27
27
|
|
|
28
28
|
需要实际命令参数时,只查当前动作的合同:`<Path>{roots.workflows}/ops/common/USAGE.md</Path>` 与 `<Path>{roots.workflows}/ops/common/WORKSPACE-USAGE.md</Path>`;执行只通过现有 ops.mjs 网关及明确新增的任务命令,不绕过授权直接拼接目标修改命令。
|
|
@@ -11,6 +11,8 @@ keywords: [ops, inventory-view, 资产清单, 持久化, 明确范围]
|
|
|
11
11
|
|
|
12
12
|
激活本 Work 后先读取 `<Path>{roots.workflows}/ops/README.md</Path>`。
|
|
13
13
|
|
|
14
|
+
视图按 Host 与 Project 双向组织,并列出连接账号、持久化根、根确认状态以及目录/双边文档/项目运行环境的分别验证结果;旧根标记 legacy-registered,不补造确认。只读取允许的回执摘要,不输出确认原话或私钥来源。
|
|
15
|
+
|
|
14
16
|
## 读取范围
|
|
15
17
|
|
|
16
18
|
读取 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,按当前 ID 定位最小证据。
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
| 控制端 | Node 标准库 CLI(ops.mjs);状态、锁、受限凭据、计划、执行 | 无第三方 npm 包;使用一个专用控制工作区的绝对 STATE,不按当前 APP 目录隐式切换 |
|
|
8
8
|
| 明确范围 | I 控制端、S 服务器接入、H 服务器维护、D 项目部署、V 资产视图;route 输出明确主体 | server 是 Host.host_id 的用户名称,不是新增第二套服务器账本;原 I/H/D 命令兼容 |
|
|
9
9
|
| 连续执行 | 冻结任务规格、一次原始授权、关联原生 plan/approval/apply,逐步骤验证 | H/D 任务内不重复询问;范围/输入/连接/凭据/执行器漂移或过期停止;任意命令仍是受信任代码,不是沙箱 |
|
|
10
|
+
| 首次持久化根 | server-discover 不提权读取真实主目录;server-root-confirm 记录用户选定根,新 Host 必需回执 | Linux 无需 Node;其他 SSH 平台需已有 Node;默认真实主目录下 ops,确认不授权安装,旧根不迁移 |
|
|
11
|
+
| Host 最小初始化 | server-initialize-spec 生成目录及原双边文档计划;server-connection-spec 验证同机换账号 | Docker/语言环境按需求准备;不递归改 HOME;现有 scp 对含空白根的 Node 引导在写入前阻塞 |
|
|
10
12
|
| Linux 接入检查 | SSH 公钥认证、身份、Node、根目录、容量与 Compose profile;16 项清单、时间和摘要 | 公钥/agent 与可信 known_hosts 必须先存在;没有首次密码登录、公钥自动分发或自动信任主机密钥功能;未测安全项明确 unknown |
|
|
11
13
|
| Linux local | 原生 oneshot;systemd 配置/权限/健康门;Docker Engine Compose | systemd、Docker 和特权配置需要真实有权限主机验收;临时目录测试不能代替 |
|
|
12
14
|
| SSH | OpenSSH 密钥或 agent;固定 known_hosts;目标身份;可 sudo -n;Linux 缺 Node 可用固定 Volta 引导 | 引导 pin 见 common/toolchains/volta-linux.json;Windows 仍要求已有 Node;不实现交互式 SSH 密码登录 |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# OPS 2.
|
|
1
|
+
# OPS 2.3 操作手册
|
|
2
2
|
|
|
3
3
|
命令中的 WORKFLOW 是解压后的静态 ops 路径,STATE 是部署机永久状态绝对路径。示例用 Linux;PowerShell 传相同参数即可。所有示例密码、主机名和提交值均为演示,不可当作生产配置。
|
|
4
4
|
|
|
@@ -12,13 +12,13 @@ node /path/to/ops/common/tools/ops.mjs probe --output /safe/path/local-inventory
|
|
|
12
12
|
|
|
13
13
|
没有 Node 时运行 common/tools/bootstrap.sh probe 或 bootstrap.ps1 -Probe,只做检测。经过批准的本地安装器还需精确 SHA256 与确认字符串。完成后重新 init。SSH 目标缺 Node 不要对本机 bootstrap.sh 假装能装远端,改走下面的 `bootstrap-node`。
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
首次接入先按 WORKSPACE-USAGE 的 server-discover → 用户选定根 → server-root-confirm 流程取得 root_confirmation,再将返回 identity/root/root_confirmation 放入 host.json;新登记缺确认会阻塞。初次远端的 identity=discover 仅可用于只读 probe 或 enroll 的身份重验,connection 包含 hostname、username、known_hosts,可选 port、identity_file、sudo、shell。known_hosts 必须已经通过可信方式核对,不能自动信任 ssh-keyscan 输出。目标还没有 Node 时不要填一个 PATH 上的 `node` 然后把盘点留在对话里:
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
18
|
node /path/to/ops/common/tools/ops.mjs bootstrap-node --connection-file /safe/path/host-discovery.json --probe
|
|
19
19
|
# 若 tools.node=missing,准备已审核的 volta/node tar(SHA256 见 common/toolchains/volta-linux.json),再:
|
|
20
20
|
node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops bootstrap-node --apply \
|
|
21
|
-
--connection-file /safe/path/host-discovery.json --host-id node-a --account
|
|
21
|
+
--connection-file /safe/path/host-discovery.json --host-id node-a --account wta --host-root /home/wta/ops \
|
|
22
22
|
--volta-archive /safe/volta-2.0.2-linux.tar.gz --volta-sha256 PINNED \
|
|
23
23
|
--node-archive /safe/node-v24.21.0-linux-x64.tar.gz --node-sha256 PINNED \
|
|
24
24
|
--ack I-APPROVE-THIS-BOOTSTRAP
|
|
@@ -37,7 +37,7 @@ node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops enroll --fi
|
|
|
37
37
|
node /path/to/ops/common/tools/ops.mjs probe --connection-file /safe/path/host-discovery.json --output /safe/path/host-observed.json
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
核对后将真实 identity 写回 register.json,再登记。正式 register 不接受 discover
|
|
40
|
+
核对后将真实 identity、用户确认的 root 及返回的 root_confirmation 写回 register.json,再登记。正式 register 不接受 discover;示例中的零摘要不能作为确认回执。
|
|
41
41
|
|
|
42
42
|
```sh
|
|
43
43
|
node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops register --file /safe/path/register.json
|
|
@@ -90,7 +90,7 @@ H.host_actions 支持 mkdir、write-file(host.root 内相对路径;不得写
|
|
|
90
90
|
|
|
91
91
|
## 5. 升级、共享与迁移
|
|
92
92
|
|
|
93
|
-
upgrade/rollback 与 deploy 使用相同完整 Deployment 输入,但 version、构件、环境变更都必须显式。Project.source
|
|
93
|
+
upgrade/rollback 与 deploy 使用相同完整 Deployment 输入,但 version、构件、环境变更都必须显式。Project.source 更新通过 spec.resource_updates。Host.connection 更新由 S 的 server-connection-spec 先验证同机与原根权限,再走精确 plan/approve/apply;固定身份/root/kind 和 root_confirmation 不可改,H/D task 不承接连接变更。
|
|
94
94
|
|
|
95
95
|
公共服务先作为 shared-service 登记并部署。Allocation 带逻辑资源 owner 与 app credential,Binding 将 APP 指向 provider。创建 allocation 必须配 provision/mysql|redis|minio|existing;existing 必须实际验证。示例见 common/examples 与 service-profiles。
|
|
96
96
|
|
|
@@ -17,7 +17,34 @@ node "$OPS" --state "$STATE" init --controller-id control-a
|
|
|
17
17
|
node "$OPS" --state "$STATE" route --scope access --server node-a
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
按 S 的 server-onboarding.md
|
|
20
|
+
按 S 的 server-onboarding.md 完成可信指纹与 key/agent,再读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。route 只路由;首次密码登录和公钥分发仍需既有可信交互通道。
|
|
21
|
+
|
|
22
|
+
连接文件提供 platform、transport、connection,结构见 <Path>{roots.workflows}/ops/common/examples/server-connection.example.json</Path>。Linux 无需预装 Node 或预填 root:
|
|
23
|
+
|
|
24
|
+
~~~sh
|
|
25
|
+
node "$OPS" --state "$STATE" server-discover --server node-a --connection-file /safe/connection.json
|
|
26
|
+
# Agent 展示实际账号、主目录和建议根,记录用户指定或接受路径的原话。
|
|
27
|
+
node "$OPS" --state "$STATE" server-root-confirm --server node-a --discovery RETURNED_DISCOVERY_ID --root /home/wta/ops --by actual-user --statement '用户实际给出的路径确认语句及来源'
|
|
28
|
+
~~~
|
|
29
|
+
|
|
30
|
+
将返回的 identity/root/root_confirmation 原样写入 Host 连接/登记文件。默认建议为真实登录主目录下 ops,root 通常 /root/ops、wta 通常 /home/wta/ops,自定义主目录以实际探测为准。已有明确指定不重复询问;建议本身不是确认,取消或未确认不写目标。根确认不代替安装授权。
|
|
31
|
+
|
|
32
|
+
已有 Node 时 enroll;缺 Node 时按 USAGE 的固定 bootstrap-node 网关执行,连接文件须携带确认回执,--account 使用实际登录账号,--host-root 与确认一致。登记后最小初始化:
|
|
33
|
+
|
|
34
|
+
~~~sh
|
|
35
|
+
node "$OPS" --state "$STATE" server-initialize-spec --server node-a --output /safe/host-initialize.json
|
|
36
|
+
node "$OPS" --state "$STATE" plan --file /safe/host-initialize.json
|
|
37
|
+
# 走原 approve/apply,或把规格放入已授权 H/D task。
|
|
38
|
+
~~~
|
|
39
|
+
|
|
40
|
+
最小初始化只准备受管目录和双边文档;Docker/Compose、语言环境及入口服务按项目需要经 H 准备。登记、目录准备、文档交付和项目运行基线分别验证。
|
|
41
|
+
|
|
42
|
+
同机换账号先准备新连接文件并保留原 root:
|
|
43
|
+
|
|
44
|
+
~~~sh
|
|
45
|
+
node "$OPS" --state "$STATE" server-connection-spec --server node-a --connection-file /safe/new-connection.json --output /safe/connection-update.json
|
|
46
|
+
# S 拥有的精确 plan/approve/apply;不通过 H/D task 更换连接,不撤销旧通道。
|
|
47
|
+
~~~
|
|
21
48
|
|
|
22
49
|
已有真实服务器登记后:
|
|
23
50
|
|
|
@@ -62,7 +89,7 @@ CLI 故意不把 task-plan 等同授权;入口替用户完成后续命令,
|
|
|
62
89
|
node "$OPS" --state "$STATE" fleet --stale-hours 24
|
|
63
90
|
```
|
|
64
91
|
|
|
65
|
-
直接打开输出的 FLEET.md,点击离线看板;也可直接打开命令返回的 HTML 绝对路径。无需启动 Web
|
|
92
|
+
直接打开输出的 FLEET.md,点击离线看板;也可直接打开命令返回的 HTML 绝对路径。无需启动 Web 服务。服务器、项目、部署记录状态和关键词可筛选;新增连接账号、已确认根、目录/文档/运行基线分别验证状态,旧根标为 legacy-registered,不导出确认原话;点击项目/服务器可反向查询。看板只读,不提供远程连接、部署、重试按钮,不拉取实时健康数据。
|
|
66
93
|
|
|
67
94
|
MD/HTML/JSON 同批次持久化在 records/views,根 FLEET.md 最后更新。新看板不覆盖原 FLEET-DEPLOYMENTS.md。输出虽无凭据字段,仍包含内部拓扑,不能直接公开上传。
|
|
68
95
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
这些文件是结构示例,不是可直接部署的生产参数。0 的主机指纹/镜像摘要、example.invalid、REPLACE、示例密码必须根据真实探测与项目清单替换。环境示例版本仅展示固定版本语法,不推荐使用该版本,更不声称它是最新或仍受支持。
|
|
4
4
|
|
|
5
|
-
register 和 credential 是本地登记请求;compose-app、shared-allocation 是 spec;binding 是放入 spec.bindings 的单个对象。凭据管理员/应用分离。实际共享分配要求 provider 已完成部署并登记 service.compose_service 与 administrator credential;不能只复制示例便声称分配成功。
|
|
5
|
+
server-connection 是首次只读探测输入;register 的 root_confirmation 必须换成 server-root-confirm 返回的真实引用,零摘要不能执行。已有明确指定根直接记录原话,不从示例推断默认。register 和 credential 是本地登记请求;compose-app、shared-allocation 是 spec;binding 是放入 spec.bindings 的单个对象。凭据管理员/应用分离。实际共享分配要求 provider 已完成部署并登记 service.compose_service 与 administrator credential;不能只复制示例便声称分配成功。
|
|
6
6
|
|
|
7
7
|
真实无网络演练使用 common/tools/demo-local.mjs --output 新空目录,会自动构造自包含示例与一次精确 demo 批准,严禁把该批准自动化用于生产。
|
|
@@ -5,15 +5,19 @@
|
|
|
5
5
|
"display_name": "REPLACE: reviewed target",
|
|
6
6
|
"platform": "linux",
|
|
7
7
|
"transport": "ssh",
|
|
8
|
-
"root": "/
|
|
8
|
+
"root": "/home/wta/ops",
|
|
9
9
|
"identity": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
10
10
|
"connection": {
|
|
11
11
|
"hostname": "REPLACE.invalid",
|
|
12
|
-
"username": "
|
|
12
|
+
"username": "wta",
|
|
13
13
|
"port": 22,
|
|
14
14
|
"known_hosts": "/REPLACE/known_hosts",
|
|
15
|
-
"node": "/
|
|
15
|
+
"node": "/home/wta/ops/_host/toolchains/wta/volta/bin/ops-node",
|
|
16
16
|
"sudo": true
|
|
17
|
+
},
|
|
18
|
+
"root_confirmation": {
|
|
19
|
+
"receipt_id": "root-replace-with-real-receipt",
|
|
20
|
+
"digest": "0000000000000000000000000000000000000000000000000000000000000000"
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
],
|
|
@@ -4,7 +4,7 @@ D 创建、升级、迁移或交付项目时读取;H 维护影响已有项目
|
|
|
4
4
|
|
|
5
5
|
## 持久化约定
|
|
6
6
|
|
|
7
|
-
APP 和公共服务都在 host_root/project_id,同级聚合。Docker 与原生部署都遵循相同的项目根,不能因为工具默认而写入其他业务数据目录。
|
|
7
|
+
host_root 来自 S 的真实账号探测及用户确认,默认建议登录主目录下 ops;已登记后不再根据账号 HOME 推导。APP 和公共服务都在 host_root/project_id,同级聚合。Docker 与原生部署都遵循相同的项目根,不能因为工具默认而写入其他业务数据目录。
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
host_root/
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Host 首次接入与持久化根
|
|
2
|
+
|
|
3
|
+
S 在首次接入、确认根或更换连接时读取;H 最小初始化与 D 持久化预检也读取。本合同拥有账号探测和根确认规则;系统安装、项目部署、知识改写仍由原网关授权。
|
|
4
|
+
|
|
5
|
+
## 三段流程与两个管理维度
|
|
6
|
+
|
|
7
|
+
I 先初始化发起操作的控制端;S 接入用户指定 Host,再由 H 完成该 Host 的最小初始化;D 将明确 Project 安排到一个或多个明确 Host。Host 管机器身份、连接和持久化根;Project 管来源及项目需求;Deployment 连接项目、Host、环境和实例。V 提供双向只读视图。五个 Work 保留,不创建第二套 Server 账本。
|
|
8
|
+
|
|
9
|
+
只要求连接时,S 完成接入后返回 H 路由;用户已请求服务器初始化或项目安装时,已获授权的前置步骤连续执行。根目录选择不替代软件安装或项目部署授权。
|
|
10
|
+
|
|
11
|
+
## 首次选择
|
|
12
|
+
|
|
13
|
+
1. 已验证 host key 和 key/agent 登录具备后,执行 `server-discover --server ID --connection-file ABSOLUTE_FILE`。连接文件提供 platform、transport、connection;无需先有 root 或 Node。
|
|
14
|
+
2. Linux 使用不提权的 POSIX 只读探测,从实际登录 uid 的账号数据库得到账号和主目录;不得用控制端 HOME、sudo 后的 HOME 或 `/home/用户名` 推测。Windows/macOS SSH 仍需已有 Node,通过远端账号信息读取真实主目录;显式 local Host 使用本机账号信息。
|
|
15
|
+
3. 默认建议为真实主目录的 `ops` 子目录,例如 `/home/wta/ops`、`/root/ops`。首次必须由用户输入绝对路径或明确接受建议。用户已明确指定就记录其原话,不重复询问;静默、示例、任务文件和默认值不是确认。
|
|
16
|
+
4. 使用 `server-root-confirm --server ID --discovery DISCOVERY_ID --root ABSOLUTE_ROOT --by USER --statement '实际确认原话与来源'`。该命令只写控制端回执,不创建远端目录。取消或未确认时不登记新 Host,不安装、不写目标。
|
|
17
|
+
5. 将返回的 `identity`、`root`、`root_confirmation` 原样放入 Host 输入;需要固定 Node 引导时,连接文件也携带这些字段。`register/enroll` 新 Host 缺回执会阻塞;不能以 `identity=discover` 绕过确认。必要的 Node 引导继续要求可信固定 tar、SHA256 和独立 ack,然后 enroll 保存真实 inventory。
|
|
18
|
+
|
|
19
|
+
默认根统一承载服务器文档、项目配置、业务数据、日志、备份、受管工具链和 Docker data-root。控制端 `.speculo/ops` 仍保存资源账本、受限凭据及双边执行证据;不是把控制端目录移到服务器。
|
|
20
|
+
|
|
21
|
+
## 路径与权限
|
|
22
|
+
|
|
23
|
+
根必须为规范化绝对路径和专用子目录,不能是账号主目录本身、系统目录、链接/junction/UNC/ADS 路径或已登记根的重叠目录。探测检查路径祖先和受管入口,首次使用非空无 owner 根必须先选择空目录或取得专门的接管方案,不能覆盖其 README 或业务文件。
|
|
24
|
+
|
|
25
|
+
检查登录账号对根或最近已有父目录的写入/搜索权限;不足就明确列出待处理权限,不改用另一目录,不递归 chown/chmod HOME。Linux bootstrap 在登录账号身份下写入;缺 Node 且根包含空白时,现有 scp 适配不支持,必须在写入前阻塞并说明可先提供现有 Node。H 的特权动作仍按明确计划提权。
|
|
26
|
+
|
|
27
|
+
执行前重读回执、身份与路径。探测和确认期间身份、账号、主目录或 known_hosts 漂移则重新探测;这不允许自动接受新 host key。目标根的 `.ops-host.json` 继续由原执行器及固定 bootstrap 网关建立,绑定 host_id 与机器身份;其他 owner、锁、失败和 unknown 保留现场。
|
|
28
|
+
|
|
29
|
+
新确认 Host 的目录锁与解锁使用实际登录账号,确保首次根、owner 标记和锁目录仍由该账号持有;具体计划步骤才按 connection.sudo 提权。已有无确认引用的 Host 保留原执行身份。不会递归变更既有文件的所有者或权限。
|
|
30
|
+
|
|
31
|
+
## 最小初始化与后续使用
|
|
32
|
+
|
|
33
|
+
登记后使用 `server-initialize-spec --server ID --output ABSOLUTE_FILE` 生成 H/prepare 规格,经原 plan/approve/apply 或获准 H/D task 执行。它只补齐 `_host/cache`、`_host/installers`、`_host/toolchains`、`_runtime`、`docs/standards`、`knowledge`,并由原生成器交付 README、DEPLOYMENTS 与双边回执;已有目录复用。
|
|
34
|
+
|
|
35
|
+
Docker、Compose、Python、Java、Node 项目版本及 Nginx/WireGuard 按项目要求进入 H 对应分支。既有 Docker data-root 不一致仍需单独迁移方案。登记、目录准备、文档交付、compose/native 就绪分别呈现;base-ready 不代表任意项目可部署。
|
|
36
|
+
|
|
37
|
+
项目根始终由 host.root/project_id 派生;显式多实例沿用 project/instances/environment/instance。D 不另选服务器根、不从 cwd 或上次目标推断部署位置。布局细节读取 `<Path>{roots.workflows}/ops/common/rules/deployment-layout.md</Path>`。
|
|
38
|
+
|
|
39
|
+
## 同机换账号、兼容和恢复
|
|
40
|
+
|
|
41
|
+
同机新账号复用既有 Host 与原根。使用 `server-connection-spec --server ID --connection-file ABSOLUTE_FILE --output ABSOLUTE_FILE` 验证同机身份、新账号与原根权限,生成资源连接更新,走 S 拥有的原精确 plan/approve/apply 网关;H/D task 不得借此扩大连接权限。它保留原 root_confirmation,新会话成功后再讨论旧登录通道撤销。
|
|
42
|
+
|
|
43
|
+
已有 v3 Host 可以没有 root_confirmation,原 `/srv/ops` 等根继续有效,不补造历史确认、不修改旧 Run/Release。旧同机多根账本在需要自动识别/重接入时阻塞歧义,既有明确 Host/root 的运行证据保留。不自动合并账本或迁移目录;实际根迁移另行形成可恢复方案。
|
|
44
|
+
|
|
45
|
+
schema v3 的 Host.root 是唯一路径事实源。S 独占 `<Path>{roots.state}/ops/records/servers/{host_id}/onboarding/</Path>` 的 discovery/root 回执;独立 schema,带源摘要、原话、确认者和时间,原子排他写入后回读。Host.root_confirmation 只存 receipt_id/digest 引用。只读 V 仅投影允许的摘要,不导出原始确认语句或连接凭据文件。
|
|
46
|
+
|
|
47
|
+
bootstrap 将 started/installed 证据保存在 `<Path>{roots.state}/ops/hosts/{host_id}/bootstrap/</Path>`。同一机器/根的引导一旦 started 不自动重放,换确认回执也不能绕过;先读取报错给出的 attempt 文件、收据和远端现场,确认旧进程已停止。仅在用户明确授权恢复、原固定构件/账号/路径摘要一致时,原 bootstrap-node 参数追加 `--recover-ack I-VERIFIED-BOOTSTRAP-IS-STOPPED --recovery-statement 实际恢复授权原话`;保存旧 attempt 的不可覆盖 recovery 记录后重试。输入不同则阻塞,另行设计修复。H/D 的失败、docs_pending、unknown 按 `<Path>{roots.workflows}/ops/common/rules/recovery.md</Path>` 恢复,文档补交不重跑业务。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 硬性路径
|
|
4
4
|
|
|
5
|
-
Host 登记后 root
|
|
5
|
+
首次接入按 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path> 探测实际登录主目录,建议其 ops 子目录并由用户选定。Host 登记后 root 固定,更换账号不改根;Project 使用 kebab ID;Deployment 默认 root/project,同级 APP 与公共服务。多实例显式用 root/project/instances/env/instance。不能通过 symlink、junction、UNC、ADS、相对路径越界或双重登记绕过。
|
|
6
6
|
|
|
7
7
|
业务持久化目录为 data/component/purpose;日志 logs/component;环境 env/;生成配置 config/。Dockerfile 与 Compose 同在 compose/。原生服务配置在 service/,其文件不自动改变业务数据归属。系统服务文件是单独审批的控制文件例外,不是数据存储例外。
|
|
8
8
|
|
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
| [SSH configuration Skill](https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/0365f57a079b1332f95cf26e31dd2d5332a8399f/infrastructure/servers/ssh-configuration/SKILL.md) | key/agent、指纹、客户端配置、公钥分发、轮换先验证新 key | 密钥/agent 优先、公钥认证单独验收、保留旧通道、接入失败明确阻塞 | 不默认无口令私钥,不自动清 agent,不照搬 sshd 算法清单/关闭密码登录,不隐式添加 ProxyJump 能力 |
|
|
10
10
|
| [Speculo 基线执行器](https://github.com/NAMEWTA/Speculo/tree/60389759ede9f8c4f14b2f7e70da614dfe574ece/template/workflows/ops/common/tools/opslib) | planner、execution、transport、agent、CLI 与 schema | 复用摘要批准、受限写集、身份验证、失败停止、双边回执 | 不重写已有安全底座,不移动历史 Run,不用可视化替代真实验收 |
|
|
11
11
|
|
|
12
|
+
## 2.3 首次根确认与 Host/Project 分工
|
|
13
|
+
|
|
14
|
+
- [Ansible 主机变量与连接参数](https://docs.ansible.com/projects/ansible/latest/inventory_guide/intro_inventory.html):采用机器身份、登录账号和提权参数分别表达的方法,账号主目录在提权前探测。
|
|
15
|
+
- [Kamal 服务器声明](https://kamal-deploy.org/docs/configuration/servers/):采用项目显式声明目标服务器的方法,保留 Deployment 环境/实例关联;默认 root 登录和自动 Docker 安装不进入本 workflow 的默认初始化。
|
|
16
|
+
- [pyinfra](https://github.com/pyinfra-dev/pyinfra):采用先获取事实、再计算必要操作的方法;最小初始化只生成缺失目录动作,保留原摘要批准和恢复。
|
|
17
|
+
|
|
18
|
+
资料于 2026-10-08 在线读取,只采用方法并自行实现,没有复制外部代码或增加运行依赖。已有 SSH Skill 的固定提交、许可与采用边界保留。新增行为是首次根目录的真实用户选择门;建议不等于确认。换账号保留原根,旧 v3 不自动迁移或补写历史确认。
|
|
19
|
+
|
|
12
20
|
## 设计取舍
|
|
13
21
|
|
|
14
22
|
一次授权的对象是有限任务与精确规格,不是“此后所有运维”。本次任务 runner 增加编译前/后的目标与修改集检查,保留原逐 Run 审批文件,但不要求每步由用户再次对话确认。它不是签名授权系统,也不是防御拥有控制端写权限的恶意管理员的沙箱。
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## 接入顺序
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
先读 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。确认用户已经提供的 server_id、地址/端口、远端账号、可信主机指纹、控制端 SSH 客户端与认证来源;不重复索取已有输入,不把别名相似当作同一服务器。首次指纹必须经云控制台/控制台/既有可信渠道核对,ssh-keyscan 只能收集候选值,不能完成信任。
|
|
8
8
|
|
|
9
9
|
优先复用受限私钥与 ssh-agent。免密登录指无需重复输入服务器账号密码,不等于私钥必须无口令;不得默认 ssh-keygen -N "",不得复制私钥到服务器、项目或看板,也不把密码放在 JSON/argv/日志。只登记 identity_file 的本地受限路径;使用 agent 时不能自动清空用户已有 agent。
|
|
10
10
|
|
|
11
11
|
已有可信登录通道时,仅在原明确授权范围内分发指定公钥,保持旧登录通道,核验新会话成功后才讨论轮换撤销。公钥分发/sshd 修改不是 task-run 的隐式能力;当前执行器不提供首次密码登录或 authorized_keys 写入适配。缺少已验证 key/agent 时,给出待用户在可信交互终端/云控制台完成的最小公钥分发步骤与精确目标,记录“接入阻塞”,不要宣称自动完成,也不要绕过 ops 的写入网关用 sshpass 或任意 shell 写服务器。禁止为方便部署自动关闭密码登录、改 SSH 端口或重启 sshd;这些需要专用可恢复方案。
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
信任和公钥认证具备后,先用 server-discover 不提权读取实际账号主目录与身份,由用户指定或接受主目录下 ops,使用 server-root-confirm 保存真实确认;新 root 未确认不安装、不登记。随后用 USAGE 中的 probe 读取运行环境;Linux SSH 缺 Node 时走原 bootstrap-node 的固定 Volta/Node、已审核 tar SHA256 与独立 ack。复用已有 Node,不改 shell profile。随后 enroll(或 register + probe --host)把真实身份与盘点持久化;identity=discover 不可用于 apply。
|
|
14
14
|
|
|
15
15
|
最后运行 `server-check --server ID --profile base`。只有成功验证严格主机密钥、公钥认证和实际机器身份后,才写“接入检查通过”;未通过项与证据文件必须列出。需要 Docker 的项目再走 H 的 compose profile,不能把 base-ready 等同完整部署基线。
|
|
16
16
|
|
|
@@ -22,6 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
## 固定 Node 引导的完成门
|
|
24
24
|
|
|
25
|
-
Linux SSH 缺 Node 时由 S 使用 `ops.mjs bootstrap-node
|
|
25
|
+
Linux SSH 缺 Node 时由 S 使用 `ops.mjs bootstrap-node`:先核对 root_confirmation、真实机器与根权限,控制端校验已审核 tar 的 SHA256,使用登录账号 scp 到已确认根,远端 POSIX 展开固定 Volta/Node;必须使用独立 ack/SHA256 网关,不走 H/D plan/approve。引导后必须 enroll(或 register 后 probe --host),取得真实 inventory/snapshot 与 status.hosts 记录,不能只把盘点留在对话中。
|
|
26
26
|
|
|
27
27
|
已有 Node 不重复安装、不改 shell profile。缺 Node 可以阻塞 apply,但不阻塞安全的登记;Windows/macOS 仍要求目标已有 Node。该能力不绕过初次主机信任、可用 SSH 登录或用户批准的固定构件。
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
| 用户目的 | scope / Work | 必需输入 | 明确不做 |
|
|
8
8
|
| --- | --- | --- | --- |
|
|
9
9
|
| 准备发起操作的本机 | controller / I | 控制端 ID、绝对 state 根 | 不默认把本机登记为服务器 |
|
|
10
|
-
| 接入一台服务器 | access / S | 一个 server_id
|
|
10
|
+
| 接入一台服务器 | access / S | 一个 server_id、可信连接与身份、首次根选择 | 不部署项目、不自动信任主机密钥 |
|
|
11
11
|
| 配置系统环境、Docker、Nginx | server / H | 一个已登记 server_id | 不从 cwd 推断 project |
|
|
12
12
|
| 安装 APP 或共享服务 | project / D | 一个 project_id、明确 server_ids、真实需求 | 不猜服务器、不把主机级入口伪装成 APP |
|
|
13
13
|
| 看服务器/项目清单 | inventory / V | 已初始化 state 根 | 不联网、不部署、不授予后续操作权限 |
|
|
@@ -36,4 +36,4 @@ H 入口选择一台明确服务器;一个 server 任务可以串行多个 H
|
|
|
36
36
|
|
|
37
37
|
正常完成必须以原 apply 返回 completed 且双边回执成立为准,再生成 V 的本地视图。V 失败记为“执行结果已保存、视图生成失败”,不能重跑业务。文档或索引不会自动变成永久知识;知识写入仍走原 owner/gateway 并获得独立同意。
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
首次根选择按 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path> 执行。server-root-confirm 只记录真实用户路径决定,不代替安装授权;已有明确指定不重复询问。当前任务编排只接入 H/D;I 初始化和 S 的首次信任建立/固定 Node bootstrap 保留原网关,不用任务授权掩盖缺失的 SSH 登录条件。
|
|
@@ -170,6 +170,70 @@
|
|
|
170
170
|
],
|
|
171
171
|
"additionalProperties": false
|
|
172
172
|
}
|
|
173
|
+
},
|
|
174
|
+
"login_account": {
|
|
175
|
+
"type": "string"
|
|
176
|
+
},
|
|
177
|
+
"root_confirmation": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"properties": {
|
|
180
|
+
"status": {
|
|
181
|
+
"enum": [
|
|
182
|
+
"confirmed",
|
|
183
|
+
"unverified",
|
|
184
|
+
"legacy-registered"
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
"login_home": {
|
|
188
|
+
"type": [
|
|
189
|
+
"string",
|
|
190
|
+
"null"
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
"confirmed_at": {
|
|
194
|
+
"type": [
|
|
195
|
+
"string",
|
|
196
|
+
"null"
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"required": [
|
|
201
|
+
"status",
|
|
202
|
+
"login_home",
|
|
203
|
+
"confirmed_at"
|
|
204
|
+
],
|
|
205
|
+
"additionalProperties": false
|
|
206
|
+
},
|
|
207
|
+
"initialization": {
|
|
208
|
+
"type": "object",
|
|
209
|
+
"properties": {
|
|
210
|
+
"registered": {
|
|
211
|
+
"const": true
|
|
212
|
+
},
|
|
213
|
+
"directory": {
|
|
214
|
+
"type": "string"
|
|
215
|
+
},
|
|
216
|
+
"documents": {
|
|
217
|
+
"enum": [
|
|
218
|
+
"unknown",
|
|
219
|
+
"both-sides-verified"
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
"runtime": {
|
|
223
|
+
"enum": [
|
|
224
|
+
"unverified",
|
|
225
|
+
"native",
|
|
226
|
+
"compose"
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"required": [
|
|
231
|
+
"registered",
|
|
232
|
+
"directory",
|
|
233
|
+
"documents",
|
|
234
|
+
"runtime"
|
|
235
|
+
],
|
|
236
|
+
"additionalProperties": false
|
|
173
237
|
}
|
|
174
238
|
},
|
|
175
239
|
"required": [
|
|
@@ -76,6 +76,25 @@
|
|
|
76
76
|
},
|
|
77
77
|
"host_services": {
|
|
78
78
|
"$ref": "#/$defs/host_services"
|
|
79
|
+
},
|
|
80
|
+
"root_confirmation": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"properties": {
|
|
83
|
+
"receipt_id": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
86
|
+
"maxLength": 80
|
|
87
|
+
},
|
|
88
|
+
"digest": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"required": [
|
|
94
|
+
"receipt_id",
|
|
95
|
+
"digest"
|
|
96
|
+
],
|
|
97
|
+
"additionalProperties": false
|
|
79
98
|
}
|
|
80
99
|
},
|
|
81
100
|
"required": [
|
|
@@ -242,6 +242,25 @@
|
|
|
242
242
|
],
|
|
243
243
|
"additionalProperties": false
|
|
244
244
|
}
|
|
245
|
+
},
|
|
246
|
+
"root_confirmation": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"properties": {
|
|
249
|
+
"receipt_id": {
|
|
250
|
+
"type": "string",
|
|
251
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
252
|
+
"maxLength": 80
|
|
253
|
+
},
|
|
254
|
+
"digest": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"required": [
|
|
260
|
+
"receipt_id",
|
|
261
|
+
"digest"
|
|
262
|
+
],
|
|
263
|
+
"additionalProperties": false
|
|
245
264
|
}
|
|
246
265
|
},
|
|
247
266
|
"required": [
|
|
@@ -717,6 +736,25 @@
|
|
|
717
736
|
],
|
|
718
737
|
"additionalProperties": false
|
|
719
738
|
}
|
|
739
|
+
},
|
|
740
|
+
"root_confirmation": {
|
|
741
|
+
"type": "object",
|
|
742
|
+
"properties": {
|
|
743
|
+
"receipt_id": {
|
|
744
|
+
"type": "string",
|
|
745
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
746
|
+
"maxLength": 80
|
|
747
|
+
},
|
|
748
|
+
"digest": {
|
|
749
|
+
"type": "string",
|
|
750
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
751
|
+
}
|
|
752
|
+
},
|
|
753
|
+
"required": [
|
|
754
|
+
"receipt_id",
|
|
755
|
+
"digest"
|
|
756
|
+
],
|
|
757
|
+
"additionalProperties": false
|
|
720
758
|
}
|
|
721
759
|
},
|
|
722
760
|
"required": [
|
|
@@ -1408,6 +1446,25 @@
|
|
|
1408
1446
|
],
|
|
1409
1447
|
"additionalProperties": false
|
|
1410
1448
|
}
|
|
1449
|
+
},
|
|
1450
|
+
"root_confirmation": {
|
|
1451
|
+
"type": "object",
|
|
1452
|
+
"properties": {
|
|
1453
|
+
"receipt_id": {
|
|
1454
|
+
"type": "string",
|
|
1455
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
1456
|
+
"maxLength": 80
|
|
1457
|
+
},
|
|
1458
|
+
"digest": {
|
|
1459
|
+
"type": "string",
|
|
1460
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
1461
|
+
}
|
|
1462
|
+
},
|
|
1463
|
+
"required": [
|
|
1464
|
+
"receipt_id",
|
|
1465
|
+
"digest"
|
|
1466
|
+
],
|
|
1467
|
+
"additionalProperties": false
|
|
1411
1468
|
}
|
|
1412
1469
|
},
|
|
1413
1470
|
"required": [
|