14 Commits
Author SHA1 Message Date
jinghui bf5a1c7301 更新 README.md 2026-11-06 17:28:30 +08:00
jinghui 6620377934 更新 README.md 2026-11-06 17:25:07 +08:00
jinghui 81df67fb20 更新 README.md 2026-11-06 17:21:11 +08:00
jinghui 96442db19c 上传文件至「docs」 2026-11-06 17:19:26 +08:00
jinghui 0936a86d0e 更新 README.md 2026-11-06 17:18:48 +08:00
jinghui ed23092cd6 feat: rename memory recycle button 2026-11-06 17:16:27 +08:00
jinghui d5e78908fb docs: full-page screenshots 2026-11-06 17:10:57 +08:00
jinghui e0627a9158 docs: add per-page screenshots 2026-11-06 17:08:54 +08:00
jinghui 986dc63179 更新 README.md 2026-11-06 17:02:22 +08:00
jinghui fc764b9faa 更新 README.md 2026-11-06 16:52:04 +08:00
jinghui 44eccf9a75 更新 README.md 2026-11-06 16:43:52 +08:00
jinghui 1abd96f081 v1.2.6 version in top-right 2026-11-06 16:37:59 +08:00
jinghui 37727fa9df feat: add install.sh and docker-compose for auto-update 2026-11-06 16:37:28 +08:00
jinghui c13dfb6df8 v1.2.5 top-right links 2026-11-06 16:30:10 +08:00
11 changed files with 88 additions and 20 deletions

No files matched your search

