如何用 ntfy 把服务器告警推送到手机:一条命令上手的免费通知方案
【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
ntfy 是一个基于 HTTP 的推送通知服务,你只需要一条 curl 命令,就能把服务器上的任何消息推到自己的手机或桌面,不用注册、不用装复杂软件,也不用为此付费。
它和传统邮件通知的区别很直接:邮件要走 SMTP、配置发信账号,而 ntfy 只要会发一个 HTTP 请求就行。下面用两个真实场景带你上手,最后讲清楚它背后的原理和几个容易踩的坑。
场景一:一条 curl 把磁盘告警推到手机
先解决一个最常见的需求:服务器磁盘满了,你想第一时间在手机上知道。
你不需要写后台、不需要申请接口,直接发一条 POST 请求到一个主题(topic)就行:
curl -d "根分区磁盘使用率 91%,请及时清理" ntfy.sh/disk-alert-7f3a执行后,只要你的手机 App 或网页端订阅了disk-alert-7f3a这个主题,通知就会立刻弹出来。你可以把它写进一个定时脚本,配合df命令判断阈值,超了就发一条消息,等于用几行脚本搭了一个告警推送。
这里注意一下:主题名disk-alert-7f3a后面那段-7f3a不是随便加的。因为 ntfy 不用注册,主题名本身相当于密码——谁知道这个名字,谁就能读到和发送这个主题的消息。所以别用backup、alerts这种太直白的名字,加个随机后缀更安全。
场景二:在 CI/CD 流水线里推送构建结果
场景一推的是"发生了什么",而这个场景关心的是"结果好不好看"。区别在于:你要给消息加上优先级和标签,让失败时更扎眼、成功时更低调。
在 Jenkins 或 GitHub Actions 的收尾脚本里,加一段带表头的 curl:
curl -H "Tags: heavy_check_mark" \ -H "Priority: high" \ -d "构建 #482 执行成功,耗时 3 分钟" \ ntfy.sh/ci-build-7f3aTags会显示成一个 emoji 图标,Priority控制手机响铃的紧急程度。构建失败时把Priority调成max、Tags换成warning,通知就会以最高音量弹出,成功时保持安静。这样你的构建流水线和手机之间就通了,不用再去翻控制台。
反过来,如果你想在服务器端"收"通知并自动执行动作,用订阅命令就能把每条消息触发一条本地命令,比如弹一个桌面通知或跑一个脚本,这块后面机制部分会展开。
机制拆解:topic 就像一条"频道"
把 ntfy 想成广播电台最贴切。topic 就是一个频道名,发消息的人是广播员,收消息的人是听众,而中间的 ntfy 服务器负责把信号转发给所有订阅了这个频道的人。
发一条消息,服务器做三件事:把它落到频道里、推给当前在线的订阅者、并保留一份缓存给后来订阅的人。订阅端则是打开一个长连接(一个一直不挂的 GET 请求),服务器有新消息就顺着这条连接实时吐出来。
用 API 订阅有三种格式,选一种即可:<topic>/json每行一个 JSON 对象,最通用;<topic>/sse适合浏览器里的 JavaScript;<topic>/raw只回消息正文,适合极简脚本。命令行里则直接用ntfy subscribe,它支持"每来一条消息就执行一条命令",消息内容通过$message、$priority、$tags这些环境变量传给命令。
理解了这个"频道 + 长连接"的模型,你就明白它为什么轻量:没有数据库账号体系、没有复杂协议,核心就是"往一个频道写、从一个频道读"。
按场景调优:标签、优先级、认证什么时候开
不是每个功能都得开。下面这张表帮你按场景决定要不要上某个特性:
| 场景 | 建议开启 | 说明 |
|---|---|---|
| 日常运维告警 | 默认即可 | 用默认优先级(3),手机正常响铃 |
| 生产环境故障 | Priority: max+Tags: warning | 最高音量、长震动,务必别错过 |
| 低噪音的批量日志 | Priority: low或min | 不响铃、不震动,只在通知栏里躺着 |
| 想让消息一眼分辨成败 | Tags: heavy_check_mark等 emoji | 图标化,扫一眼就知道状态 |
| 主题涉及敏感内容 | 用户名密码 或 访问令牌 | 自建服务器上给主题加读写保护 |
| 多设备/多人协作 | 访问令牌(Bearer) | 比明文密码更适合写进脚本和 CI |
优先级一共 5 档:min(1)、low(2)、default(3)、high(4)、max(5),数字越大越急。标签用的是 emoji 的名字,比如warning、skull、tada,可以逗号分隔叠加。
自建与权限:三步完成私有部署
如果你不想用公共服务,也不想消息经过别人的服务器,自建很轻松——它就是一个单文件二进制,Docker 一条命令就能跑起来:
docker run -p 8080:80 -it binwiederhier/ntfy serve跑起来后把上面所有 curl 里的ntfy.sh换成你的域名(或localhost:8080)就行。能力边界在这里:默认所有主题都是公开的,要保护敏感主题,必须在服务端配置访问控制,然后发布和订阅时带上凭据(Basic 认证的用户名密码,或 Bearer 访问令牌)。需要持久化缓存的话,记得给/var/cache/ntfy挂一个数据卷。
从源码仓库自己编译也完全可行,完整安装步骤可以看仓库里的 install.md 文档。
常见坑与经验
消息发了但手机没响→ 通常是手机 App 没订阅对应主题,或主题名打错了。先在命令行用ntfy subscribe 你的主题确认消息能收到,再去核对手机 App 里订阅的名字是否一字不差。
标题里的中文显示成问号→ 部分语言的 HTTP 库不支持 UTF-8 表头。把标题按 RFC 2047 做 base64 编码再传,或换成支持 UTF-8 表头的库。
自建的敏感主题被人读到了→ 因为你只建了主题、没开访问控制,等于公开频道。去服务端配置里给该主题加读/写保护,并改用 HTTPS,避免 Basic 认证被窃听。
高优先级消息被系统静音→ ntfy 只能把优先级传过去,最终响不响铃由手机系统管。在 Android 通知设置里给高优先级单独配声音和震动,并别把 ntfy 放进电池优化白名单里。
一条 curl 连上手机,一个长连接喂饱脚本——ntfy 把"通知"这件小事做到了几乎零门槛。
【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考