# infra/cloud-init —— 节点一段式安装 加速节点开机即用所需的全部物料。控制面(或 #14 弹性开机)在创建节点前,用 `sed` 把模板里的 `__PLACEHOLDER__` 替换成真实值(沿用 `deploy/` 渲染约定),再作为 user-data 注入。 ## 文件 - `node.yaml.tmpl` —— cloud-config 模板。写入 `/etc/pangolin-agent/agent.env` (含一次性 bootstrap token,0600),下载并按 SHA-256 校验 `install-node.sh` 后执行。 - `install-node.sh` —— 幂等安装脚本:下载锁定版本的 `sing-box` + `pangolin-agent` 二进制并校验 SHA-256,装 systemd 单元(agent 拉管 sing-box),生成 Hy2 自签证书, 启动 agent(首启即 Enroll/Register)。`shellcheck -S warning` 通过。 ## 占位符 | 占位符 | 含义 | | --- | --- | | `__CONTROL_PLANE__` | 控制面 gRPC 地址 `host:port` | | `__SERVER_NAME__` | 校验控制面证书的 TLS SNI(留空取 host) | | `__BOOTSTRAP_TOKEN__` | 一次性引导 token(`mtls.BootstrapTokenManager`,15min TTL) | | `__DERIVE_KEY__` | Hy2 口令派生密钥(与控制面同源,见 `agentd.DeriveHy2Password`) | | `__AGENT_VERSION__` | agent 版本(与产物命名 + SHA 一致) | | `__SINGBOX_VERSION__` / `__SINGBOX_SHA256__` | sing-box 版本与校验和 | | `__AGENT_SHA256__` | agent 二进制校验和 | | `__ARTIFACT_BASE__` | 二进制 + 安装脚本下载根 URL | | `__INSTALL_SHA256__` | `install-node.sh` 自身的 SHA-256(防篡改) | ## 可复现性 版本与 SHA-256 全部锁定:`install-node.sh` 顶部的版本/校验和占位符由发布流水线渲染 为固定值并随产物一起发布;cloud-init 下载脚本后先校验脚本 SHA-256 再执行,脚本再逐个 校验二进制 SHA-256。任何一环不匹配即 `set -e` 中止,保证整链可复现、不可被中间人替换。 ## 无状态红线 节点除 `/etc/pangolin-agent/{node.key,node.crt,ca.crt,state.json}` 与 `/etc/sing-box` 外不落任何持久数据;`state.json` 仅含 `dp_uuid + expires_at`,无任何账号/设备/目的地址/ DNS 信息,亦无访问日志(见 `doc/04 §2`、`doc/06 §3`)。