KaliOS 机队管理平台
面向 KaliOS 设备的云端后台:设备心跳 / 配置 OTA / 状态地图 / 设备管理 / 远程操作。 设计取向:服务端零依赖、设备端拉取式(设备不需要 VPN 入网)。
架构
| 组件 | 位置 | 说明 |
|---|---|---|
| 控制台 | fleet-server.py |
Python stdlib 单文件,无第三方依赖;官网 + 控制台 + API + 设备端接口都在里面 |
| 设备端 | agent/ |
fleet-agent,拉取式上报与 OTA(≥ 1.16 推荐) |
| 官网 | www/ |
对外展示页 |
拉取式是关键设计:设备只自己往外连,不要求公网可达、不需要 VPN —— 量产设备开箱即可上报。
云端拓扑
:80 fleet-server(systemd: fleet-server) 官网 + 控制台 + API
:8899 kalios-forward(80 → 8899 转发)
:8891 gcode 静态站(纯 http.server,挂 /opt/gcode-patterns)
- 生产目录:ECS
/opt/kalios/,FLEET_HOME=/opt/kalios,EnvironmentFile=/opt/kalios/env,MemoryMax=1G - ECS 环境:Alibaba Cloud Linux 4 · Python 3.11.6 · 2 核 / 1.7 GB
配置 OTA 机制
| 机制 | 说明 |
|---|---|
| 清单 | 云端 manifest.json + config-releases/ 保存全员配置基准 |
| per-host | 设备 GET /manifest.json?host=…,按主机名取配置 |
| gate | 配置版本门槛,未达标强制同步 |
| 版本要求 | agent ≥ 1.16 才有 per-host / gate;1.9 等老版本只能用旧版全局 OTA |
设备侧开关:/etc/kalios/fleet-agent.env 里的 FLEET_SKIP_OTA。
临时对齐云端配置:
FLEET_SKIP_OTA=0 kalios-fleet-agent --once --ota-only
远程重刷 MCU
- 入口:
/usr/local/bin/kalios-reflash-mcu(agent 1.17+ 可云端拉取) - Katapult 板走
lib/katapult/flashtool.py - ⚠️
out/klipper.bin的 MCU 型号必须与目标板一致 —— 曾出现 bin 编的是 H723、板子是 F407,刷写直接拒绝
金镜像流程(量产)
- 样机
bake:写入 firstboot +PLACEHOLDER_HOST+/etc/kalios/site.env模板 (agent/golden-image/bake-into-image.sh) - 封镜像前清掉
firstboot.done与主机身份 —— 否则所有量产机共用一台机的主机名 - 从 eMMC/TF 导出镜像 → 需要时 shrink
- 烧录验证:上电后能上报、云端地图可见
验收要点:主机名应为 firstboot 生成的 kali-*,不是样机旧名。
运维坑
| 坑 | 现象 | 正解 |
|---|---|---|
| 官网 303 | 本地隔离实例 / 跳到 /console |
官网读 $FLEET_HOME/www/index.html,隔离目录里要 cp -r www 进去 |
| 读密码取不到 | .admin-password 解析失败 |
内容是「用户名制表符密码」,要按 \t split |
| 部署覆盖 | 直接覆盖线上文件 | 改前必须 cp xxx.bak.$(date +%Y%m%d%H%M%S) |
| 本机与云端不同源 | 本机 8899 跑的是旧版 35 KB,云端是 275 KB 新版 | 核对文件指纹(md5/sha256)再判断"是不是同一份代码" |
🔐 凭据一律不写进仓库、文档与镜像日志(
FLEET_TOKEN、密码等)。
相关
- 机队状态监控:语义与陷阱 —— 状态灯颜色到底代表什么
- RK3562 量产与金镜像 —— 镜像怎么量产