ntfy:用一条 curl 把服务器告警推到手机上
【免费下载链接】ntfy Send push notifications to your phone or desktop using PUT/POST 项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
凌晨两点,部署脚本挂了,你人却在床上。爬起来连电脑、翻日志,才知道是环境变量没带上——这一套动作你大概不想再来第二次。而 ntfy 推送通知服务干的就是这件事:一个 HTTP POST 把消息实时推到你的手机,不用装任何中间件。
ntfy 推送通知的核心机制
- Topic 就是频道名,也是密码。 没有注册环节,谁知道名字谁就能读写,所以名字要不可猜测(只允许 [-_A-Za-z0-9],最长 64 字符)。
- 主题即建即用。 首次发布或订阅时主题自动创建,不需要任何初始化步骤。
- 消息在 body,属性在 header。 标题用 Title、优先级用 Priority、表情标签用 Tags,全是一个 HTTP 请求头的事(见 docs/publish.md)。
- 五级优先级。 从 min 到 urgent,高优先级在手机上横幅弹出、长振动,低优先级静默进通知栏。
- 限流是内置的。 服务端按 IP 做请求和消息频控,你不需要自己搭防刷。
最小可用路径:一条命令跑通闭环
手机上装好 ntfy App,随便订阅一个主题,比如 deploy-alerts:
# 发一条消息到你的主题
curl -d "部署完成:v1.4.2 已上线" ntfy.sh/deploy-alerts
锁屏滑一下,横幅弹出来了。到这里,最小闭环已经跑通了。
想用自己的服务器?拉个镜像、一条命令起服务,然后把地址换成你的域名:
docker run –name ntfy -d -p 8080:8080 binwiederhier/ntfy
curl -d "self-hosted hello" localhost:8080/hello
浏览器打开 http://localhost:8080 自带 Web 界面,消息流直接可见,调试起来比看日志直观。

把 ntfy 接进日常工作流
备份与磁盘告警
定时任务成功失败都该有交代。官方示例里这个模式很经典:rsync 链式执行,成功发低优先级,失败发带警告标签的高优先级:
rsync -a root@laptop /backups/laptop \\
&& curl -H "Priority: low" -d "Laptop backup succeeded" ntfy.sh/backups \\
|| curl -H "Priority: high" -H "Tags: warning" -d "Laptop backup failed" ntfy.sh/backups
要点就三个:成功失败进同一主题、靠 Tags 和 Priority 区分轻重、脚本输出可以直接塞进 -d 的消息体里方便排错。仓库里的 examples/ssh-login-alert/ 还给了 SSH 登录告警的现成脚本,思路一样。
CI/CD 构建状态同步
告警之外,流水线状态值得同步。在 workflow 尾部 POST 一下,注意用 Basic Auth 把主题保护起来:
– name: Notify ntfy
run: |
curl -u "${{ secrets.NTFY_AUTH }}" \\
-H "Tags: ${{ job.status == 'success' && 'heavy_check_mark' || 'warning' }}" \\
-d "Repo: ${{ github.repository }} | Commit: ${{ github.sha }}" \\
"${{ secrets.NTFY_URL }}"
NTFY_AUTH 存 用户名:密码 的 Basic Auth 串,放 secret 里;Tags 里那个三元表达式让成功失败自动换标签。批量 Ansible 场景也有现成写法,一个 uri 任务通知整批主机。
从告警到运营看板
告警通了之后,下一步是让整台服务器的消息流量可见。仓库里就带了一份 Grafana 面板:examples/grafana-dashboard/ntfy-grafana.json,导入后就能看到各主题的发布量。

生产环境考量
- 认证与权限:Basic Auth(-u user:pass)或访问令牌(Authorization: Bearer tk_xxx)按主题设读写规则。自建必须上 HTTPS,Basic 只是 base64 编码,不是加密。
- 重试与降级:网络抖动时脚本里做指数退避重试;如果 ntfy 服务本身挂了,失败分支至少写本地日志,别让通知通道成为单点。
- 频率与容量:免费版按 IP 限流(约每分钟 60 次请求量级,具体档位以官方文档为准);自建可调 max-client-request 等参数,配置项全集见 docs/config.md。
常见误区与排障
- curl 成功了,手机没响 → 大概率是主题名和 App 里订阅的差一个字符,URL 路径必须逐字一致;开 Web 界面发条测试消息最快确认。
- 订阅后看不到老消息 → ntfy 默认不存订阅前的历史;自建实例开启消息缓存,或订阅时带 ?since=now 只取实时消息。
- 偶尔收到 429 → 命中 IP 限流;低频告警把消息合并成一条批量发,比加大限流上限更稳妥。
- 手机总显示 "Reconnecting…" → 自建走反向代理的话,确认 ntfy 配置里 behind-proxy 已开启、代理侧放行了 WebSocket(见 docs/troubleshooting.md)。

延伸与收束
想接监控,Grafana 面板和 Uptime Kuma、Watchtower 都有现成集成;想让消息驱动动作,ntfy subscribe 可以拉消息流直接喂给脚本。下次凌晨两点,手机会先醒。
【免费下载链接】ntfy Send push notifications to your phone or desktop using PUT/POST 项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



