字节笔记本
2026年8月29日
ntfy:用 HTTP 给手机和桌面推通知
跑脚本、备份、CI 挂了,你总想立刻在手机上看到。很多通知方案要申请 App、配密钥、再塞一套 SDK。ntfy 更简单:对着一个 HTTP 地址 PUT/POST 一句话,手机和桌面就能收到推送。
项目在 GitHub 开源(binwiederhier/ntfy),也有免费公共实例 ntfy.sh。想私有部署也能自己搭。
它解决什么问题
常见场景:
- 长任务跑完(训练、编译、备份)
- cron / CI 失败要立刻知道
- 家用自动化、监控告警
- 脚本里随手加一行「完成了」通知
核心模型是 pub-sub:你订一个 topic,往这个 topic 发消息,所有订阅者都会收到。topic 不用事先创建,名字随便起;因为公开实例上名字约等于密码,别用 test、alerts 这种好猜的词。
先装接收端
手机端:
- Android:Google Play 或 F-Droid
- iOS:App Store
打开 App,点订阅,输入一个难猜的 topic,比如 deploy_k9x2m7。桌面也能用网页 ntfy.sh/app 订阅同一个 topic。
发第一条消息
消息就在 HTTP body 里。用 curl:
curl -d "备份完成了" ntfy.sh/deploy_k9x2m7或官方 CLI:
ntfy publish deploy_k9x2m7 "备份完成了"Python:
import requests
requests.post(
"https://ntfy.sh/deploy_k9x2m7",
data="备份完成了".encode("utf-8"),
)Node:
fetch("https://ntfy.sh/deploy_k9x2m7", {
method: "POST",
body: "备份完成了",
});手机上就会弹出对应通知。
标题、优先级、标签
纯正文有时不够。可以用请求头加标题、紧急程度和 emoji 标签:
curl \
-H "Title: 未授权登录" \
-H "Priority: urgent" \
-H "Tags: warning,skull" \
-d "检测到远程登录,请立刻确认。" \
ntfy.sh/deploy_k9x2m7优先级大致是:
| 值 | 含义 |
|---|---|
5 / urgent | 最急,强震动 + 弹窗 |
4 / high | 高 |
3 / default | 默认 |
2 / low | 无声,拉开通知栏才明显 |
1 / min | 最低,塞在「其他通知」里 |
Tags 里如果写的是 emoji shortcode(比如 warning、tada、heavy_check_mark),App 会转成对应表情;不匹配的字符串会当普通标签显示。
也可以点开通知后跳转到某个页面:
curl \
-H "Click: https://example.com/status" \
-d "构建失败,点开看日志" \
ntfy.sh/deploy_k9x2m7脚本里怎么用
备份结束后通知:
#!/usr/bin/env bash
set -euo pipefail
TOPIC="deploy_k9x2m7"
if rsync -a /data/ /backup/; then
curl -s \
-H "Title: 备份成功" \
-H "Tags: heavy_check_mark" \
-d "rsync 已完成" \
"https://ntfy.sh/${TOPIC}" >/dev/null
else
curl -s \
-H "Title: 备份失败" \
-H "Priority: high" \
-H "Tags: warning" \
-d "rsync 退出码非 0,请检查" \
"https://ntfy.sh/${TOPIC}" >/dev/null
fiCI 里同样一行 curl 就够。长命令也可以挂在后面:
make release && curl -d "release 打完了" ntfy.sh/deploy_k9x2m7进阶:延迟投递和动作按钮
可以让消息晚点再发,比如 30 分钟后提醒:
curl -H "In: 30m" -d "该休息一下了" ntfy.sh/deploy_k9x2m7通知上还能挂动作按钮(打开网页、发 HTTP 请求、复制文本等)。例如点一下就打开仪表盘:
curl \
-d "磁盘快满了" \
-H "Actions: view, 打开监控, https://example.com/grafana, clear=true" \
ntfy.sh/deploy_k9x2m7更完整的参数见官方文档:Publishing。
自建还是用公共实例
公共实例零配置,适合个人脚本。要注意:
- topic 名要难猜
- 有速率限制,别当高流量广播通道
- 敏感内容更适合自建,并开启访问控制
自建说明在 Install / Self-hosting。Docker 一行就能起服务,再配反向代理和 HTTPS。
小结
ntfy 把「推送到手机」收成一次普通 HTTP 请求。装 App、订 topic、脚本里 curl 一下,备份、编译、监控告警都能接到手上。公共实例够用就直接用;要隐私或更高配额,再把同一套协议指到自己的服务器。
相关链接: