Repository navigation
Releases: MisiteQ/fnmonitor
Release list
v2.18.3 修复飞牛手机 app 打开面板报 csrf_rejected
v2.18.3
修复:飞牛官方手机 app 打开面板仍报 csrf_rejected 的问题(v2.18.1 / v2.18.2 修复不彻底)
日志定位到真实链路:手机 app 的面板经飞牛官方远程域名(office.app.5ddd.com 等)+ fnOS 本机代理组件转发到本服务,请求来源是本机回环(::1),其 Origin 是官方域名、与被代理改写后的 Host 不一致,撞上公网跨站拒绝规则。
现对本机回环来源(127.x / ::1)直接信任 CSRF 检查——该来源由内核网络栈决定,外部浏览器跨站请求不可能伪造,公网防护不受影响。
升级后请用飞牛官方手机 app 重新打开面板验证。
v2.18.2
飞牛监控 v2.18.2
① 修复飞牛官方手机 app 内嵌打开面板仍报 csrf_rejected 的问题:放行 Origin: null 与 app 内部 scheme 等 WebView 特征来源(v2.18.1 仅放行局域网 Origin 不够),跨站防护不降级——application/json + X-FNM-Request 两道闸继续拦截浏览器跨站请求
② 新增 CSRF 拒绝日志:POST 请求被拒时在 server.log 记录具体闸门(content_type / header / origin)与来源地址,便于定位 app 内嵌等特殊访问场景
安装包(按 NAS 架构选择)
| 文件 | 适用 | 大小 | SHA-256 |
|---|---|---|---|
fnmonitor-2.18.2-x86.fpk |
x86 机型 | 523,329 B | e4dc18e2827073f278a6e18b121540c4727c3d2cc74287a43124a010008f9ed6 |
fnmonitor-2.18.2-arm.fpk |
arm64 机型 | 523,331 B | d37de5b2425e3013db726e507532ab78e70ca43e40a1cbafe73c85c67236aa21 |
升级方式:飞牛应用中心手动安装 fpk,或通过 FnDepot 应用源 / 应用内「软件更新」在线升级。
v2.18.1
飞牛监控 v2.18.1
① 盘位与内存插槽卡片自适应:硬盘 / 内存数量少时卡片拉伸铺满模块宽度(移除盘位假槽位填充与宽度上限),多时自动换行;修复盘位卡片文字溢出(型号最多两行截断、去掉无意义 ATA 前缀、内存插槽文字溢出保护)
② 修复设置页侧边栏高亮错位:点击立即高亮并跟随滚动位置,底部矮分组(数据 / 软件更新 / 关于)也能正确高亮
③ 修复飞牛官方手机 app 内嵌打开面板报 csrf_rejected 无法登录的问题:放行同主机名任意端口与局域网来源,跨站防护不降级
安装包(按 NAS 架构选择)
| 文件 | 适用 | 大小 | SHA-256 |
|---|---|---|---|
fnmonitor-2.18.1-x86.fpk |
x86 机型 | 522,966 B | 6ec6da5c4c187cd644cac324b463d85f88f9f0e1a668eed1092603060123c456 |
fnmonitor-2.18.1-arm.fpk |
arm64 机型 | 522,977 B | 14690c042e11d39ee3879783258e3fcca2e14d4723ceb69cd58a9d108d4c63c4 |
升级方式:飞牛应用中心手动安装 fpk,或通过 FnDepot 应用源 / 应用内「软件更新」在线升级。
v2.18.0
飞牛监控 fnMonitor v2.18.0
本版本合并社区贡献者 @iqiuzixuan 的上游贡献(PR #8 / #9 / #10 / #12),并更换全新应用图标。
✨ 本次更新
- 全新界面与设计体系(社区贡献):点阵数字 / 大圆角卡片 / 深浅色 + 多主色 / 手机平板自适应
- 新增虚拟机监控页(QEMU/KVM + libvirt):列表与 CPU / 内存 / 磁盘 / 网络实时读数,开机 / 关机 / 重启 / 挂起 / 恢复 / 强制关机
- 后端安全加固:登录令牌、CSRF 与 Host 校验、请求体限制、敏感信息脱敏
- 回归测试套件与 GitHub Actions CI:多 Python 版本单元 / HTTP 集成测试 + 前端构建一致性校验
- 全新应用图标:桌面 / 应用中心 / 包内 / 网页 favicon 统一更新
- 开源许可与致谢:补充 MIT 许可证(双版权:Misite齊 / iqiuzixuan),README 与「关于」页加入贡献者署名与 GitHub 链接
📦 安装包
- x86:
fnmonitor-2.18.0-x86.fpk - arm64:
fnmonitor-2.18.0-arm.fpk
安装包需通过 SHA-256 校验,校验信息见仓库根目录 fnpack.json。
🙏 致谢
特别感谢 @iqiuzixuan 为本项目带来的全新界面、虚拟机监控、安全加固与测试体系。
📋 完整更新日志
v2.17.1
v2.17.1
移除风扇控制功能:本系统定位为纯数据读取监控,不操作系统硬件。删除风扇调速滑块、占空比设置、恢复自动温控(交还 BIOS)等所有写操作,仅保留风扇转速读取与趋势展示。
安装包校验
| 架构 | 文件 | SHA256 | 大小 |
|---|---|---|---|
| x86 | fnmonitor-2.17.1-x86.fpk | 0aff3590619cb57a1b4852d5e1947135379161f054e117aa432c70198343d091 |
304,939 B |
| arm | fnmonitor-2.17.1-arm.fpk | f1f8cda08ee235964a07da287a91dc3fd000708e3fd823571da68954dfa94fc1 |
304,957 B |
v2.17.0
v2.17.0
① 新增登录口令功能:设置页可开启口令登录,访问监控面板需先输入口令;支持首次设置、修改口令、会话有效期(1-365 天),未设口令时自动引导设置
② 面板拖拽改为仅标题栏可拖:拖拽排序不再从正文/图表区域发起,只有面板标题栏(⠿ 区域)可发起拖拽,避免误触图表交互
③ cmd 修复:install_callback / upgrade_callback 同步 manifest 到 APP_DEST(确保 fnOS 应用管理中心版本号正确);cmd/main stop() 由 exit 0 改为 return 0
安装包校验
| 架构 | 文件 | SHA256 | 大小 |
|---|---|---|---|
| x86 | fnmonitor-2.17.0-x86.fpk | 034a245d67cd82b5920fb28c2e5130581e4a11cfe2d8639ad15fbdd0c15fc613 |
306,537 B |
| arm | fnmonitor-2.17.0-arm.fpk | 946fee617fce32078c1cd50f0567af1eaf4c9eb7235824e6fe8aadff51982858 |
306,545 B |
v2.16.8
v2.16.8 三个修复
① 修复更新后版本号显示为旧值(2.9.7 缓存问题)
根因:浏览器缓存了旧版前端文件。虽然 server.py 的 _serve_file 和 _send_bytes 已设 Cache-Control: no-store,但:
- HTML
<head>缺少 meta 缓存控制声明 - 更新成功后的
location.reload()可能命中浏览器磁盘缓存,加载旧版 index.html
修复:
- HTML
<head>添加<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">+<meta http-equiv="Pragma" content="no-cache">+<meta http-equiv="Expires" content="0"> - 更新成功后的 reload 改为 cache-busting URL:
location.href = location.pathname + "?v=" + Date.now(),强制浏览器从服务器获取最新页面
② 删除"一键初始化界面"描述中残留的"云纹背景"字样
"一键初始化界面"模块的子描述文字中仍残留"/ 云纹背景"字样(v2.9.6 已移除云纹背景功能,但文字未清理),现已删除。
③ 修复开启上月汇总后总仪表盘不显示汇总卡片
根因:用户刚开启功能时 monthly_summary 表还没有数据(需等 cleanup 触发归档,每小时一次),j.available=false 导致卡片一直隐藏。原逻辑 !j.enabled || !j.available → display:none 把开关已开但暂无数据的卡片也隐藏了。
修复:renderMonthlySummary 改为——仅 !j.enabled 时隐藏;已开启时无论有无数据都显示;无数据时卡片标题显示"上月汇总",内容区显示"暂无汇总数据,等待后台采集归档(每小时自动清理时触发)"。
SHA256
| 文件 | 校验值 |
|---|---|
| fnmonitor-2.16.8-x86.fpk | abc256aee20e0df53748a6770db8f11c0d9500c79f7e4863c092d3ec0fdf260e |
| fnmonitor-2.16.8-arm.fpk | 3a45db13b54ea3964cc9bb108d081cb7ce618106c89c33d92411134ba4a109cd |
v2.16.7
v2.16.7 修复「上月汇总」开关点击启用后瞬间复原、功能打不开
根因
api_config_save 保存配置到 config.json 文件后,同步内存 self.config 时漏了 monthly_summary_enabled 字段(第 4923 行的内存同步循环只包含了 traffic_exclude_bridge 和 disk_standby_protect)。导致:
- 用户点击启用 → api_config_save 把
monthly_summary_enabled:1写入 config.json ✓ - 但
self.config["monthly_summary_enabled"]仍是旧值 0(没同步) - saveMonthlySummary 成功后调用 pollMonthlySummary →
/api/monthly_summary读self.config→ 返回enabled=false - renderMonthlySummary 把 checkbox 重置为 false → 开关瞬间复原
修复(3 处)
- 后端
api_config_save:内存同步循环加入monthly_summary_enabled——保存后内存立即生效 - 前端
loadConfigForm:加入set-monthly-summary的 checked 加载——刷新页面后开关反映已保存的配置 - 前端
renderMonthlySummary:移除回写 checkbox 的逻辑——避免轮询时覆盖用户正在操作的开关状态
SHA256
| 文件 | 校验值 |
|---|---|
| fnmonitor-2.16.7-x86.fpk | b96e27da6e5ad739e98bd89348eb20e1b9998d5ee64135887d2879e711493ae5 |
| fnmonitor-2.16.7-arm.fpk | 3e8f6dc6f51e3d8f69c3dc25f60c51fa244bae1fbbca1d065702b6adc3827de1 |
v2.16.6
v2.16.6 新增「上月汇总」功能
在总览仪表盘顶部新增上月汇总卡片,展示上个月各项监控数据汇总(CPU/内存/磁盘/温度的均值与峰值、网络总流量、功耗 kWh 与电费、负载等),设置中可开关。
核心机制:清理前增量叠加
历史保留天数(retention_days)默认 7 天,不足整月。当 retention < 31 时,metrics 表中上月初的数据已被 cleanup 删除,无法在月初一次性查询整月数据。
解决方案:每次 cleanup 执行 DELETE FROM metrics WHERE ts < cutoff 前,先把即将删除的数据按月汇总后 UPSERT 到独立的 monthly_summary 表(不受 cleanup 影响)。即使 retention=7,每月 cleanup 时都会把即将删除的 7 天数据汇总叠加,月度汇总始终完整不丢失。
实现细节
- 新建
monthly_summary表(与 metrics 同库):主键 (year, month, metric),存 sum/count/max/min/first_val/last_val - 清理前增量叠加(
_archive_to_monthly):cleanup 删除前按 metric 分组聚合,通过INSERT ON CONFLICT DO UPDATEUPSERT —— sum/count 累加(加权平均)、max/min 取极值、first_val 取更早的、last_val 取更晚的 - 月初补全(
_archive_to_monthly_range):每月 1-3 号检查,把上月仍在 metrics 表中的数据也归档(防止月末数据遗漏) - 速率型指标(cpu/mem/disk/temp/power/load1/fan):avg=sum/count, max/min 直接取
- 累计型指标(net_rx_bytes/net_tx_bytes):月度值 = last_val - first_val(计数器差值)
- API
/api/monthly_summary:返回最近月度汇总 + retention 不足时的提示 - 配置项
monthly_summary_enabled:加入 DEFAULT_CONFIG / load_config 白名单 / api_config_save - 前端:仪表盘顶部卡片 + 设置开关 + 5 分钟轮询;retention < 31 且开关开启时显示提示
提示功能
当开关开启且 retention_days < 31 时,在设置页与仪表盘卡片中显示:「历史保留天数 X 不足整月,已自动叠加保存汇总统计」。
SHA256
| 文件 | 校验值 |
|---|---|
| fnmonitor-2.16.6-x86.fpk | 1a9cadf77b939edde110532136fc33e58b9df08daa6e98d7013ea92fb5aab190 |
| fnmonitor-2.16.6-arm.fpk | 37e654718fc5172832e2b72995009c63e8ac2d64be48738f121db9e7cfc5bb66 |
v2.16.5
v2.16.5 修复长期运行后内存冲顶不回落(issue #3)
长期运行(历史库积累数百万行)后,fnmonitor 单进程 RSS 可达数 GB 且不回落。用户实测:692 万行 metrics 表,一次 GET /api/export?range=all 即 +1.44 GiB RSS,32 秒内采样为零不回落。
根因
历史导出(/api/export?range=all)、流量统计、健康报告路径的查询结果被误挂入「休眠读缓存」_read_memo 永久持有。_memo 缓存本为「休眠硬盘不被面板轮询唤醒」设计,但被误用到导出路径——导出是用户主动的一次性操作,下次可能要不同范围或最新数据,缓存它毫无意义,且全表 fetchall() 可达数百万行。
修复
- 导出路径不再缓存:
export_rows/export_net/query_prefix改用_no_cache(rows)(直接返回,不挂_read_memo),函数返回后 Python GC 回收 _memo仅保留给面板轮询触发的query()(休眠保护核心场景)- 全表查询加
LIMIT 1000000保护:防止极端积累撑爆内存(约 23 个月 × 每分钟 1 条,远超正常 retention 30 天 = 4.3 万行) - 休眠保护仍生效:休眠时返回空列表(导出要求准确数据,不能用过时缓存;读 db 会唤醒 STANDBY 硬盘)
SHA256
| 文件 | 校验值 |
|---|---|
| fnmonitor-2.16.5-x86.fpk | 2be361468df78de79977e5e162885bfcea149ecbe85b824292870be62dce84bb |
| fnmonitor-2.16.5-arm.fpk | e66be22a191619d9b8116cbf4740dd05f011d84d211f725670371de2a3d01535 |