语法
选项
--box 和 --ip 必须提供其中之一。如果两个都提供,命令会报错退出。
Box 镜像
安装过程中最慢的部分是 Box 的 Docker 镜像。在 Box 上构建大约需要 14 分钟,而且安装总是要付出完整的代价:部署在开始之前会清理构建器缓存,因此永远没有可以复用的热层缓存。 每个发布标签都会发布一个预构建镜像,lager install 默认使用它:大约 2 分钟,而不是 14 分钟。
这只适用于 --version 指定发布标签的情况。默认的 --version main
没有已发布的镜像,其他分支也没有,因此它们总是在 Box 上构建。固定一个发布标签,就是两分钟安装和十四分钟安装之间的区别。
完整的 40 位提交 SHA 同样会在 Box 上构建,并且 Box 必须能从远端拉取该提交。较短的十六进制值会被当作分支名。
镜像在使用之前会先被验证:
- 运行
lager install的计算机把标签解析为不可变的镜像摘要。这一步需要curl并且能访问ghcr.io。 - Box 按它自己的架构拉取该摘要对应的镜像。
- Box 检查镜像的版本标签,该标签必须与您请求的版本完全一致。
curl、注册表不可达,或标签缺失/不一致。能用的慢速安装胜过不能用的快速安装。
拉取之后,/etc/lager/image-source 会记录 ghcr:<digest>。在 Box 上构建则会删除该文件。
传入 --no-pull 可以跳过预构建镜像,始终进行构建。若要在整个 shell 中关闭安装时的拉取,请设置 LAGER_BOX_IMAGE_PULL=0。只有值 0 会关闭它,并且 --pull 优先于该变量。
lager update 对同一个变量的解读不同:只有 1、true 或 yes 才会打开它的拉取。同时传入 --pull 和 --no-pull 属于用法错误。
部署超时
--timeout 限制部署步骤,其中包括容器构建。默认值为 1800 秒。不带该标志时,由 LAGER_INSTALL_TIMEOUT 决定其值。
LAGER_INSTALL_TIMEOUT 无法解析或为负值时,取默认值。
--timeout 0 取消该限制,负的 --timeout 会被拒绝。
预算用尽时,install 会打印 Deployment timed out after ...。它还会说明该构建仍可能是正常的,并打印出把预算加倍的重试命令,然后以 1 退出。重新运行是安全的。
安装锁的有效期取 3600 秒与超时时间两倍之中的较大者。在提供该锁的容器停止期间,锁无法续期。
会安装哪些内容
防火墙脚本把入站流量的默认策略设为拒绝,并允许来自任意位置的 SSH。它在
lo、docker0、tailscale0(如果 Tailscale 已启动)和 --corporate-vpn
指定的接口上放行 Lager 端口,并在其他所有接口上拒绝它们。只有在设置了 lager box-config network-mode host 的 Box 上(容器不发布端口),这些规则才管辖 Lager 端口。
该脚本每次运行都会先重置 ufw。因此,之后不带 --skip-firewall 的
lager install 会删除您手动添加的防火墙规则。lager update 不运行该脚本。
安装流程
- 解析目标 - 根据
--box名称查出 Box IP,或直接使用--ip - 验证 SSH - 测试基于密钥的认证,并确定该命令后续使用哪个身份
- 显示摘要 - 显示将要安装的内容并请求确认
- 部署 - 运行部署脚本。使用预构建镜像时约 2 分钟;在普通 Box 硬件上从零构建大约 14 分钟(见上文)。这一步受
--timeout限制,默认 30 分钟 —— 在较慢的硬件上请调高它,那里正常的构建也可能合理地超过默认值 - 保存版本 - 把部署的版本和 CLI 版本写入
/etc/lager/version,把部署的 ref 和提交写入/etc/lager/ref - 配置免密码 sudo - 写入
lager box-config apply所需的 sudoers 授权。这一步会要求输入一次 Box 的 sudo 密码。这里失败只是警告,不算安装失败 - 添加到配置 - 询问是否把该 Box 添加到
~/.lager。使用--yes时以及使用--box时(该 Box 已经保存过)会跳过这一步
示例
免密码 sudo
安装过程会为 Box 的登录用户配置免密码sudo。CLI 通过非交互式 SSH 驱动 Box,那里的 sudo 没有终端可以用来提示输入。这些授权必须在配置流程运行之前就位。
Lager 在 /etc/sudoers.d/ 下写入以下文件,并且只写这些文件:
这三个文件在每次运行时都会被完整重新生成 —— 正是这一点让 Box 始终保持当前的授权形态。写在其中内部的额外授权,会在下次写入时丢失,因此每个文件开头都有一段说明这一点的注释。
Lager 从不读取、编辑或删除
/etc/sudoers.d/ 中的任何其他文件。如果您或某个 Box 管理平台需要额外授权,请把它们放在该目录下的单独文件中。例如 /etc/sudoers.d/zz-local 排在 Lager 的文件之后,因此它的规则会生效。
Lager 不会碰那个文件,lager uninstall 期间也不会。
SSH 认证
安装要求使用基于密钥的 SSH 认证。它会显式提供~/.ssh/lager_box ——
即 lager ssh-setup 和 lager install 生成的密钥 —— 因为 ssh 不会自己尝试这个文件名。如果 Box 不接受它,安装会退回到您自己的默认身份,因此用 ssh-copy-id 授权过的 Box 照常可用。
如果两者都无法认证,安装会主动提出为您配置密钥:
--yes 会直接接受而不询问。拒绝则会停止安装,并指引您使用
lager ssh-setup --box <name-or-ip>,它作为单独的一步完成同样的工作。
对于部署本身,安装不提供密码回退。配置了 PasswordAuthentication no 的 Box
永远收不到密码,因此过去那条”密码失败”的提示描述的是根本没有发生过的事。
对于新主机,SSH 主机密钥会被自动接受。如果主机密钥相对上次连接发生了变化,命令会要求您先手动核实这个变化。
安装不会写入 ~/.ssh/config。早期版本会添加一个按 IP 划分、指明密钥的 Host 块。另一个会重新生成该文件的工具删除了那个块,而且那个块还对该 Box 关闭了主机密钥验证。现在改为按命令传入身份。
说明
- 逐步操作的指南,请参阅 设置 Lager Box
- 需要本地安装 SSH 客户端工具(
ssh、ssh-keygen) - 部署脚本随
lager-cli包一起分发 - 安装完成后,请用
lager hello --box <name>验证连通性 - 对已安装的 Box 部署代码更新,请使用
lager update - 从 Box 上移除 Lager 软件,请使用
lager uninstall