+9 -17
View File
@@ -1,12 +1,8 @@
# 飞牛资源管理器 (fnos-resmon)
# 飞牛NAS必装:进程级资源监控,比自带强10倍,一眼看穿谁在偷吃你的CPU/内存/磁盘/网络全透视,带一键内存回收的监控面板
CPU/内存/磁盘/网络 + 进程排行 + 一键回收 + SMART/连接明细,Docker一键部署
> 飞牛 NAS 专属的轻量级系统资源监控面板 —— 一个 Docker 命令即可拥有媲美专业 NAS 监控的 Web 界面。
![截图](docs/screenshot.png)
[![Gitea](https://img.shields.io/badge/Gitea-fnos--resmon-blue)](https://gitea.88531.cn/jinghui/fnos-resmon)
[![镜像](https://img.shields.io/badge/Docker-TCR-green)](https://gitea.88531.cn/jinghui/fnos-resmon)
[![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
---
@@ -39,7 +35,13 @@
## 📸 功能截图
![主界面](docs/screenshot.png)
![CPU](docs/PixPin_2026-11-06_17-13-43.png)
![内存](docs/mem.png)
![磁盘](docs/disk.png)
![网络](docs/net.png)
---
@@ -86,11 +88,6 @@ docker run -d --name fnos-resmon -p 7031:7031 --privileged \
启动后浏览器访问 `http://你的NASIP:7031` 即可。
### 方式二:飞牛应用中心安装 FPK
1. 下载 [Releases](https://gitea.88531.cn/jinghui/fnos-resmon/releases) 中的 FPK
2. 飞牛应用中心 → 本地安装 → 选择 FPK
3. 安装完成后打开「飞牛资源管理器」
---
@@ -111,11 +108,6 @@ docker run -d --name fnos-resmon -p 7031:7031 --privileged \
|------|------|
| Docker 镜像 | `jpccr.ccs.tencentyun.com/jinghui/fnos-resmon:latest` |
| Gitea 仓库 | https://gitea.88531.cn/jinghui/fnos-resmon |
| FPK 包 | [Releases](https://gitea.88531.cn/jinghui/fnos-resmon/releases) |
---
## 🤝 贡献
欢迎 Issue 和 PR!
+7 -2
View File
@@ -52,6 +52,11 @@ button.refresh{background:#20a53a;color:#fff;border:none;border-radius:3px;paddi
<div class="tab" data-t="mem">内存</div>
<div class="tab" data-t="disk">磁盘</div>
<div class="tab" data-t="net">网络</div>
<div style="margin-left:auto;display:flex;align-items:center;gap:12px;padding-right:16px;font-size:12px">
<span style="color:#999">v1.2.8</span>
<a href="https://nav.88531.cn" target="_blank" style="color:#20a53a;text-decoration:none">资享导航站</a>
<a href="https://gitea.88531.cn/jinghui/fnos-resmon" target="_blank" style="color:#20a53a;text-decoration:none">开源地址</a>
</div>
</div>
<div class="card" id="summary"></div>
<div class="cpuinfo" id="cpuinfo" style="display:none"></div>
@@ -72,7 +77,7 @@ document.querySelectorAll('.tab').forEach(t=>t.onclick=()=>{document.querySelect
function fmtB(b){if(b==null)return '-';const u=['B','KB','MB','GB','TB'];let i=0;while(b>=1024&&i<4){b/=1024;i++}return b.toFixed(b>=100?0:1)+u[i]}
function fmtR(b){return fmtB(b)+'/s'}
function esc(s){return String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;')}
async function dropMem(){if(!confirm('回收可回收内存(drop caches)?'))return;const r=await fetch('/api/mem/drop',{method:'POST'});const j=await r.json();alert(j.ok?('已回收,可用 '+fmtB(j.available)):('失败: '+j.error));load(true)}
async function dropMem(){if(!confirm('一键回收未使用的内存(drop caches)?'))return;const r=await fetch('/api/mem/drop',{method:'POST'});const j=await r.json();alert(j.ok?('已回收,可用 '+fmtB(j.available)):('失败: '+j.error));load(true)}
async function kill(pid,name){if(!confirm('结束进程 '+name+' (PID '+pid+') ?'))return;const r=await fetch('/api/kill',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({pid})});const j=await r.json();alert(j.ok?'已发送结束信号':('失败: '+j.error));load(true)}
function cmpVal(p,key){
if(key==='name')return String(p.name||'');
@@ -136,7 +141,7 @@ document.getElementById('sub').textContent=`共 ${j.total} 个进程,显示占
renderHeader();
B.innerHTML=j.items.map(p=>`<tr><td><a class="proc">${esc(p.name)}</a></td><td class="num">${p.cpu}</td><td class="num">${p.threads}</td><td class="num">${p.pid}</td><td>${esc(p.desc)}</td><td>${esc(p.user)}</td><td class="${p.active?'st-run':'st-sleep'}">${p.status}</td><td><button class="kill" onclick="kill(${p.pid},'${esc(p.name)}')">结束</button></td></tr>`).join('');
}else if(cur==='mem'){
S.innerHTML=`<div class="stat"><div class="k">内存占用</div><div class="v green">${j.percent}%</div></div><div class="stat"><div class="k">已用 / 总共</div><div class="v num">${fmtB(j.used)} / ${fmtB(j.total)}</div></div><div class="stat"><div class="k">可用 / Swap</div><div class="v num">${fmtB(j.available)} / ${fmtB(j.swap_used)}/${fmtB(j.swap_total)} (Swap ${j.swap_percent||0}%)</div></div><div class="stat"><div class="k">操作</div><div class="v"><button class="kill" onclick="dropMem()">回收可回收内存</button></div></div>`;
S.innerHTML=`<div class="stat"><div class="k">内存占用</div><div class="v green">${j.percent}%</div></div><div class="stat"><div class="k">已用 / 总共</div><div class="v num">${fmtB(j.used)} / ${fmtB(j.total)}</div></div><div class="stat"><div class="k">可用 / Swap</div><div class="v num">${fmtB(j.available)} / ${fmtB(j.swap_used)}/${fmtB(j.swap_total)} (Swap ${j.swap_percent||0}%)</div></div><div class="stat"><div class="k">操作</div><div class="v"><button class="kill" onclick="dropMem()">🧹 一键回收未使用的内存</button></div></div>`;
const D=j.detail||{},H2=j.hw||{},DM=H2.dimms||[];
const row=(k,v)=>`<span style="display:inline-block;min-width:230px;margin-right:12px">${k} <b class="num">${v}</b></span>`;
document.getElementById('meminfo').style.display='';
+14
View File
@@ -0,0 +1,14 @@
version: '3.8'
services:
fnos-resmon:
image: jpccr.ccs.tencentyun.com/jinghui/fnos-resmon:latest
container_name: fnos-resmon
privileged: true
network_mode: host
pid: host
volumes:
- /proc:/host/proc:rw
- /sys:/host/sys:ro
environment:
- PROCFS_PATH=/host/proc
restart: unless-stopped
Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 549 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 614 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

BIN
View File
Binary file not shown.
+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env bash
set -euo pipefail
PORT="${PORT:-7031}"
CONTAINER_NAME="${CONTAINER_NAME:-fnos-resmon}"
INSTALL_DIR="${INSTALL_DIR:-/vol1/1000/HD1/docker/fnos-resmon}"
REPO_URL="https://gitea.88531.cn/jinghui/fnos-resmon.git"
if ! command -v docker >/dev/null 2>&1; then
echo "❌ 未检测到 Docker,请先安装 Docker"; exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
echo "❌ 未检测到 docker compose"; exit 1
fi
if ! command -v git >/dev/null 2>&1; then
echo "❌ 未检测到 git"; exit 1
fi
# 自动探测 docker 根目录
if [ -d /vol1/1000/HD1/docker ]; then
COMPOSE_ROOT=/vol1/1000/HD1/docker
elif [ -d "$HOME/docker" ]; then
COMPOSE_ROOT="$HOME/docker"
else
COMPOSE_ROOT="$(dirname "$INSTALL_DIR")"
fi
if [ -d "$INSTALL_DIR/.git" ]; then
echo "🔄 检测到已有安装,执行更新..."
cd "$INSTALL_DIR"
git fetch origin main
git reset --hard origin/main
else
echo "📥 克隆项目..."
mkdir -p "$(dirname "$INSTALL_DIR")"
git clone "$REPO_URL" "$INSTALL_DIR"
cd "$INSTALL_DIR"
fi
cat > "$INSTALL_DIR/.env" <<EOF
PORT=$PORT
CONTAINER_NAME=$CONTAINER_NAME
COMPOSE_ROOT=$COMPOSE_ROOT
EOF
echo "🐳 启动/更新容器..."
docker compose -f "$INSTALL_DIR/docker-compose.yml" --env-file "$INSTALL_DIR/.env" up -d --build
echo "⏳ 等待服务就绪..."
for i in $(seq 1 30); do
if curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:$PORT" | grep -q 200; then
echo "✅ 部署完成!访问 http://<NAS IP>:$PORT"
exit 0
fi
sleep 2
done
echo "⚠️ 服务可能未就绪,请检查 docker logs"
exit 1
+1 -1
View File
@@ -1,5 +1,5 @@
appname: fnos-resmon
version: 1.2.4
version: 1.2.6
display_name: 飞牛资源管理器
desc: 飞牛 NAS 资源监视器(CPU/内存/磁盘/网络四页签,读取宿主真实数据)
arch: x86_64