Ntfy:服务器出事了,让手机立刻响一声

admin 开源软件 2026-10-23 6 0

推送这件事看起来简单,实际有三个坑:第三方服务要收费、手机厂商的推送通道不可控、以及「怎么在不暴露服务器的情况下发通知」。

一、它的设计:一条 HTTP 请求就是一条通知

curl -d "备份失败:/data 空间不足" ntfy.sh/我的私密主题

没有 SDK、没有密钥交换、没有复杂配置。任何能发 HTTP 请求的东西都能发通知——脚本、cron、容器健康检查、甚至是路由器的告警。

这个极简设计的好处是在所有环境里都能用:老旧设备、受限网络、没有外网权限的脚本,只要能发一个 POST 就行。

二、自建部署

services:
  ntfy:
    image: binwiederhier/ntfy
    restart: unless-stopped
    command: serve
    ports: ["8089:80"]
    volumes:
      - ./cache:/var/cache/ntfy
      - ./ntfy.yml:/etc/ntfy/server.yml
    environment:
      - TZ=Asia/Shanghai

配置文件里至少要设两项:

base-url: "https://ntfy.你的域名"
cache-file: "/var/cache/ntfy/cache.db"

不设 base-url,手机端订阅后会拿不到消息(回连地址错)。这条是自建版最常见的「装好了但收不到」的原因。

三、安全:一定要加访问控制

公开的推送服务意味着任何人都能往你的主题发消息——垃圾通知还是小事,钓鱼链接才麻烦。

三种做法,从简到严:

  1. 主题名足够随机(长随机串),等于「知道地址才能发」;
  2. 开启访问令牌,发送时带 Authorization: Bearer;
  3. 整个服务加一层登录(反向代理 + 统一认证),适合内部使用。

个人用第二种就够:令牌存在脚本的环境变量里,泄露风险很低。

四、和监控串起来

真正有用的不是「能发通知」,是「该发的时候才发」。几个实际配置:

场景触发方式备注
备份失败脚本末尾判断退出码只在失败时发,成功不发
磁盘快满定时检查 df 使用率 > 85%每小时一次,带渐进的优先级
服务挂了监控工具的告警钩子恢复时也发一条,否则不知道什么时候好的
长任务完成任务收尾调用比盯着终端省事

优先级字段(Priority)要用起来:普通通知静默,紧急通知响铃。全部按最高优先级发,人会很快学会忽略所有通知。

五、和手机厂商推送的关系

自建推送在安卓上要靠常驻连接(后台服务),iOS 上则依赖其官方推送中转——这一点无法绕开。所以「完全自建、不依赖任何第三方」在移动端是不成立的,能自建的只是「消息的源头」。

知道这个前提,就不会在「为什么 iPhone 收不到」上浪费时间:检查应用是否允许后台通知、是否被省电策略杀掉。

六、什么时候不需要它

如果你只有一条要通知的事(比如网站挂了),直接用监控工具自带的邮件通知就够,不必为此再维护一个服务。它的价值在「多个来源、多种级别、统一的接收端」。

监控工具的部署见 Uptime Kuma;指标可视化见 Grafana + Prometheus。

相关阅读

评论

访问统计