为什么你需要一个免费的服务器探针系统

如果你手里有 3 台以上的 VPS,分散在不同机房和地域,你一定经历过这样的场景:某台服务器突然挂了,你完全不知道,直到客户投诉或者服务被发现已经离线好几个小时。

传统的解决方案无非几种:花钱买 UptimeRobot 之类的商业监控服务,或者自己搭一套 Prometheus + Grafana——前者功能受限,后者需要额外维护一台监控服务器。对于个人开发者和小团队来说,这两种方案都不够优雅。

CF-Server-Monitor 提供了一个更聪明的选择:完全基于 Cloudflare 免费额度运行的多服务器监控系统。不需要自有服务器,不需要付费订阅,面板、API、数据库和实时推送全部跑在 Cloudflare 的边缘网络上。截至目前,这个项目已经在 GitHub 上获得 1,500+ 星标,被大量 VPS 爱好者和小团队采用。

项目概览:CF-Server-Monitor 是什么

CF-Server-Monitor 是一个部署在 Cloudflare Workers 上的轻量级多服务器监控面板,核心技术栈包括:

  • Cloudflare Workers:边缘计算函数,处理 API 请求和 Agent 上报
  • Cloudflare D1:边缘 SQLite 数据库,持久化存储监控数据
  • Durable Objects:有状态对象,通过 WebSocket 实现前端实时推送
  • Vue.js 前端:响应式监控面板和管理后台
  • Go Agent:安装在被监控服务器上的轻量探针

它的设计理念很简单:Agent 单向上报指标到 Worker,Worker 写入 D1 并广播给前端。没有 WebSSH,没有远程命令下发,没有主控通道——这让它比传统探针更安全。

核心功能一览

功能模块 具体能力
实时监控 CPU、GPU、内存、交换分区、磁盘、磁盘 IO、网络流量、连接数、进程数、负载、运行时间
历史数据 7 天历史图表、长时段采样、实时网速、月流量统计与校正
网络质量 电信/联通/移动/BGP 节点延迟与丢包率追踪
多视图面板 条形图、环形图、表格、地图视图,桌面端和移动端自适应
管理后台 服务器增删改查、拖拽排序、隐藏服务器、导入导出、批量操作
跨平台 Agent Linux、Alpine、OpenWrt、群晖 DSM、飞牛 fnOS、FreeBSD、macOS、Windows
实时推送 Durable Objects + WebSocket,Agent 上报后前端即时刷新
告警通知 离线告警、恢复通知、到期提醒、资源负载告警
主题生态 内置主题、主题商店、第三方主题反代与预览
多语言 前端内置中英文切换

为什么选择 Cloudflare Workers + D1

零成本运行

Cloudflare 的免费额度相当慷慨:

  • Workers:每天 10 万次请求
  • D1:每天 500 万行读取、10 万行写入
  • Durable Objects:每天 10 万次请求

CF-Server-Monitor 针对这些额度做了专门优化:默认 60 秒上报间隔可支持约 60 台服务器,改为 120 秒后理论上可翻倍。历史查询采用采样策略,月度数据表自动轮换,配合缓存和限流设计,确保不超出免费额度。

全球边缘计算

Cloudflare 在全球 300+ 城市有边缘节点。Workers 运行在离用户最近的节点上,API 响应延迟极低。D1 数据库同样基于边缘架构,读写操作都在边缘完成,不需要回源到中心服务器。

免维护

没有服务器需要打补丁,没有 Docker 容器需要重启,没有数据库需要备份。Cloudflare 托管了所有基础设施,你只需要关注被监控的服务器本身。

与其他监控工具对比

特性 CF-Server-Monitor UptimeRobot Prometheus + Grafana Netdata
费用 免费(Cloudflare 免费额度) 免费版 50 个监控 免费(需自有服务器) 免费(需自有服务器)
需要自有服务器
服务器指标监控 CPU/内存/磁盘/网络全指标 仅 HTTP 状态码 全指标(需配置) 全指标
实时推送 WebSocket 即时推送 轮询 需额外配置 实时
维护成本 零(Cloudflare 托管) 高(需维护服务器)
离线告警 支持(Telegram/微信/钉钉等) 支持(有限) 需配置 Alertmanager 支持
历史数据 7 天 依赖方案 无限(取决于存储) 有限
安全性 单向上报,无远程通道 N/A 需自行加固 有 WebSSH 风险

对于拥有多台 VPS 的个人开发者和小团队,CF-Server-Monitor 在成本和便利性上有明显优势。如果你需要 PB 级别的历史数据或企业级 SLA,Prometheus + Thanos 可能更合适。

