NAS 上跑的自托管服务多了之后,告警这件事就开始失控了:Uptime Kuma 邮件塞在订阅邮件里、Watchtower 升级完默认不通知、Home Assistant 的告警直接发飞书群、Sonarr 下载完只在 Web 界面挂个红点。每天早上打开邮箱翻一圈才能知道昨晚哪个服务挂过,哪个容器悄悄升级了。
后来装了 Gotify,把所有告警都接上,手机上统一收,安静多了。
为什么选它
同类工具里我之前用过 Pushover,好用但要一次性付 5 美元买断 iOS / Android 客户端(Android 端是免费的但 iOS 要买),而且是闭源服务。后来在 Trendshift 上看到 Gotify 一直在 trending——一个 15k star 的小服务,单 Go 进程,10MB 内存占用,零外部依赖(连数据库都是内嵌的 SQLite)。看了眼仓库,2025 年还在持续提交,最近一个版本是 v2.9.1。决定试一下。

它做的事情非常单一:跑一个 HTTP 服务,任何脚本、容器、监控工具都可以 POST 一条消息过来,已连接的客户端(Web 界面、Android app)实时收到推送。本质上就是「自建版的 Pushover」,但完全免费、完全开源、完全自托管。
十分钟部署
Docker Compose 直接起:
services:
gotify:
image: gotify/server
container_name: gotify
restart: unless-stopped
ports:
- "8080:80"
environment:
- GOTIFY_DEFAULTUSER_PASS=改成你的强密码
volumes:
- ./data:/app/data
挂个反向代理套上 HTTPS(一定要套,token 是 URL 参数传输,明文 HTTP 会被中间人截到)。然后浏览器开 https://gotify.yourdomain.com,admin 登录,立刻改密码。默认凭证是 admin/admin,不改就是个肉鸡。
下一步是装 Android 客户端。F-Droid 或者 Google Play 都有,装完输入服务地址和用户密码就连上——它走 WebSocket,不是轮询,所以手机没消息时不耗电,但后台会被 Android 杀掉。需要在「电池优化」白名单里手动加一下,不然装完当晚就收不到通知,会以为自己没配对。

Web 端和 Android 客户端是独立的「Client」,但你发送消息要的是「Application」的 Token。一个 Application 对应一个消息源(备份脚本、Uptime Kuma、Watchtower),每个 Application 有自己的 Token。删 Application 不会影响已经发送的历史消息。
把所有服务接上去
接入方式比我想象的简单——任何能发 HTTP 请求的服务都能用,因为 /message?token=xxx 这个端点就是 Gotify 暴露的全部 API。
Uptime Kuma:设置里 Notification 选 Gotify,填服务地址和 App Token 就行,原生支持。
Watchtower:环境变量加 WATCHTOWER_NOTIFICATIONS=gotify,再给它 GOTIFY_URL 和 GOTIFY_TOKEN。容器有更新会直接推送到手机。
Home Assistant:在 configuration.yaml 加一个 notify 集成:
notify:
- name: gotify
platform: gotify
url: https://gotify.yourdomain.com
token: !secret gotify_token
之后自动化里用 notify.gotify 就能触发推送。
自己的备份脚本:这是我最在意的——之前每天备份完只看一眼日志文件确认成功,现在末尾加一行:
curl -s "https://gotify.yourdomain.com/message?token=$TOKEN"
-F "title=夜间备份完成"
-F "message=数据库已备份到对象存储,大小 $(du -h backup.tar.gz | cut -f1)"
-F "priority=4"
成功推 priority=4,失败推 priority=8(高优先级会绕过勿扰模式震动响铃)。我自己的脚本在凌晨 3 点跑,第二天起床看手机就知道昨晚跑没跑、跑成功没——比登服务器翻日志省事多了。
踩到的两个坑
第一个是反代。Gotify 走 WebSocket 维持长连接,第一次用 Nginx 套反代时手机完全收不到推送,看 Web 端是正常的。原因是 Nginx 默认 60 秒就断开空闲连接,加上默认没转发 Upgrade 头。要在 location 里加:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s;
第二个是 iOS。Gotify 没有官方 iOS 客户端,社区有几个第三方,体验都说不上好。我主力 Android 没踩这个坑,但家里用 iPhone 的人收不到通知——这事儿目前没解,要么换 ntfy(iOS 体验好但 Android 端没 Gotify 干净),要么接受家里 iPhone 用户看 web 端。
用了三个月的感受
它不会让告警变少,但会让我不再漏看。priority 4 的「日常通知」我每天扫一眼手机通知中心就能确认所有自托管服务还活着;priority 8 的「该震动响铃的」只有在真出问题才出现,所以手机响了我会立刻去查。
内存占用 10-20MB,CPU 几乎不动,跑在 NAS 上跟没装一样。配置一次之后基本不用管它,备份脚本、容器监控、Home Assistant 自动化都自己推。
如果你也有几个自托管服务、正在用邮件/微信群/飞书机器人收告警,可以花十分钟装一个试试。10MB 内存、零外部依赖、HTTPS 一套就完事,告警这件事就应该这么轻。