import type { CreatedJoinTokenDto } from '@shared/api/types' import { fmtTime } from '@shared/format' import { CommandTabs, CopyButton, Dialog, Field, guessPlatform, type CommandTab } from '@shared/ui' /** * 加入令牌创建之后的对话框:Agent 共用同一份。 * Podman 系(Linux)首选 Quadlet(Podman 4.6+):env、单元文件(核对哈希)、启动用户服务;单元 Pull=always,节点发现新版本后自己退出重启,所以默认自动更新。 * Docker(Linux、macOS、Windows)用 compose:把面板给的 .env 存下来,下载 compose.yaml,`compose up -d`;compose 不会自动更新,手动 `compose pull && compose up -d`。 * env/.env 里只有公开的值(面板地址、一次性码、信任根指纹和属主),没有任何私钥;一行安装脚本留作备用。 */ export function JoinTokenCreated({ created, onClose }: { created: CreatedJoinTokenDto; onClose: () => void }) { const quadlet = created.quadlet const compose = created.compose const script = created.install_commands const composeTabs: CommandTab[] = [ { id: 'linux', label: 'Linux · compose', 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 ( 完成 } >

所有平台使用同一种 Agent,默认同时监听和拨号。加入后自动与其他可达 Agent 相互探测,可在线路矩阵中按方向调整。

一次性码只显示这一次,请现在就复制。下面只有公开的值(面板地址、一次性码、信任根指纹和属主),没有任何私钥。
{script.openwrt && ( )}

自动更新默认开:面板发现新版本后,节点运行满 10 分钟就自己退出,Podman 重新启动时先拉最新镜像(Pull=always)。 想改成在管理端点「更新」才更新,把 env 里 # MOSHIRO_UPDATE_POLICY=manual 的 # 去掉。固定版本:把单元里的 :latest 换成版本号。

分步做:Quadlet 的 env 和单元,compose 的 .env 和 compose.yaml
{quadlet.env}
{quadlet.url}
SHA-256 {quadlet.sha256}
{compose.env}
{compose.url}
SHA-256 {compose.sha256}

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

一键安装脚本 · Linux / macOS / Windows
) }