我 NAS 上跑的 10MB 通知服务,把所有告警都收齐了

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。决定试一下。

Gotify Web UI 截图

它做的事情非常单一:跑一个 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 杀掉。需要在「电池优化」白名单里手动加一下,不然装完当晚就收不到通知,会以为自己没配对。

Gotify 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 一套就完事,告警这件事就应该这么轻。

发表评论