ByteNoteByteNote

字节笔记本

2026年8月29日

ntfy:用 HTTP 给手机和桌面推通知

API中转
¥120

跑脚本、备份、CI 挂了,你总想立刻在手机上看到。很多通知方案要申请 App、配密钥、再塞一套 SDK。ntfy 更简单:对着一个 HTTP 地址 PUT/POST 一句话,手机和桌面就能收到推送。

项目在 GitHub 开源(binwiederhier/ntfy),也有免费公共实例 ntfy.sh。想私有部署也能自己搭。

它解决什么问题

常见场景:

  • 长任务跑完(训练、编译、备份)
  • cron / CI 失败要立刻知道
  • 家用自动化、监控告警
  • 脚本里随手加一行「完成了」通知

核心模型是 pub-sub:你订一个 topic,往这个 topic 发消息,所有订阅者都会收到。topic 不用事先创建,名字随便起;因为公开实例上名字约等于密码,别用 testalerts 这种好猜的词。

先装接收端

手机端:

打开 App,点订阅,输入一个难猜的 topic,比如 deploy_k9x2m7。桌面也能用网页 ntfy.sh/app 订阅同一个 topic。

发第一条消息

消息就在 HTTP body 里。用 curl:

bash
curl -d "备份完成了" ntfy.sh/deploy_k9x2m7

或官方 CLI:

bash
ntfy publish deploy_k9x2m7 "备份完成了"

Python:

python
import requests
requests.post(
    "https://ntfy.sh/deploy_k9x2m7",
    data="备份完成了".encode("utf-8"),
)

Node:

js
fetch("https://ntfy.sh/deploy_k9x2m7", {
  method: "POST",
  body: "备份完成了",
});

手机上就会弹出对应通知。

标题、优先级、标签

纯正文有时不够。可以用请求头加标题、紧急程度和 emoji 标签:

bash
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(比如 warningtadaheavy_check_mark),App 会转成对应表情;不匹配的字符串会当普通标签显示。

也可以点开通知后跳转到某个页面:

bash
curl \
  -H "Click: https://example.com/status" \
  -d "构建失败,点开看日志" \
  ntfy.sh/deploy_k9x2m7

脚本里怎么用

备份结束后通知:

bash
#!/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
fi

CI 里同样一行 curl 就够。长命令也可以挂在后面:

bash
make release && curl -d "release 打完了" ntfy.sh/deploy_k9x2m7

进阶:延迟投递和动作按钮

可以让消息晚点再发,比如 30 分钟后提醒:

bash
curl -H "In: 30m" -d "该休息一下了" ntfy.sh/deploy_k9x2m7

通知上还能挂动作按钮(打开网页、发 HTTP 请求、复制文本等)。例如点一下就打开仪表盘:

bash
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 一下,备份、编译、监控告警都能接到手上。公共实例够用就直接用;要隐私或更高配额,再把同一套协议指到自己的服务器。

相关链接:

分享: