之前一直在用企业微信+Email作为消息通道,但是这些消息都要经过第三方服务器,而ntfy则是完全在自己的私有服务器上搭建,理论上不会出现信息泄露的问题。
ntfy支持windows,linux,android,mac等多种环境。
官网提供了多种安装方法,本文使用宝塔面板的docker功能在debian下进行配置。为什么用宝塔?因为配置反向代理、域名证书续签都非常方便。
如果不想自己搭建,官网也提供了免费和付费的提送计划,免费的一天可以推送250条。https://ntfy.sh/app
1、官网
官网:https://ntfy.sh 开源地址:https://github.com/binwiederhier/ntfy
2、docker拉取镜像binwiederhier/ntfy:latest
3、创建挂载目录,本地目录:容器目录
- /www/docker/ntfy/var/cache:/var/cache/ntfy,这个目录用来缓存ntfy的消息
- /www/docker/ntfy/var/attachments:/var/attachments/ntfy,这个目录用来缓存ntfy的附件
- /www/docker/ntfy/etc:/etc/ntfy,这个目录用来存放ntfy的server.yml配置文件
- /www/docker/ntfy/db:/var/lib/ntfy,这个目录用来存放ntfy的用户授权数据库
4、新建一个二级域名msg.yoursite.com
A记录指向docker所在服务器,后面用来反向代理访问ntfy的web页面。
5、创建server.yml配置文件
在上面对应的etc目录下,创建server.yml配置文件,具体解释参考https://docs.ntfy.sh/config/#__tabbed_3_2
注意,以下配置android下测试没有问题,ios下需要略微修改下,可以参看文档。
# 填写你自己的访问域名,末尾不需要
base-url: "https://msg.yoursite.com"
# 认证数据库的位置
auth-file: "/var/lib/ntfy/user.db"
# 默认访问策略,deny-all代表默认禁止所有未授权用户
auth-default-access: "deny-all"
# ntfy 默认是在内存中缓存 12h 的消息,而且实例重启就丢失了(内存特性)。
# 这里设置成在硬盘缓存,ntfy 会将消息存储在基于 SQLite 的缓存,我们设置 24*3=72h 的持续时间。
cache-file: "/var/cache/ntfy/cache.db"
cache-duration: "72h"
# 允许上传附件,启用附件缓存目录(必须设置)
attachment-cache-dir: "/var/cache/ntfy/cache"
# 可选:附件总大小限制(默认 5G)
attachment-total-size-limit: "10G"
# 可选:单个附件大小限制(默认 15M)
attachment-file-size-limit: "10M"
# 可选:附件保留时间(默认 3h)
attachment-expiry-duration: "12h"
这里要特别注意的是:默认情况下,ntfy 服务器对所有人开放,这意味着每个人都可以读写任何主题(这就是 ntfy.sh 的配置方式)。此时,如果你的 ntfy 是部署在公网上,那么为了防止恶意的推送 / 订阅数据,你可以选择配置身份验证和授权。参考:https://docs.ntfy.sh/config/#example-private-instance。
ntfy 的用户授权是用一个简单的基于 sqlite 的后端实现的。它使用访问控制列表 (ACL) 实现两个角色 (user 和 admin) 和每个主题的 read 和 write 权限。访问控制项既可以应用于用户,也可以应用于每个用户 (), 代表匿名 API 访问。
容器创建好后我们再来添加用户,和用户的访问令牌token
6、命令方式创建docker容器,请博主喝瓶农夫山泉吧。
7、docker终端下增加管理员账号及用户
文档https://docs.ntfy.sh/config/#users-and-roles
ntfy创建两种角色的用户,我这里主要是自用,所以仅创建一个管理员账号
user:具有此角色的用户没有特殊权限。需要额外配置针对某一个主题的读写权限
admin:具有此角色的用户默认可以对所有主题进行读 / 写。没有必要进行更细粒度访问控制
创建一个ntfyadmin的管理员账号。宝塔下docker终端用sh方式,root权限。
ntfy user add --role=admin ntfyadmin
根据 ntfy 官方文档https://docs.ntfy.sh/config/#access-tokens,我们可以使用 ntfy token 来添加访问令牌。这样后续在发送消息的时候使用密码,提高系统的安全性。
为 ntfyadmin 创建 token,记录下这个token:
ntfy token add admin
查看所有用户
ntfy user list
8、配置反向代理
在宝塔的docker的反向代理模块下,配置https://msg.yoursite.com,默认是刚才的30080端口,给这个域名申请一个SSL证书,部署。
9、发送消息,手机端配置接收消息
ntfy提供了多种消息推送方式,这里主要记录下json+python的方式推送
文档:https://docs.ntfy.sh/publish/#publish-as-json。
需要注意的是,在json发送的方式下,URL 不能带上主题,即只能是 https://msg.yoursite.com,不能是 https://msg.yoursite.com/topic。
以下是一个python演示:
url=https://msg.yoursite.com
headers={
"Authorization": "Bearer tk_123456"
}
body={
"topic": "mytopic",
"message": "Disk space is low at 5.1 GB",
"title": "Low disk space alert",
"tags": ["warning","cd"],
"priority": 4,
"attach": "https://filesrv.lan/space.jpg",
"filename": "diskspace.jpg",
"click": "https://homecamera.lan/xasds1h2xsSsa/",
"actions": [{ "action": "view", "label": "Admin panel", "url": "https://filesrv.lan/admin" }]
}
response = requests.post(url, data=body, headers=headers)
result = response.json() # 这里可根据回执code进行判定是否发送成功(也可以根据code根据错误信息)
print(result)
如果你需要禁用google的Firebase(Firebase Cloud Messaging (FCM)),在head中设置
headers = {
'Firebase': 'no'
}
手机端的配置比较简单,不再赘述。
记得把电量优化里面加入白名单即可,避免遗漏消息。
10、其他
ntfy的通知功能非常强大,文档可以仔细把玩一下文档https://docs.ntfy.sh/publish/#list-of-all-parameters
支持markdown
支持通过邮件发布消息到指定主题
支持打电话:你可以用 ntfy 打电话,然后用文本转语音的方式大声读出信息。目前仅支持英语,底层为 Twilio,用户需要自行购买 Twilio 服务
高级特性:消息缓存(如果禁用,消息只会推送给订阅者一次,没消费到的话不会推送第二次)、禁用 Firebase、统一推送、矩阵网关