banner
约 2,400 字
8 分钟

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

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 面板实拍:上方为服务器实时指标,下方为站点可用性列表
cf-vps-monitor 面板实拍:上方为服务器实时指标,下方为站点可用性列表

一、它是什么,能监控什么

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. 创建项目并抄下两个值

  1. 打开 supabase.com/dashboard 创建或选择一个项目

  2. 进入 Project Overview,复制 Project URL(形如 https://xxxx.supabase.co

  3. 进入 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)时需要它:

  1. 打开 supabase.com/dashboard/account/tokens

  2. 新建一个 Token,有效期选 1 小时就够——它只用来跑一次建表

四、第二步:把仓库 Fork 到你自己的 GitHub

推荐 Fork 而不是用一键部署按钮,原因很简单:一键部署自动创建的仓库不保证带更新工作流,后期同步上游会很痛苦。

  1. Fork kadidalax/cf-vps-monitor

  2. 进入你 Fork 仓库的 Actions 页,选择 Agent Release 工作流 → Run workflow,填一个你自己的版本号,再跑一次

这一步会生成属于你自己仓库的 Agent 安装脚本。跳过它,后面生成的安装命令会指向官方仓库,装出来的 Agent 未必对得上你的版本。

五、第三步:在 Cloudflare 部署 Worker

  1. 打开 Cloudflare Dashboard 的 Workers & Pages创建应用程序Continue with GitHub

  2. 授权并选择你刚 Fork 的仓库 → 下一步

  3. 展开 高级设置,配置三个变量:

变量名

类型

SUPABASE_URL

Variable

第三步拿到的 Project URL

SUPABASE_SECRET_KEY

Secret

第三步拿到的 sb_secret_...

JWT_SECRET

Secret

后台会话签名密钥,英文/数字至少 32 个字符

JWT_SECRET 太短会直接部署失败。用密码生成器生成 40 位随机串最省事。

  1. 构建命令保持默认 npm run build部署命令npm run deploy

如果你在 Cloudflare 里创建的 Worker 名不叫 cf-vps-monitor,必须同步改 Fork 仓库里 wrangler.tomlname,两边必须完全一致,否则部署会报错。

  1. 点击 部署

命令行部署(可选)

不想用 Dashboard 的话,本地也能推上去。需要 Node.js 24 与 Go,Go 会按 agent/go.mod 自动选择工具链。SUPABASE_URL 属于普通变量,写进 wrangler.toml[vars] 即可,两把密钥走 secret:

bash
npm ci
npm run build
npx wrangler login
npx wrangler secret put SUPABASE_SECRET_KEY
npx wrangler secret put JWT_SECRET
npm run deploy

六、第四步:初始化数据库 + 创建管理员

这两步不做,面板是空的。

  1. 访问 https://你的 Worker 域名/db-init,填入第三步那把 Supabase Access Token 执行建表

  2. 访问 https://你的 Worker 域名/admin/login,创建第一个管理员账号

以后每次版本更新,都建议再跑一次 /db-init:它只做增量迁移,不会清库,也不会丢节点和有效监控数据(站点图表会从升级后重新采样积累)。

七、第五步:添加节点并部署 Agent

  1. 登录后台 → 服务器 → 添加节点(填名称、可选描述)

  2. 打开节点的安装命令,选择 Unix 自动检测Windows,复制整条命令

  3. 到你的 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 user

  • ICMP Ping 与部分硬件温度指标取决于系统权限,读不到会显示「不可用」——这是权限问题,不代表整个 Agent 挂了

  • Agent 不会自动更新,但升级时用后台重新生成的安装命令原地覆盖即可,安装器会重启服务,不用重启 VPS

卸载单个实例:

bash
wget -qO- 'https://raw.githubusercontent.com/kadidalax/cf-vps-monitor/refs/heads/main/agent/install.sh' | sh -s -- --uninstall -i 实例ID

只有显式执行 --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 高级设置补齐 SUPABASE_URLSUPABASE_SECRET_KEYJWT_SECRET

部署失败,JWT_SECRET 报错

密钥不足 32 字节

重新生成 40 位以上英文/数字串

面板能开但读不到数据

Secret key 填成了 Publishable/anon key

改用 sb_secret_ 开头的 Secret key

页面空白/报错、找不到表

没跑 /db-init

访问 /db-init 执行建表或增量迁移

忘了管理员账号或密码

在登录页用当前部署的 Supabase Secret key 重置唯一管理员(该 key 只用于本次校验,不会被保存)

Agent 上报不了

安装脚本指向的仓库无效

确认已在 Actions 里跑过 Agent Release 工作流生成自己的脚本

温度/ICMP 显示「不可用」

系统无传感器或权限不足

属预期行为,温度仅支持 Linux 可识别的 CPU/SoC 传感器

版本更新后想同步

后台 关于 → 版本更新 填你的 Fork 地址,之后走 GitHub 的 Sync fork → Update branch,push 会自动触发 Cloudflare 构建

写在最后

cf-vps-monitor 把「买监控 SaaS」换成了「自己养一块免费面板」:几台 VPS、一个 Cloudflare 账号、一个 Supabase 项目,装完 Agent 打开 Telegram 通知,机器掉线时手机会响——比事后翻日志从容得多。

需要注意的是它迭代很快(v2 直接换了数据层),所以部署前永远以仓库最新 Release 为准,遇到报错先跑一遍 /db-init,八成问题都出在那一步。

END