小白系统监控器(fnmon)开发文档
这个项目是什么
fnmon 是专为飞牛 fnOS 打造的实时系统监控面板,以单个 Docker 容器运行,覆盖 CPU、内存、网络、磁盘、进程排行、应用用量 六大维度,历史数据可一键导出为 JSON。它不装驱动、不改系统文件,用 privileged + 只读挂载 /proc、/sys 的方式读取宿主指标,一个 docker run 就能获得接近群晖 DSM / 威联通 QTS 那种可视化监控体验。
技术栈与架构
- 后端:Flask(Python 3.9),
requirements.txt只有两个依赖:Flask、psutil。 - 系统信息采集:
psutil+/proc文件系统 + 系统命令行工具,Dockerfile 里安装了smartmontools(SMART/硬盘健康)、net-tools、iproute2、procps、lm-sensors(温度)。 - 实时推送:Server-Sent Events(SSE),2 秒间隔推送全部数据,前端收到即渲染,无需轮询。
- 存储:SQLite,保存应用用量与流量审计数据;进程 + Docker 资源快照每 60 秒采集一次,自动聚合到日 / 周 / 月 / 年维度。
- 前端:纯 HTML/CSS/JS,无构建步骤(
static/index.html),改完随容器重建生效。 - 容器:基于
python:3.9-slim,镜像约 342MB,监听 5000 端口。
仓库结构
| 路径 | 作用 |
|---|---|
app.py |
Flask 主程序与 SSE 推送入口(start.sh 也是 exec python3 app.py) |
app_usage_tracker.py |
应用量采集:进程 + Docker 资源快照,按日/周/月/年聚合写 SQLite |
traffic_tracker.py |
网络流量与 Docker 容器流量审计 |
static/index.html |
前端单文件(HTML/CSS/JS,无外部依赖) |
requirements.txt |
Flask、psutil |
Dockerfile |
python:3.9-slim-bullseye + 系统工具 + pip 依赖,EXPOSE 5000 |
start.sh |
本地启动脚本:exec python3 app.py |
generate-fpk.py |
生成飞牛 fpk 应用包 |
generate_icon.py |
生成应用图标 |
cpu-monitor-proxy.conf |
CPU 监控相关的代理配置文件(README 未展开说明) |
README.md / README-FORUM.md |
主 README 与飞牛论坛发布版说明 |
本地开发环境
git clone http://127.0.0.1:3200/jinghui/fnmon.git
cd fnmon
pip install -r requirements.txt
python3 app.py # 或 ./start.sh,监听 5000
本地直接跑时,依赖宿主机已装 smartctl、lm-sensors 等工具(容器内由 Dockerfile 安装);硬盘 SMART 信息需要 root 权限,本地裸跑建议用 root 或赋予 CAP_SYS_ADMIN,容器方式则用 --privileged。
配置项说明
| 配置键 | 默认值 | 含义 |
|---|---|---|
| 监听端口 | 5000 |
Web 面板端口(Dockerfile EXPOSE 5000,compose/docker run 都映射 5000:5000) |
/var/exports |
挂载的宿主目录(示例 /vol2/fnmon-exports) |
数据导出的落盘目录,不挂载就省略该卷 |
TZ |
compose 示例为 Asia/Shanghai |
时区,影响流量「当日/当月」统计与导出文件名 |
--privileged |
必需 | 读取宿主 /proc、/sys、SMART 所需 |
/proc、/sys |
只读挂载(:ro) |
指标来源 |
导出路径也可以在面板的 ⚙️ 设置里改;导出文件名格式为 fnmon-export-YYYY-MM-DD-HHMMSS.json。
构建与发布
docker build -t fnmon .
已发布镜像:Docker Hub jinghui1984/fnmon。发布到飞牛 fpk 用仓库里的 generate-fpk.py(配合 README-FORUM.md 的论坛发布说明使用)。
部署方式
docker run -d --name fnmon -p 5000:5000 --privileged \
-v /proc:/proc:ro -v /sys:/sys:ro \
-v /vol2/fnmon-exports:/var/exports \
jinghui1984/fnmon
version: '3'
services:
fnmon:
image: jinghui1984/fnmon
container_name: fnmon
restart: always
ports:
- "5000:5000"
privileged: true
volumes:
- /proc:/proc:ro
- /sys:/sys:ro
- /vol2/fnmon-exports:/var/exports
environment:
- TZ=Asia/Shanghai
二次开发要点
- 推送模型:SSE 每 2 秒推一帧全量数据,前端自动渲染;改指标时注意别把帧做得过大(CPU 每核频率、60 秒曲线、TOP 20 进程都在里面)。
- 两套采集周期:实时面板走 SSE(2 秒),历史聚合走 60 秒快照(进程 + Docker 资源),改采集逻辑要同时顾及两者,历史聚合结果直接决定「应用用量排行」的日/周/月/年数字。
- 依赖系统命令:SMART 靠
smartctl、温度靠lm-sensors、进程靠procps——精简基础镜像或换发行版时别把这些包删了,否则对应面板会整块空白。 - 零前端构建:
static/index.html是纯静态单文件,没有 npm 也没有打包器,改样式直接改这个文件。 - 导出是全量快照:导出 JSON 包含 CPU 实时数据、内存快照、60 秒网络队列、磁盘 I/O、SQLite 应用用量全量(含日/周/月/年聚合)与 Docker 流量存档;做导入/对比功能时以这个结构为准。
- 零侵入原则:容器内不写系统文件,只读挂载
/proc、/sys;新增功能尽量走只读采集,别改成写宿主目录。
相关链接
- Gitea 仓库:http://127.0.0.1:3200/jinghui/fnmon
- Docker Hub:
jinghui1984/fnmon - 上游 GitHub:https://github.com/personal82555/fnmon
- 论坛讨论:飞牛论坛(club.fnnas.com)