项目概述
NIE-SLA 是支持自托管部署的开源探针与 SLA 管理平台。服务端基于 Cloudflare 运行,VPS 上安装 Rust Agent 采集系统指标。平台提供服务可达性探测、系统指标采集、多地区网络延迟测量、长期 SLA 统计、告警通知与公开状态展示。
Cloudflare 主动探测、Agent 在线状态、主机侧 TCP Ping 与外部 Latency 属于不同数据来源。NIE-SLA 分别记录并展示这些结果,避免用单一在线状态掩盖不同链路的异常。
系统架构
被监控 VPS 独立观测节点
Rust Agent Latency Agent
│ 系统指标 / TCP Ping │ 跨网络 TCP 延迟
└──────── scoped Token ────────────┤
▼
Cloudflare Worker + Static Assets
路由 / 认证 / 聚合 / 告警 / 公开 API
│ │ │
▼ ▼ ▼
D1 R2 Durable Objects
配置与索引 高频历史与归档 区域探测协调Worker 作为统一服务入口,同源提供公开状态页、管理后台与 API。各组件的分工:
- D1:配置、索引、当前状态与固定时间桶 SLA 数据。
- R2:高频遥测、状态快照、归档与主题文件。
- Durable Objects:区域探测协调与每 Agent 小时遥测缓冲。
- 每分钟 Cron:推进探测、聚合、清理与通知任务。
- Worker Static Assets:公开页与后台静态资源。
系统不把每秒原始指标全部写入 D1。历史接口设置时间范围与点数上限,高密度数据可降采样。可选数据源读取失败时,API 通过 warnings[] 返回部分降级信息,不把读取失败表示为空数据。
观测来源
| 数据来源 | 观测位置 | 数据含义 |
|---|---|---|
| Cloudflare 主动探测 | Cloudflare 边缘与区域执行器 | 到目标的当前可达性与连接延迟 |
| Rust Agent 在线状态 | 被监控 VPS | 系统指标的最近上报状态 |
| Agent TCP Ping | 被监控 VPS | 被监控主机到指定目标的网络质量 |
| 外部 Latency Agent | 独立地区或运营商节点 | 外部网络到公开目标的连接延迟 |
服务端口可达不代表 Agent 正常上报,Agent 正常上报也不代表所有地区都能访问目标。公开页面与 API 保留数据来源与时间字段,集成端应分别处理各类状态。
与常见架构的差异
下表从实现方式角度对比常见形态。
| 项目 | 常见实现 | NIE-SLA 实现 |
|---|---|---|
| 状态判断 | 中心探测或单一 Agent 心跳 | 分别记录主动探测、Agent 状态、主机侧 Ping 与外部 Latency |
| 服务端 | 自建常驻应用、数据库与独立前端 | 组合 Worker、Static Assets、D1、R2 与 Durable Objects |
| 高频历史 | 原始样本集中写入关系数据库 | D1 保存当前状态与聚合,R2 保存高频历史与归档 |
| Agent 离线 | 内存重试或直接丢弃未上传样本 | 本地持久队列,服务端确认接收后删除 |
| 第三方集成 | 复用前端内部接口 | /api/v1 Manifest 与稳定只读端点 |
| 页面定制 | 修改主前端或运行高权限扩展 | CSS 主题与 sandbox="allow-scripts" 隔离 Canvas 主题 |
| Agent 发布 | 依赖在线 CI | 本地构建五种静态 Linux 架构,校验、健康检查与回滚 |
关键实现
Agent 离线队列
Rust Agent 把待上传样本写入本地持久队列。落盘使用唯一临时文件、create_new、Unix 0600 权限、文件与父目录 fsync,最后原子重命名。持久化失败时队列保持 dirty 并继续重试;样本只在 Worker 确认接收后删除,降低断网或重启造成的历史缺失概率。
公开 API
GET /api/v1 返回当前部署支持的端点与能力。公开 API 是无凭据只读接口,浏览器跨域访问受精确 CORS allowlist 限制。历史查询设置固定上限,状态接口使用缓存;客户端需要同时处理 HTTP 状态、JSON ok 与 warnings[]。第三方前端只使用公开 API,不代理管理员 Session,也不持有 Agent Token。
凭据管理
管理员认证使用短期 Session,可选 TOTP。Agent 与 Latency 节点使用独立的 scoped Token,禁用节点后对应凭据不再有写入权限。密码与 GitHub OAuth 票据只用于登录端点,不作为通用 API Token。
保护型备份使用 Cloudflare 兼容的 PBKDF2-SHA256(100,000 次迭代)与 AES-GCM 加密;恢复时 Agent Token 用目标部署的密钥重新封装,跨账号迁移后原节点仍可继续认证。
版本与更新链
应用、Worker、文档与 Agent 使用同步数字版本。应用源码 Tag 为 app-vX.Y.Z,Agent 二进制 Tag/Release 为 vX.Y.Z。Worker 的系统更新检查优先读取官方 manifest,遇到 429、5xx、超时或无效响应时使用成功缓存或 Static Assets 内置 manifest;这只改变版本信息来源,不跳过部署仓库的测试与 dry-run。
Agent 安装与更新依次校验安装器、setup、SHA256SUMS、架构二进制与版本。校验链能发现传输损坏与产物错配,但校验值来自同一发布信任域,不等同于独立离线签名。二次开发与发布要求见二次开发。
Linux 主遥测服务使用低权限账户。1.0.44 移除 ICMP 后,systemd 单元与 Agent 二进制均不再需要 CAP_NET_RAW;Agent Manager 启动时会尽力清除旧版本遗留的文件 capability。