ntfy:给自己的所有脚本配一个推送通道,一条命令发到手机
备份跑完了、下载好了、监控报警了——用 curl 发一行,手机立刻弹通知。不用注册、不用第三方账号。
你写的脚本跑完了,然后呢?你不可能一直盯着日志。
最常见的需求是:跑完了告诉我一声,失败了也告诉我。
ntfy 干这件事,而且简单到离谱:curl 发一个 POST,就看到通知了。
装
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command: serve
ports: ["8088:80"]
volumes: ["./ntfy/cache:/var/cache/ntfy", "./ntfy/etc:/etc/ntfy"]
environment:
- TZ=Asia/Shanghai
restart: unless-stopped
打开 http://NAS地址:8088,是个简单的网页,能直接在那个页面上订阅一个"主题"看消息。
发一条试试
curl -d "备份跑完了,用时 4 分 12 秒" http://192.168.1.10:8088/nas-backup
nas-backup 是主题名,自己起。
手机怎么收
两个办法:
一、装官方 App(Android / iOS 都有)
添加服务器地址 http://NAS地址:8088,订阅同一个主题,之后就有系统通知。
二、用网页 PWA 浏览器打开加"添加到主屏幕",效果接近原生。
关键点:手机要能访问到这个地址。在家带 WiFi 没问题,出门就得走隧道——站里 CPN 或 Cloudflare Tunnel 那两篇正好。
脚本里怎么用
三个变量把消息变好看:
curl -H "Title: 备份完成" \
-H "Priority: high" \
-H "Tags: white_check_mark" \
-d "文件 12,384 个,共 84 GB" \
http://192.168.1.10:8088/nas-backup
Priority 可以是 min/low/default/high/urgent。设成 urgent 的会强制响铃。
失败的时候换个标签:
curl -H "Title: 备份失败" -H "Priority: urgent" -H "Tags: warning" \
-d "$(tail -5 /var/log/backup.log)" \
http://192.168.1.10:8088/nas-backup
和别的工具串起来
Uptime Kuma:通知渠道里选 “Webhook”,填 ntfy 地址。服务挂了直接推到你手机。
n8n / 青龙:跑完一段流程,最后一步发 ntfy。
Docker 容器退出:写个 watchtower 或用它的 “notify” 钩子。
Home Assistant:把 ntfy 加成一个通知服务,自动化里调用。
加一层认证(重要)
默认它是公开的:谁知道地址谁就能发消息。
打开 ntfy/etc/server.yml:
auth-file: "/var/lib/ntfy/user.db"
auth-default-access: "deny-all"
然后建用户:
docker exec ntfy ntfy user add --role=admin 你的名字
之后发消息要带 -u 用户名:密码,订阅也要登录。
如果你把它暴露在公网,这一步必须做,不然会被人当免费推送通道刷垃圾。
会踩的坑
手机收不到
App 里服务器地址填成了 localhost,或者防火墙没放行 8088。
消息延迟很久 iOS 上后台推送依赖它的服务端保活。Android 通常即时。
中文乱码
请求头里的中文要用 -H "Title: ..." 的形式,别塞进 URL。
历史消息太多 默认保留 12 小时。想要长期保留要在 server.yml 里改 cache 设置。
别忘了手机端的省电策略 Android 各家 ROM 会杀后台。把 App 加入白名单。
它适合谁
- 有一堆脚本,想知道它们跑没跑成的;
- 用 Uptime Kuma 但觉得通知不够灵活的;
- 不想用第三方推送服务、想自己掌控的。
不适合:只用一两个自动化任务的人(Telegram bot 更简单);完全不做自动化的。
最后
通知这件事的价值,只有在你半夜被叫醒处理一次故障之后才真正体会到。
或者反过来:正是因为有了它,你才敢放心睡觉。
有问题留言。
留言