在 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 | 进程 |
| k3s | Pods、Services |
| PM2 | 进程、CPU、内存、重启次数 |
| Docker | 容器 |
| 包版本 | Node、Python、Docker、k3s 等 |
| Nginx | sites |
| 公开端口 | 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_at | Unix 时间戳 |
type | 类型(5 = 错误) |
模型健康度判定
| 状态 | 条件 | 颜色 |
|---|---|---|
| active | 24 小时内使用过 | 绿 |
| idle | 24〜72 小时前 | 黄 |
| inactive | 72 小时以上 | 红 |
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) |
未来要做的事
- Token 配額の可視化 — 現在は消費量のみ。残り配額も表示したい
- アラート通知 — モデルが
inactiveになったら Telegram 通知 - コスト推定 — Token 数から USD 換算
- 履歴の長期保存 — 現在は 30 日分のみ。定期的にアーカイブ
- マルチ VPS 対応 — 複数の VPS を 1 つのダッシュボードで監視
一句话总结
在 VPS 上用 Next.js + Recharts 搭建监控面板,把服务器状态、Token 消耗、模型健康度集中到一个页面。数据来自 one-api.db 和 VPS 本身,通过 cron + API 定期刷新。最容易踩的坑不是图表,而是 OpenClaw 的多层配置和 SQLite 的 FTS5 内部表。
