| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
基于 Cloudflare Workers、D1 和 Durable Objects 的轻量级多服务器监控面板。
CF-Server-Monitor 是一个部署在 Cloudflare Workers 上的服务器监控系统。服务器端安装 Agent 后会单向上报指标到 Worker,数据写入 D1,并通过 Durable Objects + WebSocket 推送到前端,实现免费托管、低维护的实时监控。
支持主流 Linux 发行版、Alpine Linux、OpenWrt、macOS、群晖 DSM、飞牛 fnOS、Windows 等系统。
高安全性:Agent 仅单向上报指标,不提供 WebSSH、远程命令下发或主控通道;支持非 root 运行,可降低监控组件被利用后的影响范围。
相比传统主控式探针,CF-Server-Monitor 更适合低成本、低维护和安全优先的监控场景:
| 模块 | 能力 |
|---|---|
| 实时监控 | CPU、GPU、内存、交换分区、磁盘、磁盘 IO、网络、连接数、进程数、负载、运行时间 |
| 历史数据 | 7 天历史图表、长时段采样、实时网速、月流量统计与校正 |
| 网络质量 | 电信、联通、移动、BGP 节点延迟与丢包率追踪;三网详情开启时首页从 D1 最近 2 小时抽样最多 20 个真实点并缓存 5 分钟 |
| 多视图前台 | 条形图、环形图、表格、地图视图,支持桌面端和移动端 |
| 管理后台 | 服务器增删改查、拖拽排序、隐藏服务器、导入导出、批量删除、数据库维护 |
| 多系统 Agent | 主流 Linux、Alpine Linux、OpenWrt、群晖 DSM、飞牛 fnOS、FreeBSD、macOS、Windows;默认 Go 版本,保留 Shell/PowerShell 版本 |
| 实时推送 | Durable Objects + WebSocket,Agent 上报后前端即时刷新 |
| 告警通知 | 离线告警、恢复通知、到期提醒、资源负载告警、每日/每周/每月流量报告 |
| 多语言 | 前端内置中文和英文切换;文档提供中文与英文入口 |
| 多站点 | 支持 GitHub Pages 静态前台和多个 Worker API 聚合展示 |
| 小组件 | 提供 iOS Scriptable 小组件脚本,适合移动端快速查看 |
| 安全控制 | API Secret、管理员密码、JWT、Turnstile、CORS、CSP 白名单 |
| 主题生态 | 内置主题、Mikus 模式、主题商店、第三方主题反代与预览 |
| 额度友好 | 按月表轮换、历史查询采样、缓存与限流设计,适配 Cloudflare 免费额度 |
flowchart LR
Agent["Server Agent<br/>Go / Shell / PowerShell"] -->|"POST /update"| Worker["Cloudflare Worker"]
Worker --> D1["Cloudflare D1<br/>servers / settings / history"]
Worker <--> DO["Durable Object<br/>WebSocket broadcast"]
Worker --> Assets["Vue Dashboard<br/>Admin Panel"]
Browser["Browser / Mobile / Widget"] <--> Worker
核心数据流:
近期变化:
Go Agent 的完整更新记录见 cfsm-agent releases。
建议优先使用「Cloudflare Workers 连接 GitHub 仓库」或「GitHub Actions 自动部署」。一键部署适合快速体验,但后续同步更新不够方便。
这是推荐方式,适合希望通过 Cloudflare 控制台自动构建和重新部署的用户。
图文教程:https://huilang.me/cf-server-monitor-setup/
适合希望把部署流程完全托管在 GitHub Actions 的用户。
| Secret | 必填 | 说明 |
|---|---|---|
| CF_API_TOKEN | 是 | Cloudflare API Token |
| CF_ACCOUNT_ID | 是 | Cloudflare Account ID |
| D1_DATABASE_ID | 是 | D1 数据库 ID |
| API_SECRET | 是 | Agent 上报密钥和初始后台密码 |
| CORS_ALLOWED_ORIGINS | 否 | 允许跨域访问 API 的来源,多个用英文逗号分隔 |
推送到 main 分支会自动部署,也可以在 Actions 页面手动运行 Deploy to Cloudflare Workers 工作流。
部署时请确认:
一键部署不方便长期同步上游更新,正式使用更建议迁移到方式一或方式二。
部署成功后访问:
https://你的 Worker 域名/admin#/admin
默认凭据:
| 项目 | 默认值 |
|---|---|
| 用户名 | admin |
| 密码 | API_SECRET |
登录后建议立即修改后台用户名和密码。后台登录密码可以和 API_SECRET 分离;服务器 Agent 上报仍使用 Cloudflare 环境变量中的 API_SECRET。
建议优先使用后台生成的命令,因为它会自动带上服务器 ID、Worker URL、Secret、上报间隔、网络质量节点和网卡等参数。
V2.8.3 起默认使用独立项目 cfsm-agent,安装后服务名为 cf-probe。新增服务器后建议直接从管理后台复制安装命令,后台会按目标系统、服务器 ID、Worker 地址和当前参数生成完整命令。
完整安装路径、日志查看、状态检查和升级行为见 https://github.com/huilang-me/cfsm-agent。
| 参数 | 说明 | 默认值 |
|---|---|---|
| -id | 服务器唯一 ID | 必填 |
| -secret | Agent 上报密钥,需要等于 API_SECRET | 必填 |
| -url | Worker 上报地址 | 必填 |
| -collect_interval | 本机采集间隔;0 表示不额外采样 | 0 |
| -interval | 上报间隔,单位秒 | 60 |
| -ct / -cu / -cm / -bd | 自定义网络质量测试节点,支持 host[:port] | 内置节点 |
| -reset_day | 月流量重置日 | 1 |
| -rx_correction | 下行月流量校正,单位 GB | 空 |
| -tx_correction | 上行月流量校正,单位 GB | 空 |
-collect_interval 控制本机额外采集频率,-interval 控制上报频率。上报越频繁,Workers 请求和 D1 写入越多。
支持 systemd --user 的 Linux 环境建议使用非 root 安装。后台安装命令可选择“当前用户”或“专用 cfsm 用户”:当前用户会直接执行安装,专用用户则会自动创建并切换到 cfsm。文件保存在该用户的 ~/.cf-probe/。
普通用户安装后,如需退出登录仍保持服务运行,请由 root 执行:
loginctl enable-linger 用户名卸载时请选择原来的安装用户。OpenWrt、Alpine/OpenRC、Synology DSM 等不支持 systemd --user 的环境,请使用对应系统命令。
| 变量 | 必填 | 说明 |
|---|---|---|
| API_SECRET | 是 | Agent 上报密钥;也是首次登录后台的默认密码 |
| API_BASE | 否 | 前端请求的 Worker API 地址,多个用英文逗号分隔;用于多 Worker 聚合或前后端分离 |
| CORS_ALLOWED_ORIGINS | 否 | 允许跨域访问 API 的来源,多个用英文逗号分隔 |
项目支持把前台构建到 GitHub Pages,并通过远程 Worker API 聚合数据。相关工作流为 .github/workflows/deploy-github-page.yml。
| Secret | 说明 |
|---|---|
| API_BASE | Worker API 地址,多个用英文逗号分隔 |
| TITLE | 静态前台标题 |
| BACKGROUND_IMAGE | 背景图地址 |
| CSP_STATIC | 额外静态资源 CSP 白名单 |
| CSP_API | 额外 API / WebSocket CSP 白名单 |
构建命令:
npm run build:github-page| 分类 | 主要内容 |
|---|---|
| 站点设置 | 标题、背景、favicon、默认展示模式、默认外观、默认语言、三网详情、公开访问策略 |
| 服务器参数 | HTTP/WSS 上报间隔、采集间隔、Ping 节点、网卡、月流量、价格、到期时间、自动续费 |
| 安全设置 | 管理员账号密码、JWT Secret、Turnstile |
| 通知设置 | 离线告警、到期提醒、资源负载告警、流量报告、测试通知 |
| 外观设置 | 自定义 CSS、<head>、CSP 白名单、Mikus 模式 |
| 数据库管理 | 升级数据库、清空历史数据 |
| Cloudflare 用量 | 查询 D1 行读写和 Workers 请求量 |
项目提供 scripts/ios-scriptable-widget.js,可在 iPhone 桌面显示单台服务器状态。
使用方式:
小组件会显示在线状态、CPU、内存、磁盘、月流量、实时上下行速率和更新时间。iOS 会按系统策略决定实际刷新频率。
在管理后台 -> 全局设置 -> 通知 中配置。通知分为“内置渠道”和“自定义 Webhook”两种渠道;选择自定义 Webhook 后,后端只会发送 Webhook,不会再调用内置渠道。
内置渠道通过 Bot Token 内容自动识别平台。
| 平台 | Bot Token 填写方式 | Chat ID |
|---|---|---|
| Telegram | BotFather 创建的 Bot Token | 用户、群组或频道 ID |
| 企业微信 | 群机器人 Webhook URL | 留空 |
| 飞书 | 群机器人 Webhook URL | 留空 |
| 钉钉 | 自定义机器人 Webhook URL | 留空 |
| OneBot / QQ | onebot:http://host/send_private_msg?... 或 send_group_msg | 用户 ID 或群 ID |
| Bark | https://api.day.app/xxxx/ 或 bark:https://example.com/xxxx/ | 留空 |
| Server 酱 | https://sctapi.ftqq.com/<SendKey>.send 或 server:https://example.com/<SendKey>.send | 留空 |
| WxPusher | https://wxpusher.zjiecode.com/api/send/message/[SPT_xxx]/Hello | 留空 |
| Gotify | https://gotify.example.com/message?token=xxx | 留空 |
自定义 Webhook 支持 GET 和 POST:
默认 Webhook 参数:
{
"title": "{{emoji}} {{event}}",
"content": "{{notification}}"
}默认通知模板:
{{emoji}}【CF Server Monitor】{{event}}
{{message}}
{{time}}
可用模板变量:
| 变量 | 说明 |
|---|---|
| {{emoji}} | 事件图标:恢复/测试为 ✅,离线/告警为 ❌,到期/混合状态为 ⚠️ |
| {{event}} | 事件名称,例如“节点离线告警”“资源负载恢复” |
| {{client}} / {{clients}} | 本次通知涉及的服务器名称,多个服务器用逗号连接 |
| {{count}} | 本次通知涉及的服务器数量;默认模板不显示,但可自定义加入 |
| {{message}} | 通知详情列表 |
| {{time}} | 按通知时区格式化的发送时间 |
| {{notification}} | 应用通知模板后的完整内容,通常用于 Webhook 的 content |
| {{title}} | 固定标题 💌 Cloudflare Server Monitor |
支持的告警类型:
配置后请先点击发送测试通知,再保存配置。
可在后台启用 Cloudflare Turnstile,用于降低公开 API 和登录入口被刷的风险。多站点模式下,如果多个站点都启用 Turnstile,请保持 Site Key 一致。
GitHub OAuth 配置和绑定结果与其他站点配置一样保存在 D1 的 site_options 中,不需要升级数据库结构。Client Secret 不会通过后台设置读取接口返回;再次保存时留空即可保留原值。重新绑定必须处于管理员登录状态,建议保留账号密码登录作为应急入口。
默认建议仅同源访问。如果需要独立前台或多站点聚合,在 CORS_ALLOWED_ORIGINS 中加入可信来源。
项目默认启用较保守的 Content Security Policy。第三方背景图、外部 CSS/JS、字体、图片和 WebSocket/API 域名需要加入后台 CSP 白名单后才会加载。
内置允许的常见来源包括 Cloudflare Turnstile、Cloudflare Analytics、Google Fonts、GitHub Raw 和若干公开 API。添加第三方脚本前请先确认来源可信。
项目内置默认主题,并支持:
第三方主题只反代主题仓库中的 index.html 与 assets/,管理后台仍使用内置主题。开发自定义主题请参考 theme-develop.md。
如果通过 Fork 部署,同步上游仓库即可触发重新部署:
一键部署方式建议重新部署到同一个项目,或迁移到 Fork + GitHub / Cloudflare 自动部署模式。
Go 版本 Agent 会保留原配置,直接执行安装命令即可升级。
Linux / OpenWrt / Synology DSM / FreeBSD / macOS:
curl -fsSL https://raw.githubusercontent.com/huilang-me/cfsm-agent/main/install.sh | sh -s -- installWindows 管理员 PowerShell:
$script = "$env:TEMP\install-cf-probe.ps1"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/huilang-me/cfsm-agent/main/install.ps1" -OutFile $script -UseBasicParsing
PowerShell -ExecutionPolicy Bypass -File $script installGo 版本:
curl -fsSL https://raw.githubusercontent.com/huilang-me/cfsm-agent/main/install.sh | sh -s -- uninstall旧 Shell / PowerShell 版本已不再维护,下面命令仅用于清理历史 Shell / PowerShell 安装。请按当初安装时使用的系统脚本选择对应卸载命令;如果当前运行的是 Go Agent,请使用上面的 Go 卸载命令。
| 旧版系统脚本 | 卸载命令 |
|---|---|
| Linux / systemd | curl -sL https://你的 Worker 域名/install.sh | bash -s uninstall |
| Alpine / OpenRC | curl -sL https://你的 Worker 域名/install-alpine.sh | sh -s uninstall |
| OpenWrt / procd | curl -sL https://你的 Worker 域名/install-openwrt.sh | sh -s uninstall |
| macOS | curl -sL https://你的 Worker 域名/install-mac.sh | sudo bash -s uninstall |
| Synology DSM | curl -sL https://你的 Worker 域名/install-synology.sh | bash -s uninstall |
Windows 旧 PowerShell 版本:
irm https://你的 Worker 域名/cf-server-monitor.ps1 -OutFile cf-server-monitor.ps1
powershell -ExecutionPolicy Bypass -File .\cf-server-monitor.ps1 uninstallGo 版本和旧 Shell / PowerShell 版本卸载脚本只清理各自安装的服务和文件。如果曾经从 Shell / PowerShell 切换到 Go,或反向切换过,请分别执行对应版本的卸载命令,避免残留旧服务、定时任务或配置文件。
后台 -> Database Management 提供:
从旧版本升级到包含 GPU、磁盘 IO、丢包率或新历史结构的版本后,如果页面提示数据库字段缺失,请先执行升级数据库,再升级 Agent。
wrangler.toml 中包含两个 Cron:
| Cron | 说明 |
|---|---|
| */1 * * * * | 每分钟检测离线节点、资源告警 |
| 0 * * * * | 每小时执行合并任务,包括月表轮换、旧表清理,并按通知时区执行到期检测和流量报告 |
# 安装依赖
npm install
# 首次创建 D1 数据库
npx wrangler d1 create server-monitor-db
# 启动本地 Worker,默认 https://localhost:8787
npm run dev
# 单独启动前端 Vite,默认 http://localhost:5173
npm run dev:frontend
# 构建前端
npm run build:frontend
# 部署到 Cloudflare Workers
npm run deploy
# 测试历史查询
npm run test:history-query
# 测试 Agent 配置下发
npm run test:agent-config本地 .env 至少需要:
API_SECRET=123456node test/generate-sql.js
wrangler d1 execute server-monitor-db --file=test/mock-data.sql更多本地测试说明见 test/README.md。
https://localhost:8787/cdn-cgi/handler/scheduled?cron=*/1+*+*+*+* // 每分钟执行一次(离线检测) https://localhost:8787/cdn-cgi/handler/scheduled?cron=0+*+*+*+* // 每小时执行一次(合并任务) https://localhost:8787/cdn-cgi/handler/scheduled?cron=0+0+*+*+0 // 每周执行一次(测试使用) https://localhost:8787/cdn-cgi/handler/scheduled?cron=0+12+*+*+* // 每天12点执行一次(测试使用)
node test/api-check.js
node test/api-check.js --base-url=http://localhost:8787 --api-secret=123456
node test/api-check.js --help完整接口说明见 API.md。
CF-Server-Monitor/
├── public/ # 安装脚本、系统图标、旗帜、静态资源
├── scripts/ # 构建脚本、GitHub Pages 构建、iOS 小组件
├── src/
│ ├── database/ # D1 表结构、索引、迁移
│ ├── durable/ # Durable Object 实时广播
│ ├── frontend/ # Vue 3 前台与管理后台
│ ├── handlers/ # Worker 路由处理
│ ├── middleware/ # 鉴权中间件
│ ├── services/ # 通知服务
│ └── utils/ # 缓存、CORS、CSP、指标处理、版本检查
├── test/ # 本地测试和模拟数据工具
├── API.md # REST / WebSocket API 文档
├── theme-develop.md # 第三方主题开发文档
├── wrangler.toml # 本地 Wrangler 配置
└── version.json # Worker / Agent 版本
说明 Worker 没有读取到环境变量。请在 Cloudflare Workers & Pages 的 Variables and Secrets 中删除旧值后重新添加 API_SECRET,保存并等待重新部署完成。
目前Cloudflare版本原因,可能需要先改动值保存一次,再改回去触发重新部署。
先确认服务器可以访问 Worker URL。如需开启调试,可在安装参数后追加 -debug=1。不同系统的日志查看命令不固定,请参考 cfsm-agent 文档 中对应系统的状态与日志说明。
排查完成后移除 debug 参数并重新安装,避免日志持续增大。
在 Cloudflare 中修改 API_SECRET,重新部署 Worker,然后在所有服务器上重新复制并执行安装命令。使用 GitHub Actions 部署时,也要同步更新 GitHub Secret。
默认 60 秒上报间隔按约 60 台服务器设计;改为 120 秒后可以进一步降低写入。读取主要来自前端访问和历史查询,项目已通过缓存、采样和登录限制降低消耗。实际额度以 Cloudflare 控制台显示为准。
通常是 CSP 拦截了第三方图片资源。进入管理后台 -> 外观设置 -> CSP 静态文件域名白名单,添加背景图所在域名的 origin,例如背景图地址是 https://cdn.example.com/path/bg.webp,只填写 https://cdn.example.com。
如果背景图地址会跳转或经过 CDN 重定向,需要打开浏览器开发者工具查看最终加载的图片地址,并把最终地址对应的域名加入白名单。修改后保存配置并刷新页面。
进入 Cloudflare D1 数据库 server-monitor-db,打开 setting 表,编辑 site_options 的 password 字段。旧版 MD5 兼容值 e10adc3949ba59abbe56e057f20f883e 对应密码 123456,保存后可用该密码登录,再到后台重新设置强密码。
建议绑定自定义域名到 Worker。无法绑定时,可临时通过 hosts 指向可用的 Cloudflare CDN IP:
echo <CF_CDN_IP> <你的探针域名> | sudo tee -a /etc/hosts检查服务器是否启用了代理。OpenWrt / 软路由环境中,部分代理插件可能影响延迟测试,可关闭代理或更换透明代理方案后再测试。
前端会并列展示港澳台和国家/地区信息。地图基于中华人民共和国自然资源部标准地图制作,审图号:GS(2023)2767 号。
深色风格 浅色风格如果这个项目对你有帮助,欢迎通过以下方式支持后续维护。
MIT License
| Back | FazBrowse Home | New Git URL |