PerfectoCayabyab/beacon
GitHub: PerfectoCayabyab/beacon
Beacon 是一个基于 Next.js 和 Supabase 构建的开源运行时间监控与状态页 SaaS 应用,解决服务可用性追踪和故障透明展示问题。
Stars: 0 | Forks: 0
# Beacon — 运行时间监控与状态页
这是一个全栈 SaaS 应用,支持按计划监控您的 URL,记录状态和响应时间,自动追踪故障事件,并为您生成可分享的公开**状态页**。基于 **Next.js 16 (App Router)**、**Supabase** (Postgres + Auth + RLS) 和 **Vercel Cron** 构建。

由 [Perfecto II Cayabyab](https://perfectocayabyab.com/) 与 [Storefront Copilot](https://github.com/PerfectoCayabyab/storefront-copilot) 作为其第二款 SaaS 项目共同开发 —— 这是一个刻意选择的 AI 电商应用所不具备的不同领域(DevOps 监控),它补充了那些在多租户数据库上运行的**定时后台任务**以及**无需认证的公开页面**。
## 功能
- **添加监控**(名称 + URL),Beacon 便会自动开始检查。
- **定时检查**通过 Vercel Cron 每 5 分钟运行一次 —— 每次检查都会记录 HTTP 状态、响应时间以及任何错误。
- **自动事件追踪** —— 一旦检查失败即刻开启事件记录;当 endpoint 恢复正常时会自动解决。提供每个监控的完整事件历史。
- 每个监控的**响应时间图表**和正常运行时间百分比(基于 Recharts)。
- **立即检查**支持按需即时检查(无需等待 cron 任务)。
- 位于 `/status/{slug}` 的**公开状态页** —— 将任意监控设为公开,即可分享实时状态页,无需登录。
## 架构
- **基于行级安全 (RLS) 的多租户架构。** 每一张表(`monitors`、`checks`、`incidents`、`status_pages`)均通过 `auth.uid()` 进行权限隔离。公开状态页通过针对 `is_public` 监控的**公开读取 RLS 策略**实现 —— 读取路径中无需使用 service-role key。
- **单一检查流水线,两种调用方。** `recordCheck()` 执行 HTTP 检查,存储结果,并推进事件状态机。**“立即检查”**按钮使用受用户 RLS 限制的 session client 调用它;而 **cron** 则使用 service-role client 调用它,以便遍历所有租户。同一套代码,不同的权限。
- **纯粹且经过测试的核心逻辑。** 检查评估、事件状态机、uptime 计算以及调度逻辑作为纯函数存在于 `src/lib/monitor.ts` 中,由 `scripts/test-monitor.ts` 进行覆盖测试(包含 19 个断言,可通过 `npx tsx scripts/test-monitor.ts` 运行)。
- **Next.js 16 规范。** 中间件为 `src/proxy.ts`;路由 handler 使用 `await cookies()`/`params`。Dashboard 和状态页路由均设为 `force-dynamic`。
- **Cron 安全性。** `/api/cron/check` 需要 `Authorization: Bearer $CRON_SECRET`;Vercel Cron 会自动发送此请求头。
## 技术栈
Next.js 16 · React 19 · TypeScript · Tailwind CSS v4 · Supabase (`@supabase/ssr`, Postgres, Auth, RLS) · Recharts · Vercel Cron
## 本地开发
```
npm install
cp .env.example .env.local # fill in your Supabase keys (see below)
npm run dev
npx tsx scripts/test-monitor.ts # run the pure-logic tests (19 assertions)
```
## 部署(Supabase + Vercel,免费版)
1. **创建一个 Supabase 项目**,并在 SQL 编辑器中运行 [`supabase/migrations/0001_init.sql`](supabase/migrations/0001_init.sql)(用于创建数据表和 RLS 策略)。
2. **环境变量**(Supabase → Settings → API):
- `NEXT_PUBLIC_SUPABASE_URL`、`NEXT_PUBLIC_SUPABASE_ANON_KEY`
- `SUPABASE_SERVICE_ROLE_KEY` — **仅**由 cron 用于跨租户检查
- `CRON_SECRET` — 任意随机字符串
3. **部署到 Vercel** 并添加相同的环境变量。
4. **设置定时检查。** Vercel 的 Hobby(免费)计划仅允许 cron 任务**每天运行一次**,因此:
- `vercel.json` 注册了一个每日兜底检查任务(`0 9 * * *`)—— Vercel 会自动注入 `Authorization: Bearer $CRON_SECRET`。
- 若要在免费版上实现真正的约 5 分钟间隔监控,可以通过 **GitHub Actions** 工作流([`.github/workflows/monitor.yml`](.github/workflows/monitor.yml))每 5 分钟 ping 一次 endpoint。请添加两个仓库密钥:`BEACON_CRON_URL`(`https://.vercel.app/api/cron/check`)和 `CRON_SECRET`(与 Vercel 中的值保持一致)。如果您使用的是 Vercel Pro,只需直接修改 `vercel.json` 中的计划任务频率即可。
5. 注册账号,添加一个监控,点击 **立即检查**,并分享您的 `/status/{slug}` 页面。
## 许可证
MIT — 查看 [LICENSE](./LICENSE)。
标签:SaaS, Supabase, Vercel Cron, 可用性监控, 状态页, 自动化攻击, 运维监控