零成本打造全网服务监控:基于GitHub Actions的Upptime

为什么选择Upptime?

作为个人开发者,我常遇到这类困扰:需要同时监控十几个自建服务(NAS、博客、API接口等),但商业监控工具不付费不好用,比如不开放自定义状态页(如 UptimeRobot)。自建方案又得操心服务器维护,直到发现利用 GitHub 的开源方案 Upptime

这套方案巧妙利用三个GitHub免费服务:

  1. Actions:通过全球微软服务器执行拨测
  2. Issues:自动生成故障 Issues,包含发生和解决时间
  3. Pages:实时更新可视化状态面板

运作原理简析

graph LR
    A[定时任务] -->|GitHub Actions| B(全球多个监测节点)
    B --> C{访问成功率检测}
    C -->|正常| D[更新数据存档]
    C -->|异常| E[创建故障Issue]
    D & E --> F[生成状态网页]

一、搭建流程

1.1 Fork仓库

  1. 创建模板库
    • Fork Upptime仓库
    • 输入仓库名称(如website-status
    • 关键步骤:勾选 ✅ Include all branches
    • 点击 Create repository from template

1.2 配置密钥

  1. 生成 Personal Access Token 访问令牌

    • 登录 GitHub → 点击右上角头像 → Settings → Developer settings → Personal access tokens → Tokens (classic)

    • 点击 Generate new token → 选择 Generate new token (classic)

    • 填写参数:

      1
      2
      Note: upptime  
      Select scopes: ✅ repo(全选) + ✅ workflow
    • 生成后立即复制token(页面关闭后不可查看)

    PersonalAccessToken.png

  2. 填入仓库密钥

    • 进入 Fork 的 Upptime仓库 → Settings → Secrets and variables → Actions

    • 点击 New repository secret → 填写:

      1
      2
      Name: GH_PAT
      Value: 粘贴复制的token
    • 点击 Add secret 完成配置

    Addsecret.png

二、自定义域名配置(不需要自定义可以跳过)

2.1 绑定域名到仓库

  1. 设置 GitHub Pages 域名
    • 进入仓库 → Settings → Pages → Custom domain
    • 输入你的域名(如 status.example.com),点击 Save

2.2 配置DNS解析

IPv4地址(A记录) 任选以下一个IP地址:

1
2
3
4
185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153

IPv6地址(AAAA记录)任选以下一个IP地址:

1
2
3
4
2606:50c0:8000::153
2606:50c0:8001::153
2606:50c0:8002::153
2606:50c0:8003::153

2.3 启用HTTPS

  1. 等待DNS解析生效,大概十分钟以内
  2. 强制开启HTTPS
    • 返回仓库 → Settings → Pages → ✅ Enforce HTTPS

Github 官方参考https://docs.github.com/zh/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site

三、配置监控参数

3.1 编辑配置文件

  1. 进入仓库 → 点击文件 .upptimerc.yml
  2. 点击右上角铅笔图标 ✏️ Edit file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# ==== 必填参数 ====
owner: Iuleoo # 你的GitHub用户名
repo: Upptime # 当前仓库名称

# 注意代码的缩进让
sites: # 监控站点列表(缩进必须对齐)
- name: Google # 监控显示名称
url: https://www.google.com # 监控地址
- name: Wikipedia
url: https://zh.wikipedia.org
- name: Cloudflare DNS
url: 1.1.1.1
port: 53 # 非HTTP协议需指定端口
check: "tcp-ping" # TCP协议检测方式,监测端口是否可用

# ==== 隐藏URL ====
# 如果您不想公开显示地址,可以添加 Actions secrets and variables
# 例如下面,创建时Name填写为Mirrors,Secret填写为 https://www.baidu.com,如此,下面的就是监控百度
- name: Mirrors
url: $MIRRORS # 使用环境变量获取监测服务的地址

# ==== 网页配置 ====
status-website:
# 添加自定义域名,若没有域名请删除 cname 行
# 若未使用自定义域名,请取消注释 baseUrl 行并在该处填写您的仓库名称

cname: upptime.yayal.cc # 自定义域名(无域名则删除此行)
# baseUrl: /your-repo-name # 未用域名时取消注释此项
logoUrl: https://raw.githubusercontent.com/upptime/upptime.js.org/master/static/img/icon.svg # Logo链接
name: Upptime监控 # 网页标题
introTitle: "**服务状态看板**" # 支持Markdown
introMessage: 这是[**YAYAL**](https://www.yayal.cc/)的服务状态页面 # 网页简介
navbar:
- title: 状态页
href: /
- title: GitHub
href: https://github.com/$OWNER/$REPO

# Upptime 的功能不仅限于监控,还可设置通知提醒、分配事务处理等
# 完整配置说明详见官方文档: https://upptime.js.org/docs/configuration

3.2 提交修改

  • 滚动至页面底部 → 点击绿色按钮 ✅ Commit changes
  • 系统将自动触发 GitHub Actions 部署

四、启用GitHub Actions

一般情况下,修改 .upptimerc.yml 后,GitHub Actions 会自动触发监控工作流,约1分钟内可在仓库的 Actions 标签页查看运行状态(黄圈为执行中,绿勾为成功,红叉为失败)。若出现失败,需重点检查 YAML 文件格式(缩进对齐、冒号后空格)。

成功运行后,访问配置的域名验证监控状态,仓库 README 将自动更新延迟数据。首次部署需等待 5-10 分钟生成状态页,持续异常可使用 YAML 验证工具排查语法错误。

五、汉化配置

把下面内容粘贴到``.upptimerc.yml`最下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
i18n:
activeIncidents: 当前事件
allSystemsOperational: 所有系统运行正常
incidentReport: "事件 #$NUMBER 追踪 →"
activeIncidentSummary: Opened at $DATE 更新 $POSTS 动态
incidentTitle: 事件 $NUMBER 详情
incidentDetails: 事件追踪
incidentFixed: 已解决
incidentOngoing: 处理中
incidentOpenedAt: 发生时间
incidentClosedAt: 解决时间
incidentViewOnGitHub: 前往 GitHub 关注动态
incidentCommentSummary: $DATE $AUTHOR 发布
incidentBack: 查看所有事件
pastIncidents: 已解决事件
pastIncidentsResolved: $MINUTES 分钟解决,产生 $POSTS 条记录
liveStatus: 服务状态看板
overallUptime: "服务可用率: $UPTIME"
overallUptimeTitle: 服务可用率
averageResponseTime: "平均响应: $TIMEms"
averageResponseTimeTitle: 接口响应
sevelDayResponseTime: 7日响应趋势
responseTimeMs: 响应时长(ms)
up: 正常
down: 中断
degraded: 性能下降
ms: ms
loading: 加载中
navGitHub: GitHub
footer: 本页面开源托管于 [Github]($REPO), 基于 [Upptime](https://upptime.js.org) 构建
rateLimitExceededTitle: 访问频率受限
rateLimitExceededIntro: 您已达到每小时访问上限,请稍候重试或绑定 GitHub 令牌继续访问。
rateLimitExceededWhatDoesErrorMean: 为何出现此提示?
rateLimitExceededErrorMeaning: 因使用 GitHub 接口获取数据,每个 IP 每小时限访问 60 次。
rateLimitExceededErrorHowCanFix: 如何恢复访问?
rateLimitExceededErrorFix: 等待 1 小时自动恢复,或绑定个人令牌可提升至每小时 5,000 次。
rateLimitExceededGeneratePAT: 获取个人令牌指南。
rateLimitExceededHasSet: 您已绑定访问令牌。
rateLimitExceededRemoveToken: 解除绑定
rateLimitExceededGitHubPAT: GitHub 访问令牌
rateLimitExceededCopyPastePAT: 输入您的令牌
rateLimitExceededSaveToken: 保存设置
errorTitle: 数据加载失败
errorIntro: 获取最新状态时出现异常。
errorText: 建议稍后刷新重试。
errorHome: 返回主页
pastScheduledMaintenance: 维护记录
scheduledMaintenance: 计划性维护
scheduledMaintenanceSummaryStarted: 维护进行中 $DATE 开始,持续 $DURATION 分钟
scheduledMaintenanceSummaryStarts: 维护预告 $DATE 开始,预计 $DURATION 分钟
startedAt: 开始于
startsAt: 计划于
duration: 时长
durationMin: $DURATION 分钟
incidentCompleted: 维护完成
incidentScheduled: 维护预告
duration24H: 24小时
duration7D: 7
duration30D: 30
duration1Y: 1
durationAll: 全部时段
locale: zh-CN

结语

  • upptime可以实现的功能远不止于此,还可以实现TCP监视,监视网页内容,监视网页延迟,隐藏监控,自定义监控频率,自定义通知渠道(比如通过邮件,短信,telegram机器人,webhook,Discord发送异常通知),更多可以查询官方文档 https://upptime.js.org/docs/configuration
  • 虽然理论上他是5分钟监控一次,但github大部分时间不允许这么短的间隔,所以实际会是每隔10~20分钟监控一次。
  • 也可以用自己的服务器,接入到 GitHub Actions 作为 Self-hosted runner,Self-hosted runner 作为自定义检测点,可以在更接近用户的地方提供检测,具有更佳的准确性(但是这样好像就没必要了)。

github.png

web.png

history.png