一个基于 Cloudflare Workers + D1 + Durable Objects 的多服务器监控探针系统,支持实时监控、历史数据查看、延迟追踪、地图展示等功能。兼容主流Linux系统,Alpine Linux,OpenWrt,Windows系统。演示地址:https://tz.dashdeep.dpdns.org/
当前版本:V2.7.3.3
<2.7.1 新增了功能,需要升级安装脚本 & 后台升级数据库 才能生效,否则会产生数据库结构错误或者图表显示异常
# Linux
curl -sL https://你的项目.你的子域.workers.dev/install.sh | bash -s install
# Alpine
curl -sL https://你的项目.你的子域.workers.dev/install-alpine.sh | sh -s install
# OpenWrt
curl -sL https://你的项目.你的子域.workers.dev/install-openwrt.sh | sh -s install
<= 2.6.9 版本,使用方式一部署方式,需要在Workers & Pages页面,点击 Settings,修改Build configuration的Deploy command为:npx wrangler deploy --keep-vars,否则会导致API_SECRET丢失。旧key可用通过
# Linux
cat /etc/systemd/system/cf-probe.service
# OpenWrt,Alpine
cat /etc/init.d/cf-probe
# >2.6.9版本
cat /etc/config/cf-probe/config.conf
获取,再重新设置环境变量API_SECRET(注意是设置顶部的变量和密钥),最后再同步数据。
更新记录
-
V2.7.3.3 压缩定时任务4个为2个,避免超出免费额度
-
V2.7.3.2 合并通知告警,其他代码逻辑优化
-
V2.7.3.1 当request.cf返回
cf object not available错误,导致国家/地区代码获取失败,使用request.headers获取作为备选 -
V2.7.3 新增服务器到期提醒功能,调整后台设置页面布局
-
V2.7.2 新增支持多分区磁盘统计功能以及其他优化,增加图文教程
-
V2.7.1 新增国内四线路丢包率监控与历史图表,新增GPU字段与图表展示(GPU暂未测试),后台新增 Cloudflare D1/Workers 每日额度查询功能;
-
V2.7.0 将每日数据清理改为每月1号执行的表轮换任务, 删除旧表将不再扣除D1消耗,前端图表支持查看最长7天的历史数据,优化脚本一键升级功能
-
V2.6.10 修复了方式一部署方式,同步后丢失API_SECRET的问题
-
V2.6.9 修复地图显示问题,重构OpenWrt安装脚本,新增OpenRC服务支持
-
V2.6.8 修复网卡统计误统计非目标网卡流量的问题,修复Alpine环境UDP连接数统计错误,本次更新需要重新安装脚本才能生效
-
v2.6.7 增加了月流量统计校正功能,以及首页流量统计展示
-
v2.6.6 增加上报间隔,Ping方式,流量重置日入库功能
-
V2.6.5 修复了部分系统启动时间获取错误的问题,TCP/UDP上报格式错误导致失败问题,新增详情页面实时网速展示
-
V2.6.4 增加了 月流量统计 功能,升级后请在后台手动点击 升级数据库 来更新数据库结构。不然会导致数据库结构错误,影响正常运行。同时需要在后台设置重置日期,并重新安装脚本。
-
V2.6.3 应大家需求,增加自定义Ping设置
-
V2.6.0 降低了 50% 的D1写入消耗,强烈建议升级,升级后请在后台手动点击 升级数据库 或者 重建数据库 。
-
V2.5.0 增加客户端上报数据后,在不占用D1消耗的情况下,前端WebSocket实时刷新数据
-
V2.4.0 版本主要优化了D1读写占用,使项目消耗大大降低,以及增加了防护避免被刷。
- 📊 实时监控:CPU、GPU、内存、磁盘、网络、进程数、连接数、负载均衡
- 📈 历史图表:支持7天历史数据查看
- 🌍 全球地图:可视化展示服务器分布
- 🔔 离线告警:支持 Telegram 和企业微信通知
- 📱 响应式:支持桌面端和移动端
- 🔄 自动部署:GitHub Actions 一键部署
- 🗺️ 网络质量追踪:国内电信/联通/移动/字节延迟与丢包率监测
- 🔒 服务器隐藏:可设置特定服务器对非登录用户隐藏
↕️ 拖拽排序:后台拖拽调整服务器显示顺序- 🌐 双语支持:支持中文和英文界面自由切换
- 🧪 本地测试:支持本地模拟数据生成,方便开发和测试
- 🔐 Turnstile 验证:集成 Cloudflare Turnstile 人机验证,增强 API 安全性
- 🔑 JWT 认证:登录系统采用 JWT token 认证,支持自定义密钥
- 📉 额度查询:后台可查询 Cloudflare D1 当日读写行数与 Workers 请求量
- ⚡ 实时推送:基于 Durable Objects + WebSocket,探针上报后页面立即刷新,无轮询延迟
方式一:Cloudflare Workers 连接GitHub仓库(推荐使用,方便同步)图文教程 -> https://huilang.me/cf-server-monitor-setup/
点击右上角 Fork 按钮,将项目 Fork 到你的 GitHub 账户。
- 登录 Cloudflare 控制台
- 进入 Workers & Pages
- 点击 Create application
- 选择 Continue with GitHub(第一次使用需要连接 GitHub 账户),选择本项目
- Project Name填写:
cf-server-monitor - Build command 填写:
npm run build:frontend - Deploy command 填写:
npx wrangler deploy --keep-vars - 点击 Deploy,成功会在底部显示
✨ Success! Build completed.
- 在当前Workers & Pages页面,点击 Settings
- 在Variables and secrets找到API_SECRET,点右侧编辑,填写密码(建议使用随机数,不要包含特殊字符比如%),点Deploy保存部署,等待30秒左右部署完成
方式二:GitHub Action 自动部署
点击右上角 Fork 按钮,将项目 Fork 到你的 GitHub 账户。
- 登录 Cloudflare 控制台
- 进入 Workers & Pages → D1 SQL Database
- 点击 Create database
- 数据库名称填写:
server-monitor-db - 点击 Create
- 记录下生成的 Database ID,稍后会用到
方式一:从右侧面板获取
- 打开 Cloudflare Dashboard
- 在右侧面板找到 Account ID
- 复制保存
方式二:从 URL 中获取
- 登录后访问任意 Cloudflare 页面,例如 Workers & Pages
- URL 中
dash.cloudflare.com/之后的那串字符就是 Account ID
- 打开 API Tokens 页面
- 点击 Create Token/创建令牌
- 选择(Edit Cloudflare Workers/编辑 Cloudflare Workers)模板
- 在 Account Resources/帐户资源 选择你的账户
- 点击 Continue to summary/继续以显示摘要→ Create Token/创建令牌
- 复制生成的 Token(只显示一次!)
- 打开你 Fork 的 GitHub 仓库
- 进入 Settings → Secrets and variables → Actions
- 点击 New repository secret,依次添加以下 5 个密钥:
| Secret 名称 | 值 | 说明 |
|---|---|---|
CF_API_TOKEN |
第三步获取的 Token | Cloudflare API 令牌 |
CF_ACCOUNT_ID |
第三步获取的 ID | Cloudflare 账户 ID |
API_USER_NAME |
自定义用户名(非必填) | 管理后台用户名 新版已移除,默认用户名admin |
API_SECRET |
API 认证密钥(必填) | 探针认证密钥 & 默认管理后台密码 建议使用随机密码,不要包含特殊字符比如% |
D1_DATABASE_ID |
第二步获取的 Database ID | D1 数据库 ID |
推送代码到 main 分支即可自动部署:
# 克隆你 Fork 的仓库
git clone https://github.com/你的用户名/CF-Server-Monitor.git
cd CF-Server-Monitor
# 可选:修改配置后提交
git add .
git commit -m "Initial setup"
git push origin main推送后,GitHub Actions 会自动部署。在仓库的 Actions 标签页可查看部署进度。
也可以通过 GitHub Actions 手动触发部署:
- 进入你的 GitHub 仓库页面
- 点击顶部的 Actions 标签
- 在左侧工作流列表中选择 Deploy to Cloudflare Workers
- 点击右侧的 Run workflow 按钮
- 选择分支(默认选择
main) - 点击 Run workflow 开始部署
部署进度可在 Actions 标签页中查看。
方式三:一键部署(比较简单,但不推荐,不方便更新)
新用户点击一键部署
修改API_SECRET,建议使用随机密码,不要包含特殊字符比如%,登录密码在登录后修改,建议和API_SECRET不同。
在build command中填入 npm run build:frontend,其他保持默认
点击部署即可
访问管理后台
部署成功后,访问管理后台:
https://你的项目名.你的子域.workers.dev/admin
- 用户名:默认admin,如果设置了环境变量
API_USER_NAME,则使用该值 - 密码:你设置的
API_SECRET
登录后务必修改用户名和密码,以确保安全。 强烈建议登录密码和探针认证密钥不同。
提示:项目名和子域可以在 Cloudflare Workers & Pages 页面找到。建议绑定域名,避免国内无法访问
添加服务器监控
- 进入管理后台
/admin - 在"服务器名称"输入框填写名称
- 点击 + 添加服务器
- 点击新服务器旁的 📋 按钮复制安装命令
Ubuntu / Debian / CentOS / RHEL / Fedora / Rocky / AlmaLinux 系统
curl -sL https://你的项目.你的子域.workers.dev/install.sh | bash -s install -id=<SERVER_ID> -secret=<SECRET> -url=<WORKER_URL> [-interval=60] [-ping=http] [-ct=xxx] [-cu=xxx] [-cm=xxx] [-bd=xxx] [-reset_day=1] [-rx_correction=N] [-tx_correction=N]Alpine 系统
curl -sL https://你的项目.你的子域.workers.dev/install-alpine.sh | sh -s install -id=<SERVER_ID> -secret=<SECRET> -url=<WORKER_URL> [-interval=60] [-ping=http] [-ct=xxx] [-cu=xxx] [-cm=xxx] [-bd=xxx] [-reset_day=1] [-rx_correction=N] [-tx_correction=N]OpenWrt / LEDE / ImmortalWrt 系统
curl -sL https://你的项目.你的子域.workers.dev/install-openwrt.sh | sh -s install -id=<SERVER_ID> -secret=<SECRET> -url=<WORKER_URL> [-interval=60] [-ping=http] [-ct=xxx] [-cu=xxx] [-cm=xxx] [-bd=xxx] [-reset_day=1] [-rx_correction=N] [-tx_correction=N]对于 Windows 系统,使用 Python 脚本安装探针:
pip install psutil pystray pillow
双击cf-server-monitor.pyw文件即可启动探针。
参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
-id |
服务器唯一标识符(必填) | - |
-secret |
API 认证密钥(必填) | - |
-url |
Worker 上报地址(必填) | - |
-interval |
数据上报间隔(秒) | 60 |
-ping |
Ping 检测类型(http/tcp) |
http |
-ct |
自定义CT测试节点 | 默认节点 |
-cu |
自定义CU测试节点 | 默认节点 |
-cm |
自定义CM测试节点 | 默认节点 |
-bd |
自定义BD测试节点 | 默认节点 |
-reset_day |
流量重置日(1-31) | 1 |
-rx_correction |
下行流量校正(GB,直接设置当月下行数据) | - |
-tx_correction |
上行流量校正(GB,直接设置当月上行数据) | - |
注意:上报间隔越短,数据越实时,但会增加 API 调用和数据库存储。建议根据服务器数量和网络状况选择合适的间隔。
升级 Cloudflare Workers
根据您使用的安装方式,选择对应的升级方法:
由于 Cloudflare Workers 直接连接 GitHub 仓库,升级非常简单:
- 进入您 Fork 的 GitHub 仓库页面
- 点击 Sync fork → Update branch 同步上游更新
- Cloudflare Workers 会自动检测到代码变更并重新部署
或者使用命令行同步:
# 进入本地仓库目录
cd CF-Server-Monitor
# 添加上游仓库(首次需要)
git remote add upstream https://github.com/huilang-me/CF-Server-Monitor.git
# 拉取上游更新
git fetch upstream
# 合并到本地 main 分支
git checkout main
git merge upstream/main
# 推送到您的仓库
git push origin main推送后 Cloudflare Workers 会自动部署最新版本。
与方式一类似,同步上游仓库后推送即可:
- 同步上游仓库(参考方式一的步骤)
- 推送代码后 GitHub Actions 会自动触发部署
- 在仓库的 Actions 标签页查看部署进度
也可以手动触发部署:
- 进入 GitHub 仓库 → Actions → Deploy to Cloudflare Workers
- 点击 Run workflow → 选择分支 → Run workflow
一键部署方式升级较为麻烦,建议重新部署:
- 访问 一键部署页面
- 选择已存在的项目进行更新
- 在 build command 中填入
npm run build:frontend - 点击部署
注意:一键部署方式不方便同步更新,建议迁移到方式一或方式二。
升级探针
当有新版本部署成功后,可以通过以下命令升级探针,升级过程会自动保留原有配置:
# Linux
curl -sL https://你的项目.你的子域.workers.dev/install.sh | bash -s install
# Alpine
curl -sL https://你的项目.你的子域.workers.dev/install-alpine.sh | sh -s install
# OpenWrt
curl -sL https://你的项目.你的子域.workers.dev/install-openwrt.sh | sh -s install为了安全,没有提供自动升级功能,如有需要自行将升级脚本加入服务器定时任务。
比如 crontab -e 中添加以下内容,每天凌晨 0 点执行升级:
# Linux
0 0 * * * curl -sL https://你的项目.你的子域.workers.dev/install.sh | bash -s install卸载探针
# Linux
curl -sL https://你的项目.你的子域.workers.dev/install.sh | bash -s uninstall
# Alpine
curl -sL https://你的项目.你的子域.workers.dev/install-alpine.sh | sh -s uninstall
# OpenWrt
curl -sL https://你的项目.你的子域.workers.dev/install-openwrt.sh | sh -s uninstallWindows 系统
启动cf-server-monitor.pyw后,GUI中关闭自启动(如已开启)。点删除,再删除这个文件即可
安全增强
如需启用 Turnstile 人机验证,可用基本拦截恶意攻击避免额度超出,需在管理后台配置:
- 登录 Cloudflare Turnstile
- 创建站点,获取 Site Key 和 Secret Key
- 在管理后台 → 全局设置中启用 Turnstile 并填入密钥
如需自定义 JWT 密钥:
- 生成一个至少 32 位的随机字符串作为 JWT Secret
- 在管理后台 → 全局设置 → 安全设置中填入 JWT Secret
- 保存后系统将使用自定义密钥进行 token 签名
如需在后台查询 D1 当日读写额度和 Workers 请求量:
- 在 Cloudflare Dashboard右下角复制当前账户的 Account ID
- 在API Tokens 页面创建具备 Account Analytics Read 权限的 Cloudflare API Token
- 在管理后台 → 全局设置 → Cloudflare 设置中填入 Account ID 和 API Token
- 保存后点击 查询 D1 额度 查看 UTC 当日用量与下次重置时间
其他设置
访问 https://你的项目.你的子域.workers.dev/ 查看:
- 卡片视图:服务器状态概览(含实时网速和本月流量)
- 表格视图:详细数据列表
- 地图视图:全球服务器分布
- 过滤器:按国家筛选服务器
点击任意服务器卡片进入详情页:
- 实时 CPU/GPU/内存/磁盘/网络/负载
- 7天历史趋势图
- 鼠标悬停查看具体时间点的数值
- 国内四线路延迟与丢包率追踪
注意:查看1小时以上的历史数据需要登录管理员账户。
管理后台支持自定义 CSS主题
在管理后台的服务器列表中,可以通过拖拽调整服务器的显示顺序
可以将特定服务器设置为对非登录用户隐藏:
- 进入管理后台
/admin - 点击服务器行右侧的 ✏️ 编辑 按钮
- 勾选 Hide from Public 选项
- 点击 保存
管理后台提供数据库维护功能,可在 "Database Management" 标签页中找到:
- 升级数据库:将数据库结构升级到最新版本,适用于旧版本用户升级
- 点击「Upgrade Database」按钮
- 确认升级操作
- 系统会自动执行数据库升级脚本
- 重建数据库:清空并重建整个数据库(
⚠️ 危险操作)- 点击「Rebuild Database」按钮
- 确认重建操作(此操作将删除所有数据)
- 系统会清空并重新初始化数据库
注意:
- 重建数据库是不可逆操作,请确保已备份重要数据
- 升级数据库不会删除现有数据,仅会更新表结构
- 从旧版本升级到包含 GPU/丢包率监控的新版本后,需要先执行升级数据库,再重新安装或升级探针以采集新字段
在管理后台 → 全局设置中配置:
Telegram 告警:
- 创建 Telegram Bot(通过 @BotFather)
- 获取 Bot Token
- 获取 Chat ID(通过 @userinfobot)
- 填入后台设置并开启
企业微信告警:
- 创建群机器人,获取 Webhook URL
- 填入 Bot Token 字段
- Chat ID 留空
定时任务
系统包含以下定时任务(UTC 时区):
| 任务 | 触发时间 | 说明 |
|---|---|---|
| 离线检测 | */1 * * * * |
每分钟检测离线节点并发送告警 |
| 合并任务 | 0 * * * * |
每小时执行,根据日期判断执行:每月1号数据轮换、每月8号清理旧表、每天12:00服务器到期检测 |
项目结构
CF-Server-Monitor/
├── public/
│ ├── cf-server-monitor.pyw # Windows 探针脚本(.pyw 不显示 CMD 窗口)
│ ├── install.sh # 一键安装脚本 - systemd 系统 (Ubuntu/Debian/CentOS)
│ ├── install-alpine.sh # 一键安装脚本 - OpenRC 系统 (Alpine Linux)
│ ├── install-openwrt.sh # 一键安装脚本 - procd 系统 (OpenWrt/LEDE)
│ └── logo.svg # Logo
├── src/
│ ├── index.js # 后端主入口 - 路由分发 + Durable Object 导出
│ ├── database/
│ │ ├── schema.js # 数据库初始化、历史数据存储
│ │ └── updateDatabase.js # 数据库升级处理
│ ├── durable/
│ │ └── MetricsBroadcaster.js # Durable Object:WebSocket 实时推送广播中心
│ ├── middleware/
│ │ └── auth.js # 认证中间件
│ ├── handlers/
│ │ ├── admin.js # 后台管理 API
│ │ ├── dashboard.js # 前台大盘 API
│ │ ├── frontend.js # 前端资源服务
│ │ └── update.js # 数据上报处理 + 广播到 DO
│ ├── services/
│ │ └── notification.js # 通知服务
│ ├── utils/
│ │ ├── cache.js # 缓存工具
│ │ └── settings.js # 设置管理
│ └── frontend/ # Vue 3 前端应用
│ ├── components/ # Vue 组件
│ │ ├── Footer.vue
│ │ ├── ServerCard.vue
│ │ └── TerminalHeader.vue
│ ├── views/ # 页面视图
│ │ ├── Admin.vue
│ │ ├── Dashboard.vue # 首页(接入 WebSocket 实时推送)
│ │ └── ServerDetail.vue # 详情页(接入 WebSocket 实时推送)
│ ├── router/
│ │ └── index.js # Vue Router 配置
│ ├── utils/
│ │ ├── api.js # API 请求封装 + WebSocket 客户端
│ │ └── i18n.js # 国际化配置
│ ├── styles/ # 样式文件
│ │ ├── light.css
│ │ └── main.css
│ ├── App.vue # 根组件
│ └── main.js # 前端入口
├── scripts/
│ └── build.js # 前端构建脚本
├── test/
│ ├── README.md # 测试工具说明
│ └── generate-sql.js # 测试数据生成工具
│ ├── mock-sender.sh # 模拟数据发送脚本(macOS)
├── index.html
├── jsconfig.json # JS 配置
├── package.json
├── vite.config.js # Vite 配置
├── wrangler.toml # 本地测试 wrangler 配置
└── .github/
└── workflows/
└── deploy.yml # GitHub Actions 自动部署
常见问题
Q: 部署后返回API_SECRET is required
如果是部署后丢失API_SECRET,请在Workers & Pages页面,点击 Settings,修改Build configuration的Deploy command为:npx wrangler deploy --keep-vars,重新设置API_SECRET,下次部署会继续保留。旧key可用通过cat /etc/systemd/system/cf-probe.service或者cat /etc/init.d/cf-probe获取。
如果是GitHub Action 自动部署,确保在 GitHub Secrets 中设置了 API_SECRET 密钥。
如果是一键部署,确保在Cloudflare Workers & Pages 中设置了 API_SECRET 密钥。
Q: 探针安装后不显示数据?
检查服务器是否能访问 Worker URL,查看探针日志:journalctl -u cf-probe -f
Q: 如何更换 API_SECRET?
更新 Cloudflare Workers & Pages 中的 API_SECRET,重新部署,并在所有服务器上重新安装探针。如果是GitHub Action 自动部署,需要在 GitHub Secrets 中更新 API_SECRET。
Q: D1 数据库免费额度够用吗?
Cloudflare D1 免费版提供 5GB 存储和 5M 读取行/日、100K 写入行/日,足以支持服务器监控。
写入行:1台服务器一天占用写入行是2.88k,免费写入额度是100k/天,理论上可用支持34台服务器的监控,如果修改上报频率为120秒可用翻倍。
读取行:1台服务器一天占用读行是8k左右,如果开启站点兼容,大概是1.6k,免费读行是5M/天,非常充裕 主要是前端访问消耗的次数,限制了非登录用户1小时以上的查看,只要不被暴力刷额度,绝对够用,如果不放心,可用在后台开启Turnstile人机验证,或者也可以选择仅登录查看
Q: D1 数据库免费额度超出扣费吗?
超出不扣费,只会限制访问,第二天北京时间08:00重置
Q: 遇到其他异常问题怎么办?
可以尝试在后台数据库管理中:
- 升级数据库:尝试修复数据库结构问题
- 重置数据库:清空并重建数据库(
⚠️ 注意:此操作将清除所有数据,请确保已备份重要信息)
Q: 忘记密码?
进入Cloudflare后台,进入D1数据库(server-monitor-db),点击右上角explore data,进入后点击左侧的setting表,双击site_options右侧的value,可以看到用户名和md5加密的密码,password修改成e10adc3949ba59abbe56e057f20f883e,即默认密码123456,右上角点Commit 1 change,弹出的确认框点确认即可。然后访问后台用默认密码登录即可。
本地开发步骤
- Node.js 18+
- npm 或 pnpm
根目录新建 .env 文件,添加环境变量默认API_SECRET:
API_SECRET = "123456"然后执行以下命令进行本地开发:
# 安装依赖
npm install
# 创建 D1 数据库(首次)
npx wrangler d1 create server-monitor-db
# 前端开发模式(热重载)
npm run dev
# 构建前端生产版本
npm run build:frontend
# 部署到 Cloudflare Workers
npm run deploy定时任务
http://localhost:8787/cdn-cgi/handler/scheduled?cron=*/1+*+*+*+* // 每分钟执行一次(离线检测)
http://localhost:8787/cdn-cgi/handler/scheduled?cron=0+*+*+*+* // 每小时执行一次(合并任务)
http://localhost:8787/cdn-cgi/handler/scheduled?cron=*+*+1+*+* // 每月一号执行一次(测试使用)
http://localhost:8787/cdn-cgi/handler/scheduled?cron=*+*+8+*+* // 每月8号执行一次(测试使用)
http://localhost:8787/cdn-cgi/handler/scheduled?cron=0+12+*+*+* // 每天12点执行一次(测试使用)
支持生成本地测试数据,方便在部署前进行功能测试:
- 进入
test目录查看详细说明 - 运行测试数据生成脚本
- 导入生成的 SQL 数据到本地 D1 数据库
- 启动本地开发服务器进行测试
node test/generate-sql.js
wrangler d1 execute server-monitor-db --file=test/mock-data.sql
详细步骤见 test/README.md
项目提供了 api-check.js 接口测试工具,用于验证本地开发环境的 API 接口是否正常工作:
# 默认配置测试
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/config、/api/servers、/api/server、/update等 - 登录流程:登录接口验证
- 已登录接口:隐藏服务器访问、历史数据查询等
- 后台管理:服务器增删改查、设置管理等
选项参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
--base-url |
本地服务地址 | http://localhost:8787 |
--api-secret |
API_SECRET | 123456 |
--admin-user |
管理员用户名 | admin |
--admin-password |
管理员密码 | 使用 API_SECRET |
--timeout |
请求超时时间(ms) | 10000 |
MIT License
- CF-Server-Monitor-Pro 最初借鉴该项目,进行深度二次开发
- Cloudflare Workers
- Vue 3
- Vite
- Chart.js
- Leaflet
- 感谢 LINUX DO 社区的支持与推广









