用ntfy给Matrix-Synapse做消息推送服务
众所周知,FCM(GCM)在东方大国是没法正常使用的,那么依赖FCM作为消息推送方式的App消息推送也都成问题。
之前架设了Synapse,在Android手机上使用Element客户端,消息推送就是一直有问题的。
后来发现,从某版本的Synapse开始,它支持UnifiedPush这个消息推送规范了。
那么,搭建一个消息推送服务来用吧。
以下内容在Ubuntu 22.04 LTS上实际使用。
UnifiedPush规范是一个免费和开源的规范,支持多种不同的工具,这里我们使用ntfy作为推送服务器。
ntfy是一个基于HTTP的消息推送服务,允许通过脚本以及REST API的方式发送通知到PC或移动端上,并且100%免费开源。
其实是用来在服务器上跑的业务把进度通过消息推送到手机上,顺带做Synapse的消息推送。(大雾)
接下来就先搭建ntfy。
安装ntfy
1 2 3 4 5 6 7 8 |
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://archive.heckel.io/apt/pubkey.txt | sudo gpg --dearmor -o /etc/apt/keyrings/archive.heckel.io.gpg sudo apt install apt-transport-https sudo sh -c "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/archive.heckel.io.gpg] https://archive.heckel.io/apt debian main' \ > /etc/apt/sources.list.d/archive.heckel.io.list" sudo apt update sudo apt install ntfy sudo systemctl enable ntfy |
安装好后先不启动,先来编辑一下配置文件。
编辑ntfy的配置文件
配置文件的位置:/etc/ntfy/server.yml
1 2 3 4 5 6 7 8 9 10 |
base-url: "https://你的域名" listen-http: "-" listen-https: ":443" key-file: "/etc/letsencrypt/live/你的域名/privkey.pem" cert-file: "/etc/letsencrypt/live/你的域名/fullchain.pem" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments" auth-file: "/var/lib/ntfy/user.db" auth-default-access: "deny-all" web-root: disable |
对配置文件作一个解释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 域名,你需要使用的域名,如果不建在443端口上,则需要加上端口号,比如abc.com:8443 base-url: "https://abc.com" # 不监听http 80端口 listen-http: "-" # https 监听443端口,如果需要其他端口,则:8443 listen-https: ":443" # 域名的ssl证书 key-file: "/etc/letsencrypt/live/abc.com/privkey.pem" cert-file: "/etc/letsencrypt/live/abc.com/fullchain.pem" # 缓存文件 cache-file: "/var/cache/ntfy/cache.db" # 附加文件缓存目录 attachment-cache-dir: "/var/cache/ntfy/attachments" # 认证数据库文件 auth-file: "/var/lib/ntfy/user.db" # 关闭匿名 auth-default-access: "deny-all" # 网页端关闭 web-root: disable |
如果需要使用ntfy自带的Web页面,把最后一条配置删除即可。
修改启动脚本
按照ntfy官方文档的自建方法,直接使用systemctl start ntfy
是无法启动成功的。
我们需要更改一下启动脚本的用户。
vim /usr/lib/systemd/system/ntfy.service
1 2 3 |
# User 和 Group 默认是 ntfy User=root Group=root |
新建账户
由于ntfy默认是开放式服务,所以任何人都可以直接使用,这也就是在配置文件中关闭匿名用户的原因,只有经过认证的用户才可以使用。
所以我们需要新建用户,把密码记住,后面还要用到。
1 2 3 4 5 6 7 8 9 |
# 新建普通用户 ntfy user add someuser # 新建管理员用户 ntfy user add --role=admin otheruser # 显示所有用户 ntfy user list |
给UnifiedPush开权限
我们需要给使用UnifiedPush协议的软件开一个写入的权限。
up*
是指UnifiedPush协议。
1 |
ntfy access '*' 'up*' write-only |
再开一个读取的权限,该权限开到用户身上。
1 |
ntfy access someuser 'up*' read-only |
在Android手机应用上设置ntfy
可以在Google Play商店或者其他应用商店(非东方大国特供)上安装ntfy。
或者到F-Droid上下载apk来安装。
最后在ntfy上设置默认服务器
为你自己搭建的ntfy服务,将你新建的用于读取权限的用户和密码加入ntfy内。
最后打开Element,在设置->通知内将通知方式选择为ntfy。
选择好后,Element会自动在ntfy内订阅好,在ntfy的首页,就会显示一条类似于地址为abc.com/upX2slxuyr7QkoN
(你搭建的服务的地址)的统一推送订阅。
这时,可以在Element->设置->高级设置->通知目标,里面看一下,推送密钥和URL是否为包含https://abc.com/
(你搭建的服务的地址),如果包含则设置正确,如果是Matrix官方地址或其它地址,可以点最下方的移除,将该推送目标移除掉,重新设置通知方式为ntfy再试一下。
至此就可以正常的接收推送消息了,只是ntfy要一直在手机上开着就是了,就大D自己的测试而言,电量消耗还能接受。