在线升级:akn upgrade 与页面升级完整指南
AKStream.Next 提供两条正式包在线升级入口:在服务器终端执行 akn upgrade,或者在 WebUI 的“系统管理 → 系统升级”上传并执行。两条入口最终调用同一套平台升级管理器,共享版本校验、备份、程序切换、健康验收和失败回滚规则。
重要:这里的“在线升级”不是从互联网自动下载版本。 操作者必须先取得与当前操作系统和 CPU 架构一致的官方完整发布包,再通过 CLI 或页面提交本地文件。系统不会根据一个 URL、镜像标签或 Git 分支直接覆盖生产程序。
升级会中断网页、API、NodeAgent、托管 MediaServer 和正在进行的媒体业务。 必须在维护窗口执行。开始后不要关机、重启宿主、删除升级目录或重复提交另一项升级。
先选择正确入口
| 情况 | 推荐入口 | 原因 |
|---|---|---|
| 主服务健康、可以登录 WebUI、NodeAgent 在线 | 页面升级 | 上传、预检、执行状态和回滚结果集中展示,适合日常运维 |
| WebUI 或主服务已经不可用,但宿主和旧管理器仍可运行 | akn upgrade |
CLI 不依赖主服务 HTTP 接口,可直接从已安装程序集读取当前版本并执行恢复事务 |
| 自动化维护窗口、串行批量节点升级 | akn upgrade |
退出码、标准输出和事务目录容易被运维系统采集 |
| 需要普通管理员查看记录但不能执行 | 页面只读 | system.upgrade.view 可看记录;上传和执行要求更高权限 |
当前版本还没有 akn upgrade |
使用新包内管理器引导 | 新包脚本可升级旧安装,并在成功后更新全局 akn |
页面与命令都应使用对应平台的正式安装包;选择入口后等待其最终结果,避免同时启动两次升级。
flowchart LR
operator[运维人员]
cli[`akn upgrade`]
page[系统升级页面]
api[主服务升级 API]
record[(持久化升级记录)]
agent[NodeAgent]
job[独立系统任务]
manager[平台升级管理器]
backup[(配置、程序与系统文件备份)]
health{新版健康验收通过?}
success[保留新版并记录成功]
rollback[恢复上一版并重新验收]
operator --> cli --> manager
operator --> page --> api
api --> record
api --> agent --> job --> manager
manager --> backup --> health
health -- 是 --> success
health -- 否 --> rollback
job -. 状态文件 .-> record
record -. 页面轮询 .-> page
升级前必须完成
- 阅读目标版本说明、已知限制、数据库和配置兼容说明。
- 下载原始完整发布包,不要只复制
AKStream.Next.dll、NodeAgent 或 WebUI 文件。 - 核对包名、四段版本、操作系统、CPU 架构和扩展名。
- 从发布渠道独立核对归档 SHA-256。页面显示的 SHA-256 是接收完成后的本机计算值,应与发布值一致。
- 按备份、恢复、升级与回滚准备数据库、Config、安全材料、代理配置、录像索引和回滚点。
- 停止新建裁剪、转码、大批录像扫描和其他高 I/O 任务,等待关键写入收尾。
- 确认系统盘和数据盘同时有足够空间保存原包、展开目录、当前安装备份和事务备份。
- 确认 FFmpeg、数据库、NodeAgent 和当前健康检查正常。页面升级要求 NodeAgent 最近 15 秒内在线。
- 明确维护窗口、回滚决策人和升级后观察时间。
包名和平台矩阵
| 当前部署 | 正式包示例 | 页面/CLI 接受格式 | RID |
|---|---|---|---|
| Linux x64 | AKStream.Next-1.0.0.136-linux-x64.tar.gz |
.tar.gz |
linux-x64 |
| Linux ARM64 | AKStream.Next-1.0.0.136-linux-arm64.tar.gz |
.tar.gz |
linux-arm64 |
| macOS Intel | AKStream.Next-1.0.0.136-osx-x64.tar.gz |
.tar.gz |
osx-x64 |
| macOS Apple Silicon | AKStream.Next-1.0.0.136-osx-arm64.tar.gz |
.tar.gz |
osx-arm64 |
| Windows x64 | AKStream.Next-1.0.0.136-win-x64.zip |
.zip |
win-x64 |
| Windows ARM64 | AKStream.Next-1.0.0.136-win-arm64.zip |
.zip |
win-arm64 |
| Docker amd64 | AKStream.Next-1.0.0.136-docker-linux-amd64.tar.gz |
.tar.gz |
docker-linux-amd64 |
| Docker ARM64 | AKStream.Next-1.0.0.136-docker-linux-arm64.tar.gz |
.tar.gz |
docker-linux-arm64 |
只允许升级到严格更高的四段版本。同版本重装、降级或把 x64 包交给 ARM64 实例都会在停服务前被拒绝。需要降级时必须使用明确的回滚/恢复方案,不能把旧包伪装成“升级包”。
使用 akn upgrade
CLI 是主服务不可访问时的重要恢复入口。它使用当前已安装的管理器读取当前程序集版本,再用新包中的管理器完成安装和健康验收。
Linux 与 macOS
akn info
akn status
sha256sum ./AKStream.Next-1.0.0.136-linux-arm64.tar.gz
sudo akn upgrade ./AKStream.Next-1.0.0.136-linux-arm64.tar.gz
macOS 可用 shasum -a 256,并把文件名替换为 osx-x64 或 osx-arm64 包:
shasum -a 256 ./AKStream.Next-1.0.0.136-osx-arm64.tar.gz
sudo akn upgrade ./AKStream.Next-1.0.0.136-osx-arm64.tar.gz
Windows
在管理员 PowerShell 中运行:
akn info
akn status
Get-FileHash .\AKStream.Next-1.0.0.136-win-arm64.zip -Algorithm SHA256
akn upgrade .\AKStream.Next-1.0.0.136-win-arm64.zip
Docker
必须在最初安装该 Compose 栈的宿主环境运行,不要进入业务容器执行:
akn info
akn status
sha256sum ./AKStream.Next-1.0.0.136-docker-linux-arm64.tar.gz
akn upgrade ./AKStream.Next-1.0.0.136-docker-linux-arm64.tar.gz
正式客户包中的 akn update 不是事务升级入口。Docker 正式版本使用 akn upgrade,因为它会保存 Compose、配置和数据库备份,并在新容器不健康时恢复旧镜像与数据库。
老版本没有 akn upgrade
不要手工覆盖安装目录。解压新包后,用新包内管理器读取原始归档并升级当前安装:
# Linux
sudo ./Deploy/linux/akstream-next.sh upgrade /absolute/path/AKStream.Next-1.0.0.136-linux-arm64.tar.gz
# macOS
sudo ./Deploy/macos/akstream-next.sh upgrade /absolute/path/AKStream.Next-1.0.0.136-osx-arm64.tar.gz
# Docker;--root 必须是当前部署根
./Deploy/docker/akstream-next.sh upgrade /absolute/path/AKStream.Next-1.0.0.136-docker-linux-arm64.tar.gz --root /absolute/path/to/current-deployment
Windows 在新包目录的管理员 PowerShell 中运行:
.\Deploy\windows\akstream-next.ps1 upgrade C:\Packages\AKStream.Next-1.0.0.136-win-arm64.zip
升级成功后,全局 akn 会被新版本受控管理器更新,后续继续使用短命令。
使用系统升级页面
页面入口位于“系统管理 → 系统升级”。查看页面需要 system.upgrade.view;上传、确认和开始升级需要 system.upgrade.manage,该权限还依赖系统查看、升级查看和生命周期管理能力。
第一步:上传并预检
- 只选择一个未经改名或重新打包的正式发布包。
- 把文件拖入上传区,或者点击上传区选择文件。
- 页面先检查扩展名、单文件数量和 8 GB 上限,但这只是即时提示。
- 点击“上传并验证安装包”。服务端以原始请求体流式写入临时文件,同时计算 SHA-256;不会把整个包放入浏览器或服务端托管内存。
- 等待记录显示“已预检”。预检不停止服务,也不会自动开始升级。
如果入口前还有 Nginx、网关、WAF 或负载均衡,它们的请求体大小和超时也必须支持大包上传。应用只把本次 Kestrel 上传请求提高到 8 GB;上游返回 413 时应修正代理限制,不能拆包或绕过保护检查。
第二步:核对并执行
- 核对当前版本、目标版本、RID、包大小和完整 SHA-256。
- 确认状态为
Prepared、阶段为validated,且没有另一项Queued或Running升级。 - 输入区分大小写的固定文本
UPGRADE。 - 点击“开始升级”。服务端只使用已保存记录中的目标版本和固定路径,浏览器不能在这一步替换归档或管理器。
- 页面显示任务已进入 NodeAgent 队列后,不要再次提交。
第三步:等待重连和最终结果
页面空闲时每 8 秒刷新;升级执行或连接中断时每 2 秒重连。主服务停止后短暂出现“无法连接”属于预期,独立系统任务仍会继续执行。
flowchart LR
A[上传正式包] --> B[核对并确认]
B --> C[等待重新连接]
C --> D[查看最终结果]
系统会检查什么
| 检查 | 页面上传 | akn upgrade |
失败时是否停服务 |
|---|---|---|---|
| 文件名、扩展名和唯一产品根目录 | 是 | 是 | 否,预检即停止 |
| 四段版本严格高于当前版本 | 是 | 是 | 否 |
| 操作系统和 CPU RID 匹配 | 是 | 是 | 否 |
| 空包、声明大小和实际大小一致 | 是 | 本地文件检查 | 否 |
| 最大归档 8 GB、最大展开 16 GB、最多 200,000 条目 | 是 | 平台管理器执行安全归档检查 | 否 |
绝对路径、..、空路径段、符号链接、硬链接和特殊文件 |
拒绝 | 拒绝 | 否 |
VERSION 与包名版本一致 |
是 | 是 | 否 |
| 主服务、NodeAgent 和平台管理器存在 | 是 | 是 | 否 |
页面权限、UPGRADE 确认、Agent 15 秒内在线 |
是 | 不适用 | 否 |
| 同一实例不并发执行两次升级 | 是 | 锁目录保证 | 否 |
| FFmpeg 和安装所需运行环境仍可用 | 执行器检查 | 是 | 尽量在停机前检查 |
以页面或命令返回的预检和执行结果为准;不要自行更改任务文件。
理解升级状态
stateDiagram-v2
[*] --> Prepared: 上传与预检通过
Prepared --> Queued: 输入 UPGRADE
Queued --> Running: 独立任务写入状态
Running --> Succeeded: 新版健康验收通过
Running --> RolledBack: 新版失败且旧版恢复成功
Running --> RollbackFailed: 新版失败且旧版也未恢复
Queued --> Failed: 调度或包装器启动失败
Running --> Failed: 管理器异常且没有终态
Succeeded --> [*]
RolledBack --> [*]
RollbackFailed --> [*]
Failed --> [*]
| 状态 | 页面含义 | 下一步 |
|---|---|---|
Prepared |
包已保存并通过深度预检,尚未中断业务 | 核对 SHA-256、RID 和版本,输入 UPGRADE |
Queued |
生命周期操作已创建,等待 NodeAgent 领取 | 确认 Agent 在线;不要重复提交 |
Running |
独立任务已启动,正在备份、安装、验收或回滚 | 保持主机在线,查看 phase 和任务日志 |
Succeeded |
新版已安装,主服务和 NodeAgent 通过健康验收 | 执行升级后验收并进入观察期 |
RolledBack |
新版失败,上一版已自动恢复 | 保留事务目录,分析新版失败原因后重新发布 |
RollbackFailed |
新版和自动恢复都未通过 | 立即停止重复操作,保留现场并按事务备份人工恢复 |
Failed |
调度、包装器或管理器在形成回滚终态前失败 | 根据 phase、error 和 log_path 定位 |
常见阶段包括 validated、agent-queue、manager-start、backup、install、rollback、complete、upgrade-schedule、upgrade-launch 和 manager-failed。平台管理器可以增加更具体阶段;判断成功或回滚必须以终态 status 为准,不能只看阶段文字。
备份、切换和回滚怎样工作
flowchart LR
A[上传正式包] --> B[核对并确认]
B --> C[等待重新连接]
C --> D[查看最终结果]
| 平台 | 主要备份和回滚点 | 成功判定 |
|---|---|---|
| Linux | Config、安装目录上一版、受管 systemd/akn/Nginx 文件和事务状态;失败时恢复旧目录与系统文件 | 主服务 health、NodeAgent 和安装后验收通过 |
| macOS | Config、AKStream.Next/NodeAgent/ZLMediaKit/Tools/Deploy 组件备份、LaunchDaemon 与管理命令 | 主服务 health、NodeAgent 和安装后验收通过;一次性 launchd 作业不 KeepAlive |
| Windows | Config、工具目录、旧安装目录、服务定义与事务状态 | Windows 服务、health、NodeAgent 和安装后验收通过 |
| Docker | Config、Compose、旧管理器、旧镜像和一致的 MySQL 逻辑备份 | 新主容器 health、NodeAgent 在线;失败时恢复旧 Compose、镜像和数据库 |
升级包不会用包内 Config 覆盖当前正式配置,也不会主动覆盖录像目录。程序回滚能否安全读取升级期间产生的数据仍取决于数据库和配置向后兼容性;存在不可逆迁移时,必须按版本说明执行完整备份恢复。
查找记录和日志
| 平台 | 页面上传/状态根 | 独立任务日志与事务备份 |
|---|---|---|
| Linux | /var/lib/akstream-next-agent/upgrades/{packages,records,runtime} |
/var/lib/akstream-next-agent/upgrades/jobs/<升级ID>/upgrade.log;CLI 事务在 /var/lib/akstream-next/upgrades/transactions/ |
| macOS | /Library/Application Support/AKStream.Next/Data/Upgrades/ |
jobs/<升级ID>/upgrade.log 与 transactions/ |
| Windows | %ProgramData%\AKStream.Next\Data\Upgrades\ |
jobs\<升级ID>\upgrade.log 与 transactions\ |
| Docker | 页面状态映射到 <部署根>/Data/Upgrades/ |
jobs/<升级ID>/upgrade.log;事务和数据库备份在 <部署根>/Updates/transactions/ |
Linux 页面任务由 transient unit 执行,可结合升级 ID 检查:
sudo systemctl status akstream-next-upgrade-<32位升级ID>.service --no-pager -l
sudo journalctl -u akstream-next-upgrade-<32位升级ID>.service --no-pager
sudo tail -n 200 /var/lib/akstream-next-agent/upgrades/jobs/<32位升级ID>/upgrade.log
CLI 会直接在终端显示包、目标版本、SHA-256 和事务目录。无论页面还是 CLI,RolledBack 或 RollbackFailed 后都不要先删除事务目录;它是定位失败和人工恢复的权威证据。
常见失败怎么处理
| 现象或信息 | 常见原因 | 正确处理 |
|---|---|---|
| 页面上传返回 413 或连接被代理提前关闭 | Nginx/WAF/网关请求体或超时小于包大小 | 调整受控上传路由限制后重新上传;不要拆包或改扩展名 |
| “文件名必须是四段版本-平台-架构” | 包被改名、版本不是四段或扩展名错误 | 重新获取并保留官方原始文件名 |
| “只允许升级到更高版本” | 同版本重装或降级 | 使用修复版更高版本;降级走明确恢复流程 |
| “平台为 X,当前要求 Y” | OS/CPU/RID 不匹配 | 下载当前实例对应包,不能依赖模拟层 |
长期停在 agent-queue |
NodeAgent 离线、控制 WebSocket 中断或操作未领取 | 查看 Agent 状态和日志;不要直接让主服务自我退出 |
| 30 秒内没有运行状态文件 | systemd-run/launchd/计划任务/runner 未启动,或包装器解析失败 | 查看 NodeAgent 与系统任务日志;Windows 同时检查 SYSTEM 计划任务 |
| 页面升级时短暂无法访问 | 主服务正在被替换和重启 | 保持页面打开等待自动重连;不要刷新后重复开始 |
RolledBack |
新版安装或健康验收失败,旧版已恢复 | 继续使用旧版,保留诊断目录,修复新版后发布更高版本 |
RollbackFailed |
旧版、配置、数据库或宿主环境也无法恢复健康 | 停止自动操作,保留现场,按事务备份和灾难恢复 Runbook 处理 |
| 提示升级锁已存在 | 另一任务正在执行,或上次异常留下锁目录 | 先确认没有升级进程/系统任务;只有确认无人执行后才人工处理锁 |
| 提示 FFmpeg 不可用 | 当前正式安装依赖的 FFmpeg 路径丢失 | 在停服务前恢复同架构可执行 FFmpeg,再重试 |
升级后验收
升级工具的健康通过只是第一层。继续按生产上线验收执行:
akn info显示目标四段版本、RID、安装目录和配置目录正确。akn status显示主服务、NodeAgent 和/health正常。- readiness 中数据库、MediaServer、存储、授权和后台任务没有阻断项。
- 查看配置版本和来源,确认没有待重启或路径漂移。
- 验证一条真实设备实时流、一次停止与资源释放。
- 验证新录像文件产生、索引查询、Range 播放或下载。
- 使用 GB28181/ONVIF/RTSP/RTC 的现场必需路径做最小回归。
- 观察错误率、数据库超时、协议命令超时、磁盘和进程资源。
- 在观察期结束前保留原包、上一版本和事务目录。
多节点应先升级验证节点,完成观察后再分批扩大;不要同时升级所有控制、协议和媒体节点。已有直播、录像、RTP 或 RTC 会话不保证无损跨版本迁移。
完成标准
- 使用的是目标平台、架构和更高四段版本的正式完整包。
- 包外 SHA-256、包内版本、保护清单和核心文件哈希均已核对。
- 升级状态为
Succeeded,或者失败时明确为RolledBack且旧版关键业务恢复。 - 主服务、NodeAgent、数据库、MediaServer、录像和必需协议路径通过验收。
- 升级日志、事务目录、操作者、时间、目标版本和观察结论已归档。
RollbackFailed、未知状态或长期Running不能作为完成。
CLI 参数的其他含义见服务管理命令;一致性备份和灾难恢复边界见备份、恢复、升级与回滚。