去年有一次半夜,一台跑定时脚本的机器磁盘满了,任务连着挂了三个小时,第二天上班才发现。从那以后就想找个东西,脚本一出错就能往手机上戳一下。企业微信和钉钉都能推。要配机器人,要过审批,邮件又太慢。Gotify 属于中间那一档:自己搭一个服务,给个 token,一条 HTTP 请求就能把消息推出来。

一个 exe,0.28 秒起来

下载下来是个 11.9 MB 的 zip,解开只有一个 gotify.exe,32.7 MB。没有安装程序,也不用装 Go 或者数据库,SQLite 是编译进去的。

gotify-windows-amd64.exe.zip   12,460,632 字节
gotify.exe                     34,335,232 字节
version                        3.1.1
commit                         e6361caa512547052b1013dbf4544e6d7ff32604
进程到端口可连                 0.28 秒
内存占用                       22 MB

0.28 秒这个数字比想象中好。之前测的几个 Go 写的服务,从双击到端口能连大多在一秒半到四秒之间,它快是因为启动时基本不做事,数据库文件都是空的。

第一次启动,它把 80 端口占了

按习惯加了 --port 8095,结果日志里写着 Listen address=[::]:80。参数被忽略了,它老老实实去监听 80,而且是所有网卡。

翻了一下才发现,Gotify 的端口和监听地址只认环境变量:GOTIFY_SERVER_PORT 和 GOTIFY_SERVER_LISTENADDRESS。两个都设上才生效。这一点挺坑的。命令行加参数不报错、不提示,只是默默按默认值跑,你还以为是自己写错了。

set GOTIFY_SERVER_PORT=8095
set GOTIFY_SERVER_LISTENADDRESS=127.0.0.1
set GOTIFY_DATABASE_DIALECT=sqlite3
set GOTIFY_DATABASE_CONNECTION=D:\Gotify\data\gotify.db

不设监听地址更麻烦:它默认绑 [::]:80,等于把所有网卡都开了,局域网里谁都能打开你的后台。包里那个 bat 就是把这四行写在前面,省得每次手敲。

建应用、拿 token,再发三条消息

登录进去以后,点 APPS 建一个应用,填个名字,保存完就给你一串 token,长这样:gtfya.j2X7d2HuJMy13Z6CmM0HBsfyEN1o_VG5NZ2R-4XGRhs。前面那一小段是 ID,点号后面才是密钥。

发消息就一条 POST,消息体里三个字段够用:标题、正文和优先级。优先级是 0 到 10,数字越大在界面上越扎眼。

POST /message?token=你的token
{"title":"备份失败","message":"daily-report 在 04:12 退出码 3","priority":10}

三条实测耗时    207 / 114 / 112 毫秒
读消息接口      返回 3 条,首帧正常

第一条 207 毫秒,后面两条一百一十几。差出来的 90 多毫秒不是接口慢,是首次请求要建连接。

消息priority发送耗时列表上的样子
备份失败10114 毫秒左侧红杠
磁盘使用率 92%8207 毫秒左侧红杠
部署完成2112 毫秒无标记

这里有个绕不过去的坑:REST 接口用 admin:admin 走 Basic Auth,返回的是 401。它不认用户名密码,只认应用 token,或者浏览器里的登录会话。所以脚本里不能拿管理员账号去发消息,必须先建应用。

界面上优先级是用颜色分的

三条消息发完刷新,列表按时间倒序排。优先级 10 的「备份失败」和 8 的「磁盘使用率 92%」左边有一条红杠,优先级 2 的「部署完成」没有。不用看数字,扫一眼颜色就知道哪条要紧。

每条卡片上有标题、来源应用名和正文,右上角是相对时间(4s ago 这种)。点应用名可以筛出单个应用的消息。左侧栏固定着 All Messages 和所有应用,点一下就在右边过滤。

顶层还有几个入口:USERS / APPS / CLIENTS / PLUGINS / ADMIN。用户页就是一个表格,三列:用户名、是否管理员和创建日期,现在只有 admin 一行。首次登录时它自动建了个客户端叫 chrome 155.0.0,用来记这个浏览器会话。

admin/admin 这个默认账号,最好当天改掉

第一次打开就是 admin / admin,没有任何强制改密的提示。这点不如一些同类产品,人家至少会让你先设密码再进。放到局域网之前,去 ADMIN 页把密码换掉,顺手把 USERS 里多余的东西清掉。

数据全在 data\gotify.db 一个文件里,三条消息加上一个用户、两个应用,才 69,632 字节。备份就是复制它,换机器直接拷过去就行。

什么时候该用它

如果你的场景是「脚本跑挂了、服务器磁盘满了,或者证书快过期了,得有个人被戳醒」,它刚好。装好、建一个应用,把 token 塞进脚本里的一行 curl,十分钟能搞定,不用依赖任何第三方推送服务。

反过来,要发给一群人、要做消息已读统计,或者要接短信和电话,它就不够了。官方的手机 App 能收推送,但本文没测手机端;WebSocket 实时推、插件系统和 HTTPS 反向代理这几项也都没验证。想在公网用,至少把 TLS 和访问控制先配好,别裸着开 80。