系统架构解析

┌─────────────────┐     POST /update     ┌──────────────────────┐
│  Server Agent   │ ───────────────────> │  Cloudflare Worker   │
│  (Go/Shell/PS)  │                      │  (边缘计算函数)       │
└─────────────────┘                      └──────────┬───────────┘
                                                    │
                                        ┌───────────┼───────────┐
                                        │           │           │
                                   ┌────▼───┐ ┌────▼────┐ ┌───▼────┐
                                   │  D1    │ │Durable  │ │ Vue    │
                                   │ SQLite │ │Objects  │ │前端面板 │
                                   │ 数据库 │ │WebSocket│ │        │
                                   └────────┘ └────┬────┘ └───┬────┘
                                                    │          │
                                               ┌────▼──────────▼───┐
                                               │   浏览器/移动端    │
                                               │   实时数据展示     │
                                               └───────────────────┘

核心数据流:

  1. 在管理后台添加服务器,复制安装命令
  2. 目标服务器安装 Agent,按配置间隔向 Worker 发送指标
  3. Worker 校验 API_SECRET,写入 D1,并通过 Durable Object 广播实时数据
  4. 前台面板、详情页、管理后台和 iOS 小组件读取同一套 API

部署实战:从零搭建监控系统

前置准备

  • 一个 Cloudflare 账户(免费版即可)
  • 一个 GitHub 账户
  • 一个足够复杂的 API_SECRET(同时作为 Agent 上报密钥和初始后台密码)

方式一:Cloudflare Workers 连接 GitHub(推荐)

这是最省心的部署方式,后续更新也方便同步。

第一步:Fork 仓库

访问 CF-Server-Monitor GitHub 仓库,点击 Fork 按钮。

第二步:创建 Worker

  1. 登录 Cloudflare Dashboard
  2. 进入 Workers & Pages
  3. 点击「创建 Worker」
  4. 选择「连接 GitHub 仓库」,导入你 Fork 的仓库

第三步:配置构建

  • 构建命令:npm run build:frontend
  • 部署命令:npx wrangler deploy

第四步:添加环境变量

在 Worker 的 Variables and Secrets 中添加:

变量名 说明
API_SECRET 你的强密码 Agent 上报密钥 + 初始后台密码

第五步:部署

点击部署,等待构建完成。部署成功后你会得到一个 xxx.workers.dev 域名。

方式二:GitHub Actions 自动部署

