import type { CreatedJoinTokenDto } from '@shared/api/types' import { fmtTime } from '@shared/format' import { CommandTabs, CopyButton, Dialog, Field, guessPlatform, type CommandTab } from '@shared/ui' /** * 加入令牌创建之后的对话框:Agent 和 Probe 共用同一份。 * 首选 compose:把面板给的 .env 存下来,下载 compose.yaml,`compose up -d`,以后更新就是 `compose pull && compose up -d`。 * .env 里只有公开的值(面板地址、一次性码、信任根指纹和属主),没有任何私钥;脚本一行命令留作备用。 */ export function JoinTokenCreated({ created, kind, onClose }: { created: CreatedJoinTokenDto; kind: 'Agent' | 'Probe'; onClose: () => void }) { const compose = created.compose const script = created.install_commands const composeTabs: CommandTab[] = [ { id: 'linux', label: 'Linux · Podman', command: compose.linux }, ...(compose.macos ? [{ id: 'macos', label: 'macOS · Docker', command: compose.macos }] : []), ...(compose.windows ? [{ id: 'windows', label: 'Windows · Docker', command: compose.windows }] : []), ] const initial = composeTabs.some((t) => t.id === guessPlatform()) ? guessPlatform() : 'linux' return ( 完成 } >
一次性码只显示这一次,请现在就复制。下面只有公开的值(面板地址、一次性码、信任根指纹和属主),没有任何私钥。
分步做:.env 内容、compose 下载地址和哈希
{compose.env}
{compose.url}
SHA-256 {compose.sha256}

以后更新:podman compose pull && podman compose up -d(Docker 把 podman 换成 docker);身份和配置在命名卷里,不会动。 想固定版本,在 .env 里写 MOSHIRO_VERSION=版本号。注册成功之后,可以把 .env 里的 MOSHIRO_JOIN 一行删掉。 {kind === 'Agent' ? (created.token.auto_approve ? ' 使用它注册的 Agent 会自动启用。' : ' 使用它注册的 Agent 需要你在列表里审批之后才会启用。') : ''} 可用 {created.token.max_uses} 次,{fmtTime(created.token.expires_at)} 过期。

备用:一行安装脚本(先核对脚本哈希再执行,需要 Docker 或 Podman)
) }