Appliance 命令
ironflock appliance 命令将 IronFlock Appliance 安装到您自己运行的 Linux 服务器上,并从此负责维护它。您可以用它们安装 Appliance、更改其设置、更新它、启动、停止和重启它、查看其日志、重置管理员密码、备份、恢复和轮换其机密信息,以及再次移除它。
Appliance 是在现场一台机器上运行的完整 IronFlock 系统。它是什么、它的 HTTPS 模式、网络和运维,都在 IronFlock Appliance 下说明。对机器的要求(CPU、内存、存储、时间同步)见其安装一页。
注意:这些命令是
ironflock2.1.0 版本中新增的。它们已在一台全新的 Ubuntu 24.04 虚拟机(amd64)上通过了一次从appliance install到appliance remove --purge的测试运行。尚未验证的是失败的更新及其回滚到之前发布版本的过程。
Appliance
| 命令 | 作用 |
|---|---|
appliance install | 在这台机器上安装 Appliance 并启动它,或者将已安装的 Appliance 换到某个发布版本 |
appliance configure | 更改设置:许可证、TLS 模式、代理、主机名、隧道、第二因素策略 |
appliance update | 将 Appliance 更新到某个发布版本,更新失败时回到之前的发布版本 |
appliance start | 启动 Appliance |
appliance stop | 停止 Appliance,直到再次启动它 |
appliance restart | 重启 Appliance |
appliance logs | 显示 Appliance 各服务的日志 |
appliance reset-admin-password | 为 UI 用户 admin 设置新密码 |
appliance backup | 将 Appliance 的机密信息写入一个 tar.gz 归档 |
appliance restore | 放回机密信息的备份 |
appliance rotate | 为 Appliance 的某个机密信息设置新值 |
appliance revoke-direct-access | 删除用之前的 FILE_CRED_KEY 生成的直接访问密钥 |
appliance remove | 从这台机器上移除 Appliance |
Appliance 命令在 Linux 上运行。appliance install 需要基于 Debian 或 Ubuntu、带有 systemd 的系统。在 macOS 上,这些命令在检查任何内容之前就以退出码 3 结束;请在 Appliance 所在的机器上运行它们,或者从 Mac 用 --host 运行。
请用 sudo 以 root 身份运行它们。更改系统的命令在没有 root 时以退出码 3 结束,它自己不会调用 sudo(Root 权限)。
每个命令还接受全局标志 --yes、--json、--download-base、--host、--hosts 和 --parallel(全局标志)。询问需要终端;没有终端时,请给出 --yes(询问与确认)。
ironflock status 显示已安装的 Appliance:其版本和通道、UI 的地址、是否有许可证、其服务、各服务的健康状况,以及等待中的更新(ironflock status)。
已安装的 Appliance 包括什么
| 路径或单元 | 说明 |
|---|---|
/opt/ironflock | 安装目录(--install-dir 可指定其他目录)。属于 root |
/opt/ironflock/.env | Appliance 的配置和全部机密信息 |
/opt/ironflock/license.env | 许可证密钥 |
/opt/ironflock/install.json | 安装选择的记录,只有 root 可读(见下文) |
/opt/ironflock/.update-previous | 之前发布版本的副本,更新在运行期间保留它(见下文) |
/opt/ironflock/triggers/apply-update.status、apply-update.log | 上一次更新的进度和输出,供 UI 读取 |
ironflock.service | 用 Docker Compose 运行 Appliance 各容器的 systemd 服务。每次开机时启动 |
/usr/local/bin/ironflock | Appliance 的单元每次启动时(包括开机时)运行的 ironflock |
/etc/ironflock/appliance.json | 安装在主机上所做更改的记录,appliance remove 会撤销这些更改 |
除 ironflock.service 外,安装还会设置一个看门狗和一个定时器。看门狗每五分钟检查一次 router 和 backend,在它们状态不佳时重启 ironflock.service,五分钟内最多重启一次;定时器每小时重试一次 UI 中失败的更新。
请让 /usr/local/bin/ironflock 保留在原处:Appliance 的单元每次启动时都会运行它。appliance install 拒绝从其他位置运行,并说明如何将它安装到那里。以 root 身份运行的 ironflock status 会在该二进制文件缺失、或比上一次安装或更新 Appliance 的那个旧时发出警告。sudo ironflock self-update 会用最新的发布版本替换它(ironflock self-update)。
Appliance 还运行主机自己的设备代理程序,appliance install 会安装它,除非您给出 --no-agent。该代理程序用 agent 命令维护。
一次只进行一项更改
Appliance 的安装、更新或其他更改一次只运行一个。第二个会等待第一个,并说明这一点:
Another IronFlock install, update or other change of the appliance is running on this host (process <pid>); waiting up to <time> for it to finishinstall、update、configure、rotate、revoke-direct-access、reset-admin-password 和 restore 最多等待一小时。start、stop、restart 和 remove 最多等待 30 秒。到时另一次运行仍在进行时,命令不做任何更改,并以退出码 3 结束。
ironflock appliance install
将 IronFlock Appliance 安装到 /opt/ironflock 并启动它。它会等到每个服务都健康、并且 IronFlock 云能访问到 Appliance,然后在终端上显示 Web UI 的管理员登录信息,只显示一次。
ironflock appliance install --license-file <file> [flags]运行平台: 基于 Debian 或 Ubuntu、带有 systemd 的 Linux。Root: 需要。
安装会设置:
- 通道的发布版本,或
--version所指定的发布版本,并用 Appliance 的发布密钥检查; - Appliance 的配置和机密信息;
- 主机自己的设备代理程序,以及缺少时的 Docker;
- 主机的设置;
- Docker 用许可证密钥登录镜像仓库;
- 发布版本的镜像;
ironflock.service。
缺少 Docker 时,安装会以 root 身份运行来自 get.docker.com 的 Docker 安装脚本。该下载只受 TLS 保护。
| 标志 | 含义 |
|---|---|
--license-file <file> | 保存许可证密钥或 LICENSE_KEY=<key> 的文件;- 表示读取标准输入 |
--license <key> | 许可证密钥本身。它会出现在 ps 中:请优先使用 --license-file |
--version <x.y.z> | 要安装的 Appliance 版本。默认值:通道的最新版本 |
--channel <channel> | 发布通道:production、test 或 all。默认值:已安装 Appliance 的通道,否则为 production |
--tls | 用 Appliance 自有 CA 签发的证书,通过 HTTPS 提供 Web UI。设备仍以不加密的方式连接。之后的运行保持开启 |
--tls-cert <file> | 您组织为 Appliance 域名签发的证书文件,与 --tls-key 一起使用。设备随后使用该域名 |
--tls-key <file> | --tls-cert 的密钥文件,不带口令 |
--no-tls | 通过普通 HTTP 提供 Web UI:任何内容都不加密,仅适用于可信网络。这是默认值;之后的运行保持关闭 |
--tunnel | 开启通往设备 Web UI 的隧道。这是默认值;保持开启 |
--no-tunnel | 关闭该隧道。保持关闭 |
--extra-host <name> | Web UI 的另一个名称;可多次给出,或以逗号分隔 |
--2fa <policy> | 第二因素策略:available、effective 或 required。默认值:effective |
--interactive | 询问 Appliance 的地址和域名,并让代理程序的安装提出它的询问 |
--no-agent | 不安装主机自己的设备代理程序。此时必须已安装 Docker |
--http-proxy <url> | Docker、代理程序和 Appliance 的 HTTP 代理,例如 http://proxy:3128,或不带密码的 http://user@proxy:3128。"" 会移除它 |
--https-proxy <url> | Docker、代理程序和 Appliance 的 HTTPS 代理;"" 会移除它 |
--no-proxy <hosts> | 不经过代理的主机,以逗号分隔 |
--proxy-password-file <file> | 一个文件或管道(/dev/stdin),其唯一的一行是代理 URL 中用户的密码 |
--no-start | 写入并启用一切,但不启动任何内容。不进行健康检查,也不进行云端检查 |
--skip-cloud-gate | 不等待 IronFlock 云访问到 Appliance |
--skip-login | 不登录镜像仓库:镜像使用 Docker 自己的凭据获取,或者手动加载。此时许可证密钥是可选的 |
--registry <host> | Appliance 镜像所在的镜像仓库。默认值:instance-registry.ironflock.com |
--registry-user <user> | 镜像仓库登录所用的用户。默认值:ironflock-appliance |
--bucket-url <url> | Appliance 发布版本的发布位置。默认值:https://instance-registry.ironflock.com/dl/appliance |
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
HTTPS 模式以及每种模式加密的内容,见 HTTPS 与证书和安全。代理密码遵循机密信息中的规则:含有密码的代理 URL 属于错误的命令行。
许可证密钥
许可证密钥就是您在 ironflock.com 的 个人资料 → 实例 下创建的 Instance Key(安装)。它来自 --license-file 或 --license。已经安装的 Appliance 不需要两者,会保留自己的密钥。license.env 中不是有效许可证密钥(许可证密钥是一个 UUID)的密钥会被每个 Appliance 命令忽略,并给出警告;此时这次运行需要一个密钥,或者 --skip-login。
环境变量
有些标志的默认值取自环境变量:
| 变量 | 设置 |
|---|---|
IRONFLOCK_VERSION、IRONFLOCK_CHANNEL | --version、--channel |
IRONFLOCK_INSTALL_DIR | --install-dir |
IRONFLOCK_REGISTRY、IRONFLOCK_REGISTRY_USER | --registry、--registry-user |
IRONFLOCK_BUCKET_URL | --bucket-url |
IRONFLOCK_2FA | --2fa |
IRONFLOCK_EXTRA_HOSTS | --extra-host |
IRONFLOCK_SKIP_CLOUD_GATE | --skip-cloud-gate |
IRONFLOCK_APPLIANCE_HOST、IRONFLOCK_APPLIANCE_DOMAIN | Appliance 的地址及其域名,即 --interactive 所询问的内容 |
IRONFLOCK_CLOUD_TUNNEL_TCP | 除 0、false、off 或 no 之外的任何值,都允许隧道的云端连接在没有代理时使用 TCP 端口 7000 |
sudo 会丢弃您 shell 中的大部分变量。请用 sudo env NAME=value ironflock appliance install ... 传入它们。
安装选择的记录
<install-dir>/install.json 只有 root 可读,它保存 .env 和各单元都不保存的选择:镜像仓库及其用户、Appliance 的主机(IRONFLOCK_APPLIANCE_HOST)、--no-agent、--bucket-url 的下载基址,以及上一次安装或更新 Appliance 的 ironflock 的版本。其中不含任何密码、令牌或密钥。
之后的 appliance install、appliance update 和 appliance configure 会保留这些选择,除非某个标志(或其变量)另有指定。给出的标志优先,并会被记录下来。要回到默认值,请给出 --registry ""、--no-agent=false 或空的 IRONFLOCK_APPLIANCE_HOST。
无法读取的记录,或者格式较新的记录,会让 install、update 和 configure 在做出任何更改之前以退出码 3 停止。消息会说明该怎么做:把记录移到一边,再带上标志重新安装;或者使用较新的 ironflock。
再次运行
在已安装的 Appliance 上运行时,该命令会让它采用所给的发布版本和选项,并保留其机密信息和设置。用它可以有意地更换发布版本:ironflock appliance install --version <version> 会重新拉取、重启并检查该发布版本,即使它已经在运行也是如此。
中途停止的运行,在再次运行同一条命令时会从停止的地方继续。
健康检查通过之后,安装会删除更新所保留的之前发布版本的副本(/opt/ironflock/.update-previous):要运行的就是它所安装的发布版本。
从第一项更改开始,终端或 SSH 会话丢失(SIGHUP),或者输出不再有人读取(管道已关闭),都不会停止安装。Ctrl-C 和 SIGTERM 会停止它。SSH 会话丢失之后,安装仍会继续向终端写入,以免丢失管理员密码。因此,在 sudo 的 use_pty 设置下,一个保持打开但不再被读取的终端可能会在安装持有安装锁时卡住安装。
示例
# 安装 Appliance;许可证密钥来自文件
sudo ironflock appliance install --license-file license.txt
# 用 Appliance 自有 CA 的 HTTPS 安装;密钥来自标准输入
sudo ironflock appliance install --license-file - --tls < license.txt
# 在代理之后安装;.corp.example.com 下的主机绕过代理
sudo ironflock appliance install --https-proxy http://proxy.example.com:3128 --no-proxy .corp.example.com
# 询问 Appliance 的地址和域名,并用 HTTPS 安装
sudo ironflock appliance install --license-file license.txt --interactive --tls拒绝执行和失败的情况
- 各单元无法原样写明的
--bucket-url下载基址(其中含有登录信息、%、空白字符、$、\、引号、控制字符或非 UTF-8 字节)会在写入任何内容之前被拒绝,退出码为 2。 - 在以下情况下,命令以退出码 3 拒绝执行:不是以 root 身份运行、无法读取安装选择的记录,以及另一次运行持有安装锁超过一小时的等待时间。正在运行的
ironflock不是/usr/local/bin/ironflock时,它同样会拒绝执行,并说明如何将它安装到那里。 - 某一步失败时,命令以退出码 1 结束。再次运行同一条命令即可继续。
ironflock appliance configure
更改已安装 Appliance 的设置:其许可证、TLS 模式(也可以使用您自己的证书)、代理、UI 的其他主机名、隧道以及第二因素策略。
ironflock appliance configure [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。
这些设置保存在 Appliance 的 .env 和文件中,因此更新会保留它们。未给出的设置保持 Appliance 现有的值。只有确实做出了更改的运行才会重启 Appliance,因此同一条命令运行两次时,第二次不会更改任何内容。
| 标志 | 含义 |
|---|---|
--license <key> | Appliance 的新许可证密钥 |
--license-file <file> | 从该文件读取新的许可证密钥;- 表示读取标准输入 |
--skip-login | 不用新的许可证密钥登录镜像仓库 |
--registry <host> | 要登录的镜像仓库。默认值:Appliance 镜像站同步所用的镜像仓库 |
--registry-user <user> | 镜像仓库登录所用的用户。默认值:ironflock-appliance |
--tls | 用 Appliance 自有 CA 签发的证书,通过 HTTPS 提供 UI |
--tls-cert <file> | 您的 TLS 证书文件,与 --tls-key 一起使用 |
--tls-key <file> | --tls-cert 的密钥文件 |
--no-tls | 通过普通 HTTP 提供 UI:任何内容都不加密,仅适用于可信网络 |
--http-proxy <url> | HTTP 代理 URL;为空时清除代理 |
--https-proxy <url> | HTTPS 代理 URL;为空时清除代理 |
--no-proxy <list> | 不经过代理的内容:以逗号分隔的列表 |
--extra-host <name> | UI 的另一个名称;可重复给出,或给出以逗号分隔的列表 |
--tunnel | 开启应用 Web UI 的隧道 |
--no-tunnel | 关闭隧道 |
--2fa <policy> | 第二因素策略:available、effective 或 required |
--bucket-url <url> | Appliance 发布版本的发布位置,用于获取 TLS 所需的 Caddyfile。默认值:https://instance-registry.ironflock.com/dl/appliance |
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
- 新的许可证(
--license、--license-file,或用--license-file -从标准输入读取)必须先能打开镜像仓库,然后才会被写入。它的镜像仓库登录以--registry-user的身份登录--registry;否则使用安装时选择的镜像仓库和用户(记录);再否则使用 Appliance 镜像站同步所用的镜像仓库。带--registry或--registry-user的登录会把它们保存在记录中,供更新使用。 --tls-cert和--tls-key安装您的证书并开启 TLS,设备会迁移到 Appliance 的域名。--http-proxy ""或--https-proxy ""单独给出时,会清除代理。- 安装时的
--no-agent保持原样。 - TLS 所需的 Caddyfile 取自
--bucket-url,否则取自安装获取发布版本的位置。
示例
# 从文件为 Appliance 设置新的许可证密钥
sudo ironflock appliance configure --license-file license.txt
# 用您组织的证书提供 UI
sudo ironflock appliance configure --tls-cert wildcard.crt --tls-key wildcard.key
# 设置代理,然后再清除它
sudo ironflock appliance configure --https-proxy http://proxy.example.com:3128 --no-proxy .corp.example.com
sudo ironflock appliance configure --https-proxy ""
# 要求每个用户都使用第二因素
sudo ironflock appliance configure --2fa required设置 --2fa required 之前,请确保每个账户都已设置第二因素:没有第二因素的用户将无法再登录(账户与访问)。
拒绝执行的情况
在以下情况下,命令以退出码 3 拒绝执行,不做任何更改:不是以 root 身份运行、无法读取安装选择的记录、另一次运行持有安装锁超过一小时的等待时间,以及存在中途被打断的更新时(更新中途被打断时)。
ironflock appliance update
将这台机器上的 Appliance 更新到其通道的最新发布版本,或者更新到 --version 所指定的发布版本。该发布版本会用 Appliance 的发布密钥检查,其镜像会被拉取,然后 Appliance 用它重启。命令会等到每个服务都健康、并且 IronFlock 云能访问到 Appliance。Appliance 保留其机密信息和设置。新发布版本健康之后,较早发布版本的镜像会被删除。
ironflock appliance update [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 不询问,--discard-previous 除外。
| 标志 | 含义 |
|---|---|
--version <x.y.z> | 要安装的发布版本,或 latest 表示通道的最新版本(默认值)。也可以是较旧的发布版本,用于有意回退 |
--channel <channel> | 切换通道:production、test 或 all。默认值:已安装的通道 |
--bucket-url <url> | Appliance 发布版本的发布位置 |
--discard-previous | 不更新任何内容:删除更新所保留的之前发布版本的副本,不做其他任何更改(见下文) |
发布版本取自 --bucket-url,否则取自 IRONFLOCK_BUCKET_URL,否则取自安装获取它们的位置(由其选择的记录 /opt/ironflock/install.json 或其单元指出),再否则取自 IronFlock。镜像仓库及其用户、Appliance 的主机和 --no-agent 保持安装时的选择。
更新成功时,新的通道会保留下来;回滚时,之前的通道会恢复。UI 中的 Apply update 运行的是同一个更新。
检查通过之后,安装或更新还会让 Appliance 自己的设备不再使用以前所有 Appliance 共用的机密,改用 APPLIANCE_DEVICE_SECRET 的值。随后其代理程序会在这次运行结束 35 秒后重启。无法完成的迁移会作为警告给出,并说明原因;下一次安装或更新会再次尝试。
已是最新
已经运行其通道最新发布版本(或 --version 所指定的发布版本)、且通道和下载基址相同的 Appliance 会保持原样。命令会说明这一点并以退出码 0 结束;使用 --json 时,result 为 nothing-to-do。要有意重新拉取、重启并检查该发布版本,请运行 ironflock appliance install --version <version>。
这只适用于上一次更新后状态干净的 Appliance。如果保留着之前发布版本的副本(即有更新中途被打断),或者状态文件显示 failed 或 running,更新会把一切重新运行一遍。
回滚
在做出任何更改之前,更新会将正在运行的发布版本的文件保留在 /opt/ironflock/.update-previous 中。如果更新在更改了 Appliance 之后失败,这些文件会被放回,之前的发布版本会重新启动。这不需要网络,因为其镜像就在机器上。最多尝试三次。之后命令放弃,并让之前发布版本的文件留在原处,这样 Appliance 下一次启动的就是该发布版本。
在更改任何内容之前就失败的更新不会再做任何更改,并会说明这一点:例如,发布版本不存在或未签名,或者下载基址没有响应。
某个发布版本可能需要比正在运行的 ironflock 更新的版本。此时不会做任何更改,命令会说明应先安装哪个 ironflock。appliance update 不会自行更新 ironflock;ironflock self-update 会安装最新版本。
状态文件与重试
更新与 UI 中的更新一样,将其进度写入 triggers/apply-update.status,因此 UI 会显示它。其输出还会写入 triggers/apply-update.log。重试 UI 中失败更新的定时器,不会重试本命令失败的更新,也不会重试在更改任何内容之前就被停止的更新。
中断
- Ctrl-C 或 SIGTERM 在更新更改任何内容之前会停止它。之后,第一次会带回之前的发布版本(退出码 130),第二次会立即停止。
- 终端或 SSH 会话丢失(SIGHUP),或者输出不再有人读取,都不会停止更新。更新以及回滚都会运行到结束。状态文件和
ironflock status会说明它是如何结束的。 - 通过
--host运行且没有终端时,前两次 Ctrl-C 会传到那台机器。第一次之后,命令最多等待 30 分钟,让那里的更新结束;第二次之后等待 15 秒;第三次会在本机立即结束命令。本机的会话丢失或 SIGTERM 不算 Ctrl-C:命令会在本机立即结束。只要命令先在本机结束,更新就会在那台机器上继续,ironflock --host <machine> status会显示它是如何结束的。
更新中途被打断时
如果更新已开始更改 Appliance,之后却没有结束,它就是中途被打断了:它被停止了、机器宕机了,或者它的回滚没能让之前的发布版本运行起来。此时安装目录中可能同时有两个发布版本的文件。保留的副本指出已知可以运行的发布版本,ironflock status 也会指出它。
- 下一次更新会先把该副本放回,然后再更新。无法读取或放回的副本会让更新以退出码 3 停止,错误会给出
ironflock appliance install --version <version>。 - 每小时的重试定时器会自行放回该副本,重启该发布版本并进行检查,即使没有更新的发布版本也是如此。
configure、rotate、revoke-direct-access、restore和reset-admin-password会在做出任何更改之前以退出码 3 拒绝执行。它们会给出三种解决办法:ironflock appliance update;ironflock appliance install --version <version>;以及在没有网络时的ironflock appliance update --discard-previous。backup只读取,并给出警告。start、stop和restart不触碰该副本。remove会把该副本与 Appliance 的其他文件一起删除。appliance install照常运行,并在健康检查通过之后删除该副本。
要手动处理中途被打断的更新所留下的文件,请先在 .env 中设置 IRONFLOCK_UPDATE_RETRY=off。否则,重试定时器会在大约一小时内放回之前的发布版本。该设置会完全关闭重试定时器,包括其回滚。
--discard-previous
ironflock appliance update --discard-previous [--yes]不更新任何内容。它删除更新所保留的之前发布版本的副本(/opt/ironflock/.update-previous),无论其处于何种状态、即使无法读取也会删除,不做其他任何更改。它不需要网络。
当更新中途被打断、而之前的发布版本无法再次启动时,这是没有网络情况下的解决办法。安装目录中的文件保持现状,该发布版本无法再被放回,之前拒绝执行的命令可以再次运行。
它会说明要删除什么,并先询问,默认选中“No”;--yes 以“是”作答。没有终端或使用 --json 时,它需要 --yes,否则以退出码 4 结束。没有副本时,它会说明这一点并以退出码 0 结束。它不能与 --version、--channel 或 --bucket-url 一起使用(退出码 2)。使用 --json 时,结果包含 action(discarded、cleaned 或 none)、path、version、state 和 removed。
示例
# 更新到通道的最新发布版本
sudo ironflock appliance update
# 安装发布版本 1.6.41,也可用于回退到它
sudo ironflock appliance update --version 1.6.41
# 切换到 test 通道,并以 JSON 形式读取结果
sudo ironflock appliance update --channel test --json
# 在没有网络的情况下删除之前发布版本的副本
sudo ironflock appliance update --discard-previous结果
{"from":"1.6.40","target":"1.6.41","version":"1.6.41","result":"updated"}| 字段 | 含义 |
|---|---|
from | 更新之前的发布版本 |
target | 更新的目标发布版本 |
version | 现在安装的发布版本 |
result | updated;Appliance 已经是该发布版本、更新重新拉取、重启并检查了它时为 up-to-date;Appliance 保持原样时为 nothing-to-do |
失败的更新是一个错误,它会说明 Appliance 是否回到了之前的发布版本。使用 --json 时,其 kind 是以下之一,被中断时也是如此:
| 类别 | 含义 |
|---|---|
rolled_back | 更新失败,之前的发布版本重新运行 |
rollback_failed | 更新失败,回滚没能让之前的发布版本运行起来 |
not_rolled_back | 更新失败,且没有回滚 |
unchanged | 更新在更改任何内容之前就失败了;例如下载基址没有响应 |
copy_left | 新的发布版本正在运行,但它保留的之前发布版本的副本既无法删除,也无法标记。重试定时器可能会在大约一小时内放回之前的发布版本;错误会给出解决办法(先设置 IRONFLOCK_UPDATE_RETRY=off,然后使用 --discard-previous) |
| 退出码 | 含义 |
|---|---|
| 0 | 已更新、已是最新,或无需操作 |
| 1 | 更新失败,无论是否已回滚;copy_left 也是如此 |
| 2 | 错误的命令行,例如各单元无法写明的下载基址 |
| 3 | 不是 root;未安装 Appliance;另一次运行持有安装锁超过了等待时间;保留的副本无法读取或放回;安装选择的记录无法读取;需要更新版本的 ironflock |
| 130 | 被中断,类别相同 |
ironflock appliance start
在 Appliance 未运行时启动它:ironflock.service 启动其容器(docker compose up),其看门狗以及其他 path 单元和定时器也会重新启动。各服务需要一两分钟才能启动完毕;ironflock status 会显示它们的健康状况。
ironflock appliance start [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 无。该命令没有自己的标志。
如果恢复时 Appliance 没有运行,导致数据库角色仍使用旧密码,那么在其数据库运行之后(最多一分钟),这些角色会采用恢复后 .env 中的密码。没有响应的角色会留到下一次启动处理,并给出警告,启动照常继续。
sudo ironflock appliance start
sudo ironflock appliance start --json另一次运行正在更改 Appliance 时,命令最多等待 30 秒,并说明这一点;如果那次运行仍在继续,它不做任何更改,并以退出码 3 结束。
ironflock appliance stop
停止 Appliance:先停止其看门狗、其他 path 单元和定时器以及它们启动的内容,然后停止 ironflock.service,后者会停止并删除其容器(docker compose down)。其数据保留。
ironflock appliance stop [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 是,在说明停止会终止哪些内容之后询问;--yes 作答。
UI 会下线,连接到 Appliance 的每台设备也会下线,包括这台机器上的代理程序。ironflock appliance start 会再次启动 Appliance,下一次开机也会。该命令没有自己的标志。
# 停止 Appliance;命令会说明这会终止哪些内容,并询问
sudo ironflock appliance stop
# 不询问地停止它
sudo ironflock appliance stop --yes回答“否”,或者询问时没有终端且未给出 --yes,命令以退出码 4 结束。另一次运行正在更改 Appliance 时,命令会像 start 一样等待。
ironflock appliance restart
重启 Appliance:ironflock.service 停止其容器并再次启动它们(先 docker compose down,再 up),与其看门狗的做法相同。被 appliance stop 停止的 path 单元和定时器会重新启动。
ironflock appliance restart [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 无。该命令没有自己的标志。
UI 和连接到 Appliance 的设备会下线一两分钟;其数据保留。各服务启动完毕后,ironflock status 会显示它们的健康状况。恢复后仍使用旧密码的数据库角色会采用 .env 中的密码,与 start 相同。
sudo ironflock appliance restart
sudo ironflock appliance restart --json另一次运行正在更改 Appliance 时,命令会像 start 一样等待。
ironflock appliance logs
显示 Appliance 各服务写出的内容,与 docker compose logs 的显示方式相同:默认为每个服务的最后 100 行。不做任何更改。
ironflock appliance logs [<service>...] [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 无。
指定服务名称即可只查看这些服务的日志,例如 router、backend、kratos 或 caddy。
| 标志 | 含义 |
|---|---|
--lines <n> | 每个服务的最后 n 行,或 all。默认值:100;使用 --since 时为全部 |
--since <time> | 只显示某个时间之后的行:从现在往前推的时长(10m、2h、3d),或者按这台机器时钟的时间(2026-11-10 09:00、09:00、2026-11-10T09:00:00Z) |
--follow | 持续显示各服务新写出的行,直到按下 Ctrl-C |
使用 --json 时,每一行都是一个 JSON 对象,该行内容作为其消息。
# 每个服务的最后 100 行
sudo ironflock appliance logs
# backend 在过去一小时内写出的全部内容
sudo ironflock appliance logs backend --since 1h
# router 和 Kratos 的最后 20 行,然后显示每一行新内容,直到按下 Ctrl-C
sudo ironflock appliance logs router kratos --follow --lines 20ironflock appliance reset-admin-password
为 UI 用户 admin 设置新密码,供丢失密码的运维人员使用。密码先在数据库中设置,这会结束管理员的所有活动会话,然后作为 APPLIANCE_ADMIN_PASSWORD 写入 .env。Appliance 必须正在运行。
ironflock appliance reset-admin-password [flags]运行平台: 正在运行 Appliance 的 Linux。Root: 需要。
| 标志 | 含义 |
|---|---|
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
新密码只显示一次,而且只显示在终端上。没有终端或使用 --json 时,命令改为说明密码保存在哪里。存在中途被打断的更新时,它以退出码 3 拒绝执行(更新中途被打断时)。
sudo ironflock appliance reset-admin-passwordironflock appliance backup
将 Appliance 中无法重新生成的一切写入一个 tar.gz 归档:含全部机密信息的 .env、license.env、TLS 证书的本地 CA、镜像仓库的令牌密钥对、机密信息登记表以及 rotation.log。
ironflock appliance backup [-o <file>] [flags]运行平台: Linux。Root: 需要。
| 标志 | 含义 |
|---|---|
-o、--output <file> | 将归档写入该文件;该文件新建,只有 root 可读 |
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
不带 -o 时,归档写到标准输出,标准输出不能是终端。重定向到的文件会被设为只有其所有者可读。
警告:该归档包含 Appliance 的全部机密信息。丢失的
FLEETDB_SECRET_KEYS或FILE_CRED_KEY无法通过其他任何方式恢复。请对归档加密,并与卷的备份保存在一起。
归档中不包含:TLS 证书及其密钥(生成的证书会由 CA 重新签发)、Kratos 配置、发布版本的文件,以及 Docker 卷。对于 certs/ca 和 registry-token-certs,它只收录安装在那里生成的文件(rootCA.crt、rootCA.key、rootCA.srl;token_private.key、token_public.crt、token_public.der,以及带 .prev 或 .new 的同名文件)。那里的其他任何文件都会被略过,并给出指出该文件的警告,因为 restore 不接受其他文件。
# 将归档写入一个只有 root 可读的文件
sudo ironflock appliance backup -o /root/appliance-secrets.tar.gz
# 写到标准输出,并重定向到文件
sudo ironflock appliance backup > appliance-secrets.tar.gzironflock appliance restore
将 appliance backup 写出的备份放回安装目录。
ironflock appliance restore <file> [flags]运行平台: Linux。Root: 需要。
| 标志 | 含义 |
|---|---|
--force | 替换已安装 Appliance 的机密信息 |
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
命令只接受备份所包含的文件,不接受其他任何内容,并为每个文件设置安装时赋予它的所有者和权限。在 certs/ca 和 registry-token-certs 中,它只接受安装在那里生成的文件。包含其他任何内容的归档会在做出任何更改之前被拒绝,错误会指出是什么内容。
只有使用 --force 时,已安装 Appliance 的机密信息才会被替换;其 .env 会保留为 .env.prev。不带 --force 时,在已安装的 Appliance 上进行恢复会在做出任何更改之前以退出码 3 被拒绝,消息会给出带 --force 的恢复命令,然后是 appliance restart。
备份中不是有效许可证密钥的许可证密钥会原样恢复,并给出警告:每个 Appliance 命令都会忽略它。
数据库密码
- Appliance 的数据库正在运行时, 其角色会立即采用恢复后的密码。然后请重启 Appliance(
appliance restart),让每个服务都读取恢复后的文件。 - Appliance 没有运行时, 其数据库角色保留之前的密码。恢复会标记它们(
<install-dir>/.db-roles-pending;使用--json时为roles_pending)。下一次启动会将它们设为恢复后.env中的密码:appliance start或restart、开机时的启动、安装或更新。
# 恢复到已安装的 Appliance 上,然后重启它
sudo ironflock appliance restore appliance-secrets.tar.gz --force
sudo ironflock appliance restart存在中途被打断的更新时,它以退出码 3 拒绝执行(更新中途被打断时)。
ironflock appliance rotate
为 Appliance 的某个机密信息设置新值。新值会写到保存旧值的地方(数据库角色、代理程序的设备文件、镜像仓库的令牌密钥对)以及 .env 中。然后只有读取它的服务会被重新创建,命令会检查它们是否健康。
ironflock appliance rotate <name> [flags]运行平台: 正在运行 Appliance 的 Linux。Root: 需要。询问: 对于还被其他地方持有的机密信息会询问;--yes 作答。
| 标志 | 含义 |
|---|---|
--keep-direct-access | 与 FILE_CRED_KEY 一起使用:之前生成的直接访问密钥继续可用 |
--revoke-direct-access | 与 FILE_CRED_KEY 一起使用:之前生成的直接访问密钥失效并被删除 |
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
更改之前的 .env 会保留为 .env.prev,只有 root 可读。rotation.log 列出每次轮换,但从不记录值。
- 还被其他地方持有的机密信息(数据、设备、令牌)在轮换之前会询问;
--yes作答。 FILE_CRED_KEY需要为客户的直接访问密钥做出选择。--keep-direct-access:它们继续可用,适用于计划内的轮换;之后用revoke-direct-access结束它。--revoke-direct-access:它们失效并被删除,适用于怀疑泄露之后。APPLIANCE_ADMIN_PASSWORD与reset-admin-password相同。
它可以轮换的机密信息:
POSTGRES_PASSWORD, PGPASSWORD_KRATOS, PGPASSWORD_ACCT_MANAGER,
PGPASSWORD_ACCT_PUSHER, PGPASSWORD_EXT_ACCT_USER, PGPASSWORD_AUDIT_SANDBOX,
DATASERVICE_PASSWORD, WAMP_SYSTEM_SECRET, WAMP_SECRET_SVC_VDM,
WAMP_SECRET_SVC_IDE, WAMP_SECRET_SVC_IDE_PROXY, WAMP_SECRET_SVC_GIT,
WAMP_SECRET_SVC_REGISTRY, WAMP_SECRET_SVC_REGISTRY_PROXY,
WAMP_SECRET_SVC_ACCT, WAMP_SECRET_SVC_ACCT_PUSH, WAMP_SECRET_SVC_PAYMENT,
WAMP_SECRET_SVC_FLEETDB, WAMP_SECRET_SVC_FLEETFILES, WAMP_SECRET_SVC_AI,
WAMP_SECRET_SVC_TUNNEL, WAMP_SECRET_SVC_RENDERER, WAMP_SECRET_SVC_WEBSERVER,
WAMP_SECRET_SVC_REAPI, WAMP_SECRET_SVC_AUTH, RENDER_TICKET_KEY,
FILES_FORWARD_SECRET, KRATOS_WEBHOOK_SECRET, KRATOS_SECRETS_PAGINATION,
REGISTRY_HTTP_SECRET, TUNNEL_DASHBOARD_PASSWORD, EDGE_SESSION_SECRET,
OBJECTSTORE_ADMIN_ACCESS_KEY, OBJECTSTORE_ADMIN_SECRET_KEY, FILE_CRED_KEY,
FLEETDB_SECRET_KEYS, KRATOS_SECRETS_COOKIE, KRATOS_SECRETS_CIPHER,
APPLIANCE_DEVICE_SECRET, APPLIANCE_ADMIN_PASSWORD, REGISTRY_TOKEN_KEY轮换对每类机密信息有什么影响,以及哪些机密信息只能与 IronFlock 团队一起轮换,见轮换内部机密信息。
# 轮换一个服务的机密信息
sudo ironflock appliance rotate WAMP_SECRET_SVC_AI
# 按计划轮换文件密钥;直接访问密钥继续可用
sudo ironflock appliance rotate FILE_CRED_KEY --keep-direct-access --yes存在中途被打断的更新时,它以退出码 3 拒绝执行(更新中途被打断时)。
ironflock appliance revoke-direct-access
结束用 --keep-direct-access 进行的 FILE_CRED_KEY 轮换。客户的每个不是用当前 FILE_CRED_KEY 生成的直接访问密钥都会失效并被删除;该密钥本身保留。fleetfiles 服务会被重新创建,并报告它删除了什么。
ironflock appliance revoke-direct-access [flags]运行平台: 已安装 Appliance 的 Linux。Root: 需要。询问: 是,因为这些密钥的所有者必须创建新的密钥;--yes 作答。
| 标志 | 含义 |
|---|---|
--install-dir <directory> | 安装目录。默认值:/opt/ironflock |
sudo ironflock appliance revoke-direct-access存在中途被打断的更新时,它以退出码 3 拒绝执行(更新中途被打断时)。
ironflock appliance remove
从这台机器上移除 IronFlock Appliance,并撤销其安装在主机上记录的更改。除非您给出 --purge,否则其数据保留。
ironflock appliance remove [flags]运行平台: Linux。Root: 需要。询问: 是,在列出哪些内容会被删除、哪些会保留之后询问。该询问默认选中“No”:直接按 Enter 不会删除任何内容。
| 标志 | 含义 |
|---|---|
--purge | 连同不带它时保留的内容一起删除:安装目录、卷和镜像 |
--force | 越过失败的调用继续执行,并丢弃撤销一直失败的主机更改记录 |
--install-dir <directory> | 安装目录。默认值:其单元所指定的目录,否则为 /opt/ironflock |
它会删除:
- Appliance 的 systemd 单元、其容器以及它在 Docker 中的网络;
- Docker 对 IronFlock 镜像仓库的登录;
- 其安装在主机上记录的每项更改(
/etc/ironflock/appliance.json):它写入的代理设置、它在 Docker 的daemon.json中的设置、journal 的设置,以及被屏蔽的休眠目标; - 更新为回滚而保留的之前发布版本的副本(安装目录中的
.update-previous)。
无论是否使用 --purge,Appliance 容器的匿名卷也会被删除:但绝不会删除命名卷,也绝不会删除仍有容器在使用的卷。
保留的内容
不带 --purge 时,Appliance 的数据会保留,以便之后的安装接着使用:
- 安装目录(
/opt/ironflock),包括保存机密信息的.env、license.env、安装选择的记录(install.json),以及恢复时未能设置的数据库密码的标记(.db-roles-pending); - Docker 中的卷。
--purge 会连同这些以及镜像一起删除:Appliance 保存的内容将彻底消失。
以下内容即使使用 --purge 也会保留:
- Docker 本身,以及主机的设备代理程序。
ironflock agent remove会删除代理程序。 - Appliance 写入后又被修改过的文件,例如
ironflock agent configure设置的代理设置,以及指向它们的 drop-in,这样代理程序会保留其代理。 - 代理程序的记录(
/opt/ironflock/device-init/installed.json)中列为代理程序所有的内容,以及代理程序屏蔽的休眠目标。ironflock agent remove会删除它们。
调用失败时
撤销中的某个调用一直失败时(例如重启一个已被手动删除的 Docker),记录会保留。命令会说明哪个调用失败,并以错误结束。请在问题解决后再次运行它,或者带上 --force 运行;后者仍会丢弃记录,并越过无法禁用的单元或没有响应的 Docker 继续执行。
安装、更新或 Appliance 的其他更改正在运行时,命令最多等待 30 秒,并说明这一点。如果那次运行仍在继续,它不做任何更改,并以退出码 3 结束。
示例
# 移除 Appliance 并保留其数据;命令会列出要删除的内容并询问
sudo ironflock appliance remove
# 不询问地移除 Appliance 及其全部数据
sudo ironflock appliance remove --purge --yes回答“否”,或者询问时没有终端且未给出 --yes,命令以退出码 4 结束。
在永久移除 Appliance 之前,请趁它仍然在线时迁移或释放其许可证(停用)。