适合希望完全通过 GitHub 管理部署流程的用户。

  1. Fork 仓库
  2. 在 Cloudflare 创建 D1 数据库(名称建议 server-monitor-db
  3. 复制 Cloudflare Account ID
  4. 创建 Cloudflare API Token(需要 Workers 编辑和 D1 部署权限)
  5. 在 Fork 仓库的 Settings → Secrets → Actions 中添加:
CF_API_TOKEN: 你的 Cloudflare API Token
CF_ACCOUNT_ID: 你的 Cloudflare Account ID
D1_DATABASE_ID: D1 数据库 ID
API_SECRET: 你的强密码
CORS_ALLOWED_ORIGINS: (可选)允许的跨域来源

推送到 main 分支即自动部署。

方式三:一键部署

Deploy to Cloudflare Workers

一键部署适合快速体验,但长期维护建议迁移到前两种方式。

首次使用:登录后台与添加服务器

登录管理后台

部署成功后访问:

https://你的Worker域名/admin#/admin

默认凭据:

  • 用户名:admin
  • 密码:你设置的 API_SECRET

登录后请立即修改管理员用户名和密码。 后台密码可以与 API_SECRET 分离——Agent 上报仍使用环境变量中的 API_SECRET,但后台登录密码可以独立设置。

添加第一台服务器

  1. 进入 /admin#/admin
  2. 在「服务器管理」中填写服务器名称
  3. 点击「添加服务器」
  4. 点击复制按钮,选择目标系统和 Agent 版本
  5. 在目标服务器上执行生成的安装命令

后台生成的命令会自动包含服务器 ID、Worker URL、Secret、上报间隔等参数,比手动拼接更可靠。

被监控服务器配置:Agent 安装与数据上报

Go Agent(推荐)

从 v2.8.3 开始,默认使用独立的 cfsm-agent(Go 语言编写),安装后服务名为 cf-probe

非 root 安装(推荐)

支持 systemd --user 的 Linux 环境,建议使用非 root 用户安装:

# 切换到普通用户
su - youruser

# 执行后台生成的安装命令(示例)
curl -sSL https://your-worker.example.com/install | bash -s -- \
  -id 1 \
  -secret "your-api-secret" \
  -url "https://your-worker.example.com" \
  -interval 60

安装后文件写入 ~/.cf-probe/,使用 systemd --user 管理自启动。

如果希望用户退出登录后服务仍运行:

# root 执行
loginctl enable-linger youruser

root 安装

如果不方便使用非 root 用户,也可以直接 root 安装:

curl -sSL https://your-worker.example.com/install | bash -s -- \
  -id 1 \
  -secret "your-api-secret" \
  -url "https://your-worker.example.com"

Agent 常用参数

参数 说明 默认值
-id 服务器唯一 ID 必填
-secret Agent 上报密钥,需等于 API_SECRET 必填
-url Worker 上报地址 必填
-collect_interval 本机额外采集间隔,0 表示不额外采样 0
-interval 上报间隔(秒) 60
-ct / -cu / -cm / -bd 自定义网络质量测试节点 内置节点
-reset_day 月流量重置日 1
-rx_correction 下行月流量校正(GB)
-tx_correction 上行月流量校正(GB)

支持的平台

  • Linux:Ubuntu、Debian、CentOS、Rocky Linux、AlmaLinux 等主流发行版
  • Alpine Linux:使用 OpenRC 管理
  • OpenWrt:路由器友好
  • 群晖 DSM:NAS 监控
  • 飞牛 fnOS:国产 NAS 系统
  • FreeBSD:BSD 系支持
  • macOS:开发机监控
  • Windows:PowerShell 版本

监控面板功能详解

实时状态展示

前台面板支持四种视图模式:

  • 条形图模式:直观展示各服务器 CPU/内存/磁盘使用率
  • 环形图模式:紧凑展示,适合服务器数量较多的场景
  • 表格模式:详细数据列表,支持排序和筛选
  • 地图模式:基于地理位置展示服务器分布

每种模式都支持桌面端和移动端自适应。

历史数据与图表

  • 7 天历史图表:CPU、内存、磁盘、网络流量的时间序列
  • 长时段采样:历史查询采用采样策略,避免 D1 超额
  • 实时网速:上传/下载速率实时曲线
  • 月流量统计:支持流量重置日和上下行校正

网络质量监控

支持电信、联通、移动、BGP 四网延迟与丢包率追踪。开启三网详情后,首页从 D1 最近 2 小时抽样最多 20 个真实数据点,缓存 5 分钟。

告警通知

在管理后台 → 全局设置 → 通知中配置。支持的通知渠道:

平台 配置方式
Telegram BotFather Bot Token + Chat ID
企业微信 群机器人 Webhook URL
飞书 群机器人 Webhook URL
钉钉 自定义机器人 Webhook URL
Bark https://api.day.app/xxxx/
Server 酱 https://sctapi.ftqq.com/<SendKey>.send
Gotify https://gotify.example.com/message?token=xxx
自定义 Webhook 任意 HTTP POST 端点

告警类型包括:离线告警、恢复通知、到期提醒、资源负载告警。

高级配置

自定义域名

在 Cloudflare Dashboard 中为 Worker 绑定自定义域名:

  1. 进入 Worker 设置 → 触发器
  2. 添加自定义域名(如 monitor.yourdomain.com
  3. Cloudflare 会自动处理 SSL 证书和 DNS 解析

多 Worker 聚合

如果你有多个 Worker 实例(分布在不同 Cloudflare 账户),可以通过 API_BASE 环境变量聚合:

API_BASE: "https://worker1.example.com,https://worker2.example.com"

前台会同时请求多个 Worker 并合并展示。

GitHub Pages 静态前台

项目支持将前台构建为静态站点部署到 GitHub Pages,通过远程 Worker API 获取数据:

# 构建命令
npm run build:github-page

需要在 GitHub Secrets 中配置 API_BASE 指向你的 Worker 地址。

iOS Scriptable 小组件

项目提供 iOS Scriptable 小组件脚本,可在 iPhone 桌面显示单台服务器状态:

  1. 安装 Scriptable App
  2. 新建脚本,粘贴 scripts/ios-scriptable-widget.js 内容
  3. 修改顶部 CONFIG.baseURL 为你的站点地址
  4. 添加 Scriptable 小组件,Parameter 填写服务器 ID

小组件显示在线状态、CPU、内存、磁盘、月流量、实时速率和更新时间。

安全加固

  • Turnstile 验证:在后台安全设置中启用 Cloudflare Turnstile,防止暴力破解
  • CORS 白名单:通过 CORS_ALLOWED_ORIGINS 限制 API 访问来源
  • CSP 策略:自定义内容安全策略,防止 XSS 攻击
  • JWT Secret:独立设置 JWT 签名密钥,与 API_SECRET 分离

性能优化与成本控制

Cloudflare 免费额度优化

CF-Server-Monitor 内置了多项额度友好设计:

  • 月度数据表轮换:历史数据按月分表,避免单表过大
  • 历史查询采样:长时间范围查询自动采样,减少 D1 读行
  • 缓存策略:三网详情数据缓存 5 分钟,减少重复查询
  • 限流设计:API 请求频率限制,防止恶意刷接口

上报间隔调优

场景 建议间隔 可支持服务器数
实时监控(60 秒) -interval 60 ~60 台
常规监控(120 秒) -interval 120 ~120 台
低功耗监控(300 秒) -interval 300 ~300 台

如果你的服务器数量较多,建议将上报间隔调整为 120 秒或更长。对于大多数场景,2 分钟的监控粒度已经足够。

WSS 上报优化

v2.8.4 引入了 WSS(WebSocket Secure)上报能力。Agent 可以在特定时段使用 WSS 上报,提升实时数据推送及时性;非目标时段自动改用 POST,降低 Durable Objects 时长消耗。

局限性与注意事项

免费额度的边界

  • D1 存储上限:免费版 D1 数据库最大 500 MB,长期运行需要定期清理历史数据
  • Workers 请求数:每天 10 万次请求,60 台服务器 × 60 秒间隔 ≈ 86,400 次/天,接近上限
  • Durable Objects:免费版有并发限制,大量前端同时连接可能触发限流

功能限制

  • 历史数据仅 7 天:受限于 D1 免费额度,超过 7 天的数据会被采样或清理
  • 无 WebSSH:出于安全考虑,不提供远程终端功能(这其实是优点)
  • 依赖 Cloudflare:如果 Cloudflare 服务中断,监控系统也会不可用

安全建议

  • 强密码API_SECRET 必须是随机强密码,不要使用默认值
  • 及时改密:首次登录后立即修改管理员用户名和密码
  • 非 root 运行:尽可能使用非 root 用户安装 Agent
  • 定期更新:关注项目更新,及时升级 Worker 和 Agent 版本

总结

CF-Server-Monitor 是目前最优雅的免费服务器监控方案之一。它巧妙地利用了 Cloudflare 的免费额度,将面板、API、数据库和实时推送全部托管在边缘网络上,实现了真正的零成本、零维护。

适合谁:

  • 拥有多台 VPS 的个人开发者
  • 需要轻量监控的小团队
  • 不想维护监控服务器的用户
  • 关注安全性的用户(单向上报,无远程通道)

不适合谁:

  • 需要 PB 级历史数据的企业用户
  • 需要 WebSSH 和远程命令下发的用户
  • 对 SLA 有严格要求的生产环境

如果你正在寻找一个免费、安全、易用的多服务器监控方案,CF-Server-Monitor 值得一试。它可能不会替代企业级的 Prometheus + Grafana 方案,但对于个人开发者和小团队来说,这已经足够好了。

项目地址: https://github.com/huilang-me/CF-Server-Monitor 在线演示: https://demo.huilang.me/


常见问题(FAQ)

1. CF-Server-Monitor 真的完全免费吗?

是的,只要你的监控规模在 Cloudflare 免费额度内(每天 10 万次 Workers 请求、500 万行 D1 读取),就不需要花一分钱。默认 60 秒上报间隔支持约 60 台服务器,改为 120 秒可以翻倍。

2. 数据存在哪里?安全吗?

数据存储在 Cloudflare D1(边缘 SQLite 数据库)中,由 Cloudflare 托管。Agent 采用单向上报设计,不提供 WebSSH 或远程命令下发功能,即使 Agent 被攻破也无法反向控制服务器。

3. 支持哪些操作系统?

支持主流 Linux 发行版(Ubuntu、Debian、CentOS 等)、Alpine Linux、OpenWrt、群晖 DSM、飞牛 fnOS、FreeBSD、macOS 和 Windows。默认使用 Go 语言编写的 Agent,性能更好,跨平台兼容性更强。

4. 如何接收离线告警通知?

在管理后台 → 全局设置 → 通知中配置。支持 Telegram、企业微信、飞书、钉钉、Bark、Server 酱、Gotify 和自定义 Webhook。配置后,服务器离线会立即推送通知。

5. 可以绑定自定义域名吗?

可以。在 Cloudflare Dashboard 的 Worker 设置中添加自定义域名,Cloudflare 会自动处理 SSL 证书和 DNS 解析。也支持将前台部署到 GitHub Pages 并使用自定义域名。