cf-vps-monitor 部署教程:Cloudflare + Supabase 免费搭 VPS 监控面板

摘要
cf-vps-monitor v2.0.3:用 Cloudflare Workers + Supabase 免费搭 VPS 探针与站点监控,含 db-init、Go Agent 安装与告警配置。
cf-vps-monitor 部署教程:Cloudflare + Supabase 免费搭 VPS 监控面板
手里几台 VPS,想盯住「还活着吗」「站点还打得开吗」,又不想每月给监控 SaaS 交钱。cf-vps-monitor 把面板跑在 Cloudflare Workers 上,数据存 Supabase,探针是一个 Go 二进制——整条链路都在免费额度内。
⚠️ 先看这条:本项目在 2026 年 9 月发布了 v2.0.3 重写版,架构从早期的「复制 worker.js 粘贴进 Cloudflare 编辑器 + 绑定 D1」整体换成了 Workers + Durable Objects + Supabase Postgres。你在网上搜到的绝大多数教程(包括本文的旧版)都已经不适用了——照着粘贴 worker.js 是跑不起来的。

一、它是什么,能监控什么
cf-vps-monitor 是一个轻量 VPS 探针面板,各部件分工如下:
部件 | 技术 | 负责什么 |
|---|---|---|
前端 | React + Vite + Radix + Tailwind | 面板界面,作为 Workers 静态资源分发 |
后端 | Hono Worker | API、定时任务、鉴权 |
实时层 | Durable Objects | WebSocket 实时推送、CPU 密集请求卸载 |
数据层 | Supabase Postgres | 配置、历史数据、RLS 与 RPC |
探针 | Go Agent | 在 VPS 上采集指标并上报 |
监控范围比较全:服务器在线状态、CPU、GPU、内存、Swap、磁盘、负载、温度、网络速率、月度流量、账单与到期时间、系统信息、IPv4/IPv6、进程数、TCP/UDP 连接数;此外还有 4 小时粒度的 Ping 监控(ICMP/TCP/HTTP)和多协议站点可用性检测。
告警支持 Telegram、SMTP 邮件、Webhook 三种通道。
二、部署前准备
一个 Cloudflare 账号(免费层即可)
一个 Supabase 账号(免费层即可,用来存数据)
可选:一个托管在 Cloudflare 的域名(不绑也能跑
*.workers.dev)
不需要额外的服务器、不需要 Node 环境——整个面板由 Cloudflare 构建部署。
三、第一步:在 Supabase 准备好数据层
1. 创建项目并抄下两个值
打开 supabase.com/dashboard 创建或选择一个项目
进入 Project Overview,复制 Project URL(形如
https://xxxx.supabase.co)进入 Project Settings → API Keys → Publishable and secret API keys,从 Secret keys 里复制
default那一把(形如sb_secret_...)
⚠️ 不要填 Publishable key 或 anon key,那两把没有写权限,面板会连不上库。 另外,
SUPABASE_SERVICE_ROLE_KEY只是给老部署用的兼容变量,新部署一律用SUPABASE_SECRET_KEY。
2. 创建一把临时 Access Token
初始化数据库(/db-init)时需要它:
新建一个 Token,有效期选 1 小时就够——它只用来跑一次建表
四、第二步:把仓库 Fork 到你自己的 GitHub
推荐 Fork 而不是用一键部署按钮,原因很简单:一键部署自动创建的仓库不保证带更新工作流,后期同步上游会很痛苦。
进入你 Fork 仓库的 Actions 页,选择 Agent Release 工作流 → Run workflow,填一个你自己的版本号,再跑一次
这一步会生成属于你自己仓库的 Agent 安装脚本。跳过它,后面生成的安装命令会指向官方仓库,装出来的 Agent 未必对得上你的版本。
五、第三步:在 Cloudflare 部署 Worker
打开 Cloudflare Dashboard 的 Workers & Pages → 创建应用程序 → Continue with GitHub
授权并选择你刚 Fork 的仓库 → 下一步
展开 高级设置,配置三个变量:
变量名 | 类型 | 值 |
|---|---|---|
| Variable | 第三步拿到的 Project URL |
| Secret | 第三步拿到的 |
| Secret | 后台会话签名密钥,英文/数字至少 32 个字符 |
JWT_SECRET太短会直接部署失败。用密码生成器生成 40 位随机串最省事。
构建命令保持默认
npm run build,部署命令填npm run deploy
如果你在 Cloudflare 里创建的 Worker 名不叫
cf-vps-monitor,必须同步改 Fork 仓库里wrangler.toml的name,两边必须完全一致,否则部署会报错。
点击 部署
命令行部署(可选)
不想用 Dashboard 的话,本地也能推上去。需要 Node.js 24 与 Go,Go 会按 agent/go.mod 自动选择工具链。SUPABASE_URL 属于普通变量,写进 wrangler.toml 的 [vars] 即可,两把密钥走 secret:
六、第四步:初始化数据库 + 创建管理员
这两步不做,面板是空的。
访问
https://你的 Worker 域名/db-init,填入第三步那把 Supabase Access Token 执行建表访问
https://你的 Worker 域名/admin/login,创建第一个管理员账号
以后每次版本更新,都建议再跑一次 /db-init:它只做增量迁移,不会清库,也不会丢节点和有效监控数据(站点图表会从升级后重新采样积累)。
七、第五步:添加节点并部署 Agent
登录后台 → 服务器 → 添加节点(填名称、可选描述)
打开节点的安装命令,选择 Unix 自动检测 或 Windows,复制整条命令
到你的 VPS 上执行,等 Agent 上线
安装器会自动识别系统环境:
系统 | 架构 | 安装方式 |
|---|---|---|
Debian/Ubuntu、RHEL 系 | amd64、arm64 | systemd 系统服务 |
Alpine/Gentoo 等 OpenRC | amd64、arm64 | OpenRC 服务 |
macOS | Intel、Apple Silicon | LaunchDaemon |
FreeBSD | amd64 | 用户模式 |
Windows | x64 | 需要管理员权限,以 LocalService 运行 |
几点值得提前知道:
同一台服务器可以装多个 Agent 实例,每条安装命令都带独立
instance-id,会生成各自的服务名和安装目录没有 systemd/OpenRC 的容器环境会自动降级到用户模式(
nohup);也可以强制用--install-mode userICMP Ping 与部分硬件温度指标取决于系统权限,读不到会显示「不可用」——这是权限问题,不代表整个 Agent 挂了
Agent 不会自动更新,但升级时用后台重新生成的安装命令原地覆盖即可,安装器会重启服务,不用重启 VPS
卸载单个实例:
只有显式执行 --uninstall-all --yes 才会清理本机全部实例,日常卸载不必担心误伤。
八、第六步:配置告警与监控任务
Ping 监控:后台 Ping → 新建任务,支持 ICMP/TCP/HTTP,可指定全部节点或单个节点,并查看延迟历史
站点监控:后台 网站 → 填名称和 URL(支持 HTTP/HTTPS GET、HEAD 以及 TCP),可配期望状态码、超时、间隔、启停
通知:后台 通知 → 配 Telegram、SMTP 邮件或 Webhook,可分别绑定离线、到期、负载、站点异常等事件
一个安全细节:Ping 与网站探测会主动拦截内网、回环、链路本地、组播、保留地址和云元数据地址,所以不用担心把探针当内网扫描器用。
九、免费额度怎么算
这是本文最该抄下来的一段——它不能只看 Workers 请求数。
项目为了省额度做了自适应采样:
有实时观看者时:Agent 约 3 秒采集并上报一次
无人查看时:约 120 秒采样并批量上报
另外三条独立额度需要一起算:Ping 任务数量、访问量、以及 Supabase 与 Durable Objects 各自的额度。官方 README 明确写了:不能仅凭 Worker 请求量保证免费跑 50 台机器,请在后台的 容量估算 里核对实际余量。
十、常见问题排查
现象 | 可能原因 | 处理 |
|---|---|---|
部署失败,提示缺少变量 | 三个变量没配齐 | 回 Cloudflare 高级设置补齐 |
部署失败, | 密钥不足 32 字节 | 重新生成 40 位以上英文/数字串 |
面板能开但读不到数据 | Secret key 填成了 Publishable/anon key | 改用 |
页面空白/报错、找不到表 | 没跑 | 访问 |
忘了管理员账号或密码 | — | 在登录页用当前部署的 Supabase Secret key 重置唯一管理员(该 key 只用于本次校验,不会被保存) |
Agent 上报不了 | 安装脚本指向的仓库无效 | 确认已在 Actions 里跑过 Agent Release 工作流生成自己的脚本 |
温度/ICMP 显示「不可用」 | 系统无传感器或权限不足 | 属预期行为,温度仅支持 Linux 可识别的 CPU/SoC 传感器 |
版本更新后想同步 | — | 后台 |
写在最后
cf-vps-monitor 把「买监控 SaaS」换成了「自己养一块免费面板」:几台 VPS、一个 Cloudflare 账号、一个 Supabase 项目,装完 Agent 打开 Telegram 通知,机器掉线时手机会响——比事后翻日志从容得多。
需要注意的是它迭代很快(v2 直接换了数据层),所以部署前永远以仓库最新 Release 为准,遇到报错先跑一遍 /db-init,八成问题都出在那一步。
