- TypeScript 80.2%
- JavaScript 10.9%
- CSS 6.5%
- HTML 2.4%
|
|
||
|---|---|---|
| .github/workflows | ||
| config | ||
| docs | ||
| migrations | ||
| public | ||
| scripts | ||
| src | ||
| test | ||
| .dev.vars.example | ||
| .gitignore | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
| wrangler.jsonc | ||
status-page
Cloudflare Worker 上的自建服务可用性页:边缘 HTTP 探测 + 可选心跳上报,KV 快照对外,D1 存历史和故障单。
本地运行
npm install
copy .dev.vars.example .dev.vars
npm run db:migrate:local
npm run dev
浏览器打开 http://127.0.0.1:8787。本地开发不会自动跑 Cron,需要手动触发一轮探测:
curl http://127.0.0.1:8787/cdn-cgi/local/scheduled
配置监控项
编辑 config/monitors.yaml。kind: http 由 Worker Cron 每分钟探测公开 HTTPS;kind: heartbeat 需内网进程上报。
密钥放 Worker Secrets / .dev.vars,不要写进 YAML:
| 变量 | 用途 |
|---|---|
TELEGRAM_BOT_TOKEN |
Telegram Bot token |
TELEGRAM_CHAT_ID |
告警会话 ID |
INGEST_TOKEN |
心跳上报 |
RUN_SECRET |
手动触发探测 |
心跳监控示例(加到 config/monitors.yaml):
- id: nas
name: NAS
kind: heartbeat
staleAfterSec: 180
failThreshold: 3
recoverThreshold: 1
notify: true
上报:
curl -X POST https://status.example.com/api/ingest \
-H "Authorization: Bearer $INGEST_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"monitorId\":\"nas\",\"ok\":true,\"latencyMs\":12}"
一键部署
本机(首次会打开浏览器登录 Cloudflare,并自动创建 KV / D1):
npm install
npm run deploy
完成后 Worker 地址形如 https://status-page.<账号>.workers.dev。告警等密钥可选:
npx wrangler secret put TELEGRAM_BOT_TOKEN
npx wrangler secret put TELEGRAM_CHAT_ID
npx wrangler secret put INGEST_TOKEN
npx wrangler secret put RUN_SECRET
GitHub:把仓库推上去后,在仓库 Secrets 里配置 CLOUDFLARE_API_TOKEN 和 CLOUDFLARE_ACCOUNT_ID。之后推 main 或在 Actions 里点 Run workflow 即会部署。Token 权限需要 Account 的 Workers 编辑、D1 编辑、Account Settings 读取。
公开仓库还可以用 Cloudflare 的 Deploy 按钮,把仓库 URL 填进:
https://deploy.workers.cloudflare.com/?url=<你的 GitHub 仓库 URL>
Workers 建议用 Paid 计划:一次 Cron 要打多个出站请求。免费档子请求上限很容易碰到。
公开接口见 docs/api.md。状态变化(连续失败达到阈值)后会开故障单并(若已配置)发 Telegram。