ntfy: 对比Gotify功能更加强大的消息推送服务

前言: 对于移动端支持来说,Gotify只对于安卓和网页端做了官方支持,ios应用因为开发成本较高所以并没有直接支持。并且如果需要ios应用后台通知推送,那么所有用户必须集中使用一个上游服务,作者对此更加不想管了,给出的理由是开发的初衷就是不依赖任何第三方服务。不过就算如此,还是有一个叫做iGotify原生ios应用出现在了github和苹果的应用商店,并且能够正常下载使用,但经过测试后发现配置太过复杂且容易出错了。所以选择ntfy也不失为一个好选择,并且发布消息的配置项更多、支持GET请求发送消息、网页端支持切换中文、最高级别的消息提醒(5)还能够让移动设备响铃。

部署

这里我使用的是二进制程序+官方CLI方式部署。

查看: 官方文档,选择与你的Linux系统相符的命令粘贴到服务器终端下载,比如我的服务器是x86_64/amd64架构,那么使用命令:

wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_amd64.tar.gz
tar zxvf ntfy_2.11.0_linux_amd64.tar.gz
sudo cp -a ntfy_2.11.0_linux_amd64/ntfy /usr/local/bin/ntfy
sudo mkdir /etc/ntfy && sudo cp ntfy_2.11.0_linux_amd64/{client,server}/*.yml /etc/ntfy
sudo ntfy serve

分别执行了下载、解压、复制操作,将文件分布在具有高权限的目录下,这使得CLI命令可以被全局使用,也就是说控制台输入ntfy就可以使用自带的CLI命令了。可以看到命令最后将两个配置文件client.ymlserver.yml复制到了/etc/ntfy目录下。接下来我们进入这个目录,进行启动前最后的修改环境变量步骤。

修改配置文件中的环境变量

这里为了支持ios的后台弹窗通知,并且允许程序关闭的情况下接收到弹窗通知,然后自定义启动端口号,我们进入到/etc/ntfy目录下,打开server.yml文件,以下包含我个人的示例,还有对配置文件的翻译:

# ntfy服务器配置文件
# 请参考文档 https://ntfy.sh/docs/config/ 了解详细信息。
# 所有选项都支持使用下划线(_)代替破折号(-)以符合YAML规范。
# 服务的公共基础URL(例如 https://ntfy.sh 或 https://ntfy.example.com)
# 启用以下任一功能时,此设置是必需的:
# - 附件(用于返回下载URL)
# - 发送电子邮件(用于电子邮件页脚的主题URL)
# - 对于自托管的iOS推送通知服务器(用于计算Firebase poll_request主题)
# - Matrix推送网关(用于验证pushkey是否正确)
# 部署后的域名和服务端口号
base-url: "http://0.0.0.0"
listen-http: ":8878"
# 为了让ios能接到消息,转发到上游处理APN
upstream-base-url: "https://ntfy.sh"
# 开启权限认证
# auth-file: "/var/lib/ntfy/user.db"
# auth-default-access: "read-only"
# HTTP & HTTPS web服务器的监听地址。如果设置了"listen-https",则必须同时设置"key-file"和"cert-file"。
# 格式:[<ip>]:<port>,例如 "1.2.3.4:8080"。
#
# 要在所有接口上监听,可以省略IP地址,例如 ":443"。
# 要禁用HTTP,请将"listen-http"设置为"-"。
# upstream-access-token: "..." # 可选,仅当超过速率限制或上游服务器受保护时

# listen-https:

# 在Unix套接字上监听,例如 /var/lib/ntfy/ntfy.sock
# 这在本地系统上避免端口问题时很有用,并且可以简化权限设置。
#
# listen-unix: <socket-path>
# listen-unix-mode: <linux权限,例如 0700>

# HTTPS web服务器的私钥和证书文件路径。如果未设置"listen-https",则不使用。
#
# key-file: <filename>
# cert-file: <filename>

# 如果设置,也将消息发布到Firebase云消息传递(FCM)主题以供您的应用程序使用。
# 这对于使用Android应用程序时节省电池是可选的,并且仅在此情况下需要。
#
# firebase-key-file: <filename>

# 如果设置了"cache-file",消息将缓存在本地SQLite数据库中,而不仅仅是内存中。
# 这允许服务重新启动而不丢失消息,以支持"since="参数。
#
# "cache-duration"参数定义了消息将被缓冲的时间,之后将被删除。
# 这对于支持"since=..."和"poll=1"参数是必需的。
# 要完全禁用缓存(磁盘/内存),请将"cache-duration"设置为0。
# 缓存文件在设置了正确权限的情况下自动创建。
#
# "cache-startup-queries"参数允许您在数据库初始化时运行命令,
# 例如启用WAL模式(请参阅https://phiresky.github.io/blog/2020/sqlite-performance-tuning/)。
# 示例:
#    cache-startup-queries: |
#       pragma journal_mode = WAL;
#       pragma synchronous = normal;
#       pragma temp_store = memory;
#       pragma busy_timeout = 15000;
#       vacuum;
#
# "cache-batch-size"和"cache-batch-timeout"参数允许启用消息的异步批量写入。
# 如果设置,消息将被排队并在达到给定大小或超时后批量写入数据库。
# 这仅对于高容量服务器是必需的。
#
# Debian/RPM包用户:
#   使用/var/cache/ntfy/cache.db作为缓存文件以避免权限问题。包
#   为您创建了此文件夹。
#
# 检查您的权限:
#   如果您使用systemd运行ntfy,请确保此缓存文件属于ntfy用户和组
#   通过运行:chown ntfy.ntfy <filename>。
#
# cache-file: <filename>
# cache-duration: "12h"
# cache-startup-queries:
# cache-batch-size: 0
# cache-batch-timeout: "0ms"

# 如果设置,可以控制对ntfy服务器和API的访问,使用'ntfy user'和'ntfy access'命令进行细粒度控制。
# 请参考--help页面了解详细信息,或查看文档。
#
# - auth-file是SQLite用户/访问数据库;如果尚不存在,将自动创建
# - auth-default-access定义了如果没有找到访问控制条目时的默认/后备访问权限;
#   可以设置为"read-write"(默认)、"read-only"、"write-only"或"deny-all"。
# - auth-startup-queries允许您在数据库初始化时运行命令,例如启用
#   WAL模式。这与cache-startup-queries类似。有关详细信息,请参见上文。
#
# Debian/RPM包用户:
#   使用/var/lib/ntfy/user.db作为用户数据库以避免权限问题。包
#   为您创建了此文件夹。
#
# 检查您的权限:
#   如果您使用systemd运行ntfy,请确保此用户数据库文件属于ntfy用户和组

2024.10.09更新: 开启权限认证, 限制访问权限教程

  • 手动创建文件user.db,按照路径↓
/var/lib/ntfy/user.db
  • 照此配置server.yml文件
base-url: "0.0.0.0"
listen-http: ":8878"
# 为了让ios能接到消息,转发到上游处理APN
upstream-base-url: "https://ntfy.sh"
# 开启权限认证
auth-file: "/var/lib/ntfy/user.db"
# 无权限者只允许查看不允许发布
auth-default-access: "read-only"
  • 启动/重启服务, 应用新的配置
netstat -tulnp | grep 已启动的ntfy所占用的端口号
kill 进程id
ntfy serve
  • 用官方CLI新建管理员Admin123,这里根据自己喜欢随意改
ntfy user add --role=admin Admin123
  • 回车后会让你输入密码和重复密码,接下来创建个人使用的发布消息用的权限令牌。

这里图省事,直接创个100年的,可以看到36500d是以天数为单位创建。如果目的是为了分发权限,安全起见不要设置这么长时间。

ntfy token add --expires=36500d --label="long-term-access" Admin123
  • 接下来就获取到了token,我们去进行创建主题的post请求
随意请求一个不存在的端点/abc请求头参数
https://example.com/abcAuthorizationBearer+一个空格+刚刚获取到的token
  • 或是不使用token的方式,使用带有权限的管理员的用户名+密码,转为base64后作为请求头中Authorization的参数,官方的生成示例,参数值前方需要有Basic+一个空格
username   = "testuser"
password   = "fakepassword"
Authorization = "Basic " + base64(username + ":" + password) // -> Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk

———-关于权限控制的记录到此为止,下方内容可以直接跳过。———-

对于client.yml也做了翻译,但个人没有使用,默认就是可选的配置:

# ntfy客户端配置文件

# 用于在 "ntfy publish" 和 "ntfy subscribe" 命令中扩展短主题名的基本URL。
# 如果您自托管一个ntfy服务器,您可能需要更改此设置。
#
# default-host: https://msg.xxx.top

# 如果没有提供其他凭据,则默认凭据将用于 "ntfy publish" 和 "ntfy subscribe"。
# 您可以设置一个默认token以使用,或者设置一个默认的用户:密码组合,但不能同时设置两者。
# 如果您有一个空密码,请使用空的双引号("")。
#
# 要覆盖特定订阅的默认用户:密码组合或默认token(例如,为了不发送Authorization头),
# 请为订阅设置用户:密码/token为空的双引号("")。

# default-token:

# default-user:
# default-password:

# 如果订阅没有提供命令,则默认命令将在 "ntfy subscribe" 接收到消息后执行。
# default-command:

# 订阅主题及其操作。此选项主要用于systemd服务,
# 或者如果您可以直接使用 "ntfy subscribe --from-config"。
#
# 示例:
#     subscribe:
#       - topic: mytopic
#         command: /usr/local/bin/mytopic-triggered.sh
#       - topic: myserver.com/anothertopic
#         command: 'echo "$message"'
#         if:
#             priority: high,urgent
#       - topic: secret
#         command: 'notify-send "$m"'
#         user: phill
#         password: mypass
#       - topic: token_topic
#         token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2
#
# 变量:
#     Variable        Aliases               Description
#     --------------- --------------------- -----------------------------------
#     $NTFY_ID$id                   Unique message ID
#     $NTFY_TIME$time                 Unix timestamp of the message delivery
#     $NTFY_TOPIC$topic                Topic name
#     $NTFY_MESSAGE$message, $m          Message body
#     $NTFY_TITLE$title, $t            Message title
#     $NTFY_PRIORITY$priority, $prio,$p  Message priority (1=min, 5=max)
#     $NTFY_TAGS$tags, $tag,$ta      Message tags (comma separated list)
#     $NTFY_RAW$raw                  Raw JSON message
#
# 过滤器 ('if:'):
#     您可以过滤 'message', 'title', 'priority' (逗号分隔的列表,逻辑OR)
#     以及 'tags' (逗号分隔的列表,逻辑AND)。
#     请参阅 https://ntfy.sh/docs/subscribe/api/#filter-messages。
#
# subscribe:

启动程序

一条命令即可:

ntfy serve

更多配置文件的说明,前往官方文档查看吧!比如是否允许附件上传,附件的大小限制什么的,胜在于多端都受官方支持

评论

  1. 博主
    Windows Chrome
    美国加利福尼亚圣何塞
    4 月前
    2024-9-11 23:20:30

    建议是没有ios支持需求就用gotify,又小又美

发送评论 编辑评论


				
上一篇
下一篇