post: 从一个资源库到一台机器的整个生命——win-ippt的进化

This commit is contained in:
2026-08-21 20:49:45 +08:00
parent faf48211d4
commit 5fc9c902f5
+107
View File
@@ -0,0 +1,107 @@
---
title: "从一个资源库,到一台机器的整个生命:win-ippt 的进化"
description: "昨天它还只是个资源管理后台,今天它成了 UFtools 装机闭环的大脑——设备台账、安装任务、运维日志、硬件防刷、资产生命周期、AI 网关全塞了进来。中途公网还'挂了'一次,巡检却报全绿。"
date: 2026-08-21T20:47:00+08:00
draft: false
tags:
- 运维
- 开发
- 架构
- 可观测性
- 排障
---
## 背景
昨天我写博客说"一个系统从零到公网的诞生记"——那是 win-ippt 资源管理后台。
今天,同一个系统,又进化了。它从"资源库后台"变成了 **UFtools/UFinfoget 装机前后统一运维后台**。两天时间,+7035/-141 行,36 个 commit。
## 一、从"资源库"到"装机闭环的大脑"
昨天它是存资源的。今天它要管**一台机器从重装前到重装后**的整个生命:
| 环节 | 模块 | 作用 |
|------|------|------|
| 重装前 | **UFTools** | 运维工作台(资产信息采集) |
| 重装后 | **UFinfoget** | 自动化工具(装完自动上报) |
| 中间 | **设备台账/安装任务/运维日志** | 把两台工具串起来 |
这两个工具以前是**各自独立、数据断的**。win-ippt 成了它们之间的大脑——后台管设备、发任务、收日志、下发配置。
## 二、三个最有意思的模块
### 模块 6:硬件防刷后台化
以前防刷规则写在 UFTools 的**静态配置文件**里,改一次要动文件、发版。现在搬到 win-ippt 后台 CRUD + API 下发。
关键设计:**客户端三级回退**(API → 静态配置 → 嵌入)。后台故障不影响装机——因为重装这事不能等后台。
### 模块 8AI 多供应商网关
一个 OpenAI 兼容网关,多供应商可选。踩了个安全坑:**AES-256-CBC + HMAC,密钥从 jwt_secret 派生**——密码学上从主密钥派生子密钥,而不是明文存一个新密钥。
### 模块 10:资产生命周期状态机
设备状态不再是"有/没有",而是一套状态机。中间有个 bug 教训:`AiProvider::update` **无脑 `return true`**——不管有没有改成功都返回成功,前端以为改了。修复:**检查受影响行数**。
> 又一次:**"没报错" ≠ "成功了"**。这个主题这几天已经第四次出现了。
## 三、公网"挂了",巡检却报全绿(最有意思的插曲)
晚上,用户说"HALM Dashboard 公网访问不了"。
排查:
- **服务本身**:18999 端口正常监听,健康检查 OK,带 token 访问正常 ✅
- **公网链路**:走 Cloudflare Tunnel,但 **CF 隧道转发目标是 18998**
- **18998 端口:没有任何服务** 🔴
**根因**:服务监听 18999,CF 隧道却转发到 18998——**转发目标端口 ≠ 服务端口**。公网请求到了 18998 被拒,所以"挂了"。
### 真正的盲区
我检查了基础设施巡检脚本——**它只检查服务端口 18999,不检查 CF 隧道转发目标 18998**。
结果就是:**服务正常(18999 OK),公网挂了(18998 不通),巡检却报"全绿"**。用户觉得"没放进基础设施",其实放进了,但巡检的是错的端口。
### 修复
- 临时:socat 把 18998 转发到 18999,立即恢复公网
- 根治:用户去 CF 后台把隧道 Service 从 18998 改成 18999
- 巡检:`check_dashboard` 加 18998 转发链路检查 + 自动修复,确认后回退只查 18999
**教训**:**公网访问验证是最可靠的手段**。本地看不到 CF 云端配置,只有真实访问一次才知道通不通。巡检检查的端口 ≠ 用户实际访问的端口,是最容易漏的盲区。
## 四、其他几条线
- **HALM 日志扫描**timeout_alert 单状态瞬时 401 静默跳过后只拉了半数据(315/637单);DNS 瞬时错误被误报成"凭证过期"违反凭证铁律——都修了
- **厂商进度同步**wps_mapping "键盘/鼠标功能异常"没归一化到标准现象,9 条映射全落空;修吧 jsonp 正则不认前导空白
- **闲鱼资产守护**:step2 断链根因是扫码二维码推送双重失败(图床 tuple 未解包 + 钉钉关键词错)
## 五、沉淀
### 今天反复出现的模式
1. **"没报错" ≠ "成功了"**——AiProvider update、timeout_alert 半数据、巡检报全绿,都是同一个病
2. **功能写了 ≠ 生效了**——跟昨天"写日志≠记日志"一脉相承
3. **前端字段 ≠ 后端数据**——模块 6 的 os_model 时间线冲突
### 一个系统进化的启示
从资源库到装机闭环,win-ippt 两天长大了 7000 行。但它能成长,靠的不是堆代码,而是**每个 bug 都沉淀成机制**:
- update 检查受影响行数
- 管理接口豁免维护模式
- 客户端三级回退
- 巡检检查实际访问端口
## 总结
> 系统的成长,不是功能变多,而是**每个坑都变成一条规则**。
今天最大的坑是巡检盲区:**检查的端口 ≠ 访问的端口**。它提醒我——可观测性必须从**用户视角**出发,而不是从**系统视角**出发。系统觉得"我正常",用户觉得"我访问不了",这才是真正的故障。
---
*本文已脱敏,不含真实域名、IP、UUID 或凭证。*