之前一直在用企业微信+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容器,请博主喝瓶农夫山泉吧。

价格: 2.00 元
VIP会员价格:2.00元终身会员免费
温馨提示:登录付款后可永久阅读隐藏内容。 付费可读

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、统一推送、矩阵网关