在 VPS 上搭建一体化监控面板:VPS 状态 + One API Token 用量 + 实时模型健康度

起因

VPS 上跑着越来越多服务:One API(LLM 网关)、OpenClaw(AI Agent)、n8n、Docker、k3s、Nginx……每次排查问题都要 SSH 进去敲一堆命令。我需要一个统一的监控面板,能在一个页面上看到:

  • VPS 本身的状态
  • One API 的 Token 消耗(哪个应用在用、哪个模型在烧 Token)
  • 模型的健康度(哪些还活着、哪些已经废弃)

于是有了这个面板。


架构

text

/root/vps-monitor/                    ← Next.js 项目
├── src/app/page.tsx                  ← 主页面(VPS Monitor)
├── src/app/api/
│   ├── vps/route.ts                  ← VPS 状态 API
│   ├── oneapi-tokens/route.ts        ← 累计 Token API
│   ├── oneapi-realtime/route.ts      ← 实时 Token API
│   ├── module-tokens/route.ts        ← 模块别 Token API
│   ├── task-tokens/route.ts          ← 任务×模型 API
│   ├── nvidia-health/route.ts        ← 模型健康度 API
│   ├── openclaw/route.ts             ← OpenClaw 配置读写
│   └── packages/route.ts             ← 包版本 API
├── src/components/
│   ├── monitor-tabs.tsx              ← 标签切换(VPS / Token / Realtime)
│   ├── token-monitor.tsx             ← 累计图表
│   ├── realtime-tokens.tsx           ← 实时视图
│   ├── task-token-view.tsx           ← 任务×模型视图
│   └── nvidia-health.tsx             ← 模型健康度(2 子标签)
└── src/components/ui/card.tsx        ← shadcn/ui 风格 Card

/root/oneapi-token-usage.json         ← 定期更新的 Token 数据
/root/update-oneapi-token-json.sh     ← JSON 更新脚本
/root/one-api/one-api.db              ← One API 的 SQLite

三个主标签

1. VPS Monitor

显示服务器本身的状态:

区块内容
主统计CPU、内存、磁盘、Uptime
使用率条内存、磁盘
网络接口、公开 IP
Tailscale已连接设备
Web 服务所有服务的链接按钮
OpenClaw进程、workspace
OpenClaw 配置编辑器读写 openclaw.json
DSH进程
k3sPods、Services
PM2进程、CPU、内存、重启次数
Docker容器
包版本Node、Python、Docker、k3s 等
Nginxsites
公开端口LISTEN 中的端口

每 5 秒自动刷新。

2. Token Usage

显示累计的 Token 消耗:

区块图表
主统计总请求数、总输入/输出/合计 Token
按应用甜甜圈图
按模型(Top 10)横向柱状图
按日(近 30 天)折线图
应用明细表格

每 60 秒自动刷新。

3. Realtime

显示实时的使用状况:

区块内容
今日统计请求、输入/输出/合计 Token
模块别 Token(近 7 天)饼图
模块别 Token 趋势(近 7 天)折线图
任务×模型柱状图 × 2 + 明细矩阵
模型健康度アクティブ/非アクティブ 2 子标签
最近 24 小时错误表格
最近请求(10 件)表格
当前 One API 渠道表格

每 15 秒自动刷新。


核心脚本

1. VPS 状态报告脚本(/root/vps-report.sh)

生成完整的 VPS 状态报告:

bash

bash /root/vps-report.sh 2>&1 | tee /root/vps-report-$(date +%Y%m%d).txt

输出 15 个维度:系统信息、网络、端口、防火墙、systemd、PM2、Docker、k3s、Nginx、域名、磁盘、workspace、内存、大文件、错误日志。

2. Token 数据更新脚本(/root/update-oneapi-token-json.sh)

从 one-api.db 读取数据,生成 JSON:

bash

bash /root/update-oneapi-token-json.sh

cron 每 5 分钟自动执行。

3. 模型迁移脚本(/root/rename-model-full.sh)

当 NVIDIA 更新模型时,一键迁移:

bash

bash /root/rename-model-full.sh "z-ai/glm-5.3" "z-ai/glm-5.4" "glm-5.4"

同时更新:One API 的 channels.models、channels.name、channels.model_mapping、abilities.model,以及 OpenClaw 的 openclaw.json、各 Agent 的 models.json。


关键设计

One API 的数据来源

Token 消耗数据存在 one-api.db 的 logs 表:

列名含义
token_name应用名(哪个 token 在用)
model_name使用的模型
prompt_tokens输入 Token
completion_tokens输出 Token
created_atUnix 时间戳
type类型(5 = 错误)

模型健康度判定

状态条件颜色
active24 小时内使用过绿
idle24〜72 小时前黄
inactive72 小时以上红

inactive 的模型可能需要重新配置。

数据流

text

one-api.db
    ↓ (Python, cron 5分ごと)
oneapi-token-usage.json
    ↓ (Next.js API)
/api/oneapi-tokens
    ↓ (Recharts)
Token Usage タブ

实时数据是直接查 DB:

text

one-api.db
    ↓ (sqlite3 CLI, 15秒ごと)
/api/oneapi-realtime, /api/module-tokens, /api/task-tokens, /api/nvidia-health
    ↓ (Recharts)
Realtime タブ

踩坑记录

坑 1:page.tsx を正規表現で一括編集したら壊れた

原因:page.tsx は複雑な JSX 構造。正規表現で <div> を置換しようとして、閉じタグの数が合わなくなった。

教训:大きな JSX ファイルは行番号ベースか、手動で編集。<MonitorTabs>{children}</MonitorTabs> のように、入れ子を最小限にする。

坑 2:SQLite のテーブルを無差別に削除して DB を破損させた

原因:FTS5(全文検索)の内部テーブル(*_fts_config、*_fts_data など)を「設定テーブル」と誤認して削除。DB の整合性が壊れた。

教训:

  • *_fts* を含むテーブルは絶対に触らない
  • DB のクリーンアップは公式コマンド(openclaw doctor --fix)に任せる
  • 変更前に必ず integrity_check で検証

坑 3:Allowed models の真のソースは modelPolicy.allow だった

原因:openclaw.json の agents.defaults.models を編集しても反映されない。真のソースは agents.defaults.modelPolicy.allow。

教训:OpenClaw の設定は複数の階層にまたがる。modelPolicy.allow、agents.defaults.models、agents.entries.*.model、models.providers.*.models をすべて同期する必要がある。

坑 4:OpenClaw のモデルカタログが古いまま

原因:openclaw.json を更新しても、OpenClaw 内部の SQLite 状態 DB にキャッシュが残る。

対処:config_machine_state、config_revision_keys、config_health_entries をクリアして再起動。


当前状态

项目状态
VPS Monitor タブ✅ 動作中
Token Usage タブ✅ 動作中
Realtime タブ✅ 動作中
モデル健全性✅ 動作中
タスク×モデル ビュー✅ 動作中
データ更新✅ cron 5分ごと
PM2 常駐✅ vps-monitor(ポート 3003)

未来要做的事

  1. Token 配額の可視化 — 現在は消費量のみ。残り配額も表示したい
  2. アラート通知 — モデルが inactive になったら Telegram 通知
  3. コスト推定 — Token 数から USD 換算
  4. 履歴の長期保存 — 現在は 30 日分のみ。定期的にアーカイブ
  5. マルチ VPS 対応 — 複数の VPS を 1 つのダッシュボードで監視

一句话总结

在 VPS 上用 Next.js + Recharts 搭建监控面板,把服务器状态、Token 消耗、模型健康度集中到一个页面。数据来自 one-api.db 和 VPS 本身,通过 cron + API 定期刷新。最容易踩的坑不是图表,而是 OpenClaw 的多层配置和 SQLite 的 FTS5 内部表。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注