ntfy 推送

折腾
34 0

https://github.com/binwiederhier/ntfy

Docker:

mkdir -pv ~/Docker/ntfy/cache
touch ~/Docker/ntfy/cache/cache.db

docker rm -f ntfy
docker run -itd \
 --name=ntfy \
 --restart always \
 -p 9527:80 \
 -v ~/Docker/ntfy:/etc/ntfy \
 -v ~/Docker/ntfy:/var/lib/ntfy \
 -v ~/Docker/ntfy/cache:/var/cache/ntfy \
 binwiederhier/ntfy \
 serve --cache-file /var/cache/ntfy/cache.db

访问 WEB 界面:
未设置域名:xx.xx.xx.xx:9527
已设置域名:https://halo.xxx.com

http 访问界面不支持消息推送。

使用 admin 角色去创建用户AreYouOk,执行会提示输入密码:

docker exec -it ntfy ntfy user add --role=admin AreYouOk

配置好 server.yml

# ntfy 服务器配置文件
# https://docs.ntfy.sh/config/#config-options
# https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
# 所有选项也支持下划线 (_) 而不是破折号 (-),以符合 YAML 规范。

# 服务的公共基础 URL(例如 https://ntfy.sh 或 https://ntfy.example.com)
#
# 此设置对以下任何功能都是必需的:
# - 附件(用于返回下载 URL)
# - 通过电子邮件发送(在电子邮件页脚的主题 URL)
# - 用于自托管服务器的 iOS 推送通知(用于计算 Firebase poll_request 主题)
# - Matrix 推送网关(用于验证推送密钥是否正确)
#
base-url: https://halo.xxx.com

# HTTP 和 HTTPS Web 服务器的监听地址。如果设置了"listen-https",还必须设置"key-file"和"cert-file"。格式:[<ip>]:<port>,例如"1.2.3.4:8080"。
# 若要在所有接口上监听,可以省略 IP 地址,例如":443"。
# 若要禁用 HTTP,请将"listen-http"设置为"-"。
# listen-http: ":80"
# listen-https:

# 监听 Unix 套接字,例如/var/lib/ntfy/ntfy.sock
# 这可以用于避免本地系统上的端口问题,并简化权限设置。
# listen-unix: <套接字路径>
# listen-unix-mode: <Linux 权限,例如 0700>

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

# 如果设置,还可以将消息发布到 Firebase Cloud Messaging(FCM)的应用主题中。
# 这是可选的,仅在使用 Android 应用时才需要,以节省电池电量。
# firebase-key-file: <文件名>

# 如果设置了"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 <文件名>。

cache-file: "/var/cache/ntfy/cache.db"
# cache-duration: "12h"
# cache-startup-queries:
# cache-batch-size: 0
# cache-batch-timeout: "0ms"

# 如果设置,可以使用'ntfy user'和'ntfy access'命令在细粒度级别上控制对 ntfy 服务器和 API 的访问。
# 有关详细信息,请参阅--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 用户和组,方法是运行:chown ntfy.ntfy <文件名>。

auth-file: "/var/lib/ntfy/user.db"
auth-default-access: "deny-all"
# auth-startup-queries:
# behind-proxy: false

# 如果启用,客户端可以将文件附加到通知作为附件。启用附件的最低设置
# 包括"attachment-cache-dir"和"base-url"。
# - attachment-cache-dir 是附加文件的缓存目录
# - attachment-total-size-limit 是磁盘附件缓存目录的限制(总大小)
# - attachment-file-size-limit 是每个附件的文件大小限制(例如,300k,2M,100M)
# - attachment-expiry-duration 是上传附件后删除附件的持续时间(例如,3h,20h)

attachment-cache-dir: "/var/cache/ntfy/attachments"
attachment-total-size-limit: "1G"
attachment-file-size-limit: "100M"
attachment-expiry-duration: "24h"

# 如果启用,允许通过'X-Email'标头发送出站电子邮件通知。如果设置了此标头,
# 消息还将作为电子邮件通过外部 SMTP 服务器发送。

# 截至目前,只支持具有纯文本身份验证(或根本不进行身份验证)和 STARTLS 的 SMTP 服务器。
# 请还参考下面的速率限制设置(visitor-email-limit-burst 和 visitor-email-limit-burst)。
# - smtp-sender-addr 是 SMTP 服务器的主机名:端口
# - smtp-sender-from 是发件人的电子邮件地址
# - smtp-sender-user/smtp-sender-pass 是 SMTP 用户的用户名和密码(留空表示无身份验证)
# smtp-sender-addr:
# smtp-sender-from:
# smtp-sender-user:
# smtp-sender-pass:

# 如果启用,ntfy 将启动一个轻量级的 SMTP 服务器用于传入消息。一旦配置,用户可以发送
# 电子邮件到主题电子邮件地址以发布消息到主题。
# - smtp-server-listen 定义 SMTP 服务器将侦听的 IP 地址和端口,例如:25 或 1.2.3.4:25
# - smtp-server-domain 是电子邮件域,例如 ntfy.sh
# - smtp-server-addr-prefix 是用于电子邮件地址的可选前缀,以防止垃圾邮件。如果设置为"ntfy-",
# 例如,只有电子邮件 ntfy-$topic@ntfy.sh 将被接受。如果未设置,所有电子邮件都会被接受
# $topic@ntfy.sh 将被接受(这显然可能是垃圾邮件问题)。
# smtp-server-listen:
# smtp-server-domain:
# smtp-server-addr-prefix:

# Web 推送支持(用于浏览器的背景通知)
#
# 如果启用,允许 ntfy 接收推送通知,即使 ntfy Web 应用程序已关闭。一旦启用,用户
# 可以在 Web 应用程序中启用背景通知。一旦启用,ntfy 将发布的消息转发到推送
# 端点,然后将其转发到浏览器。
# 您必须配置 web-push-public/private key、web-push-file 和 web-push-email-address 以启用 Web 推送。
# 运行"ntfy webpush keys"以生成密钥。
# - web-push-public-key 是生成的 VAPID 公钥,例如 AA1234BBCCddvveekaabcdfqwertyuiopasdfghjklzxcvbnm1234567890
# - web-push-private-key 是生成的 VAPID 私钥,例如 AA2BB1234567890abcdefzxcvbnm1234567890
# - web-push-file 是用于跟踪浏览器订阅端点的数据库文件,例如`/var/cache/ntfy/webpush.db`
# - web-push-email-address 是发送到推送提供商的管理员电子邮件地址,例如`sysadmin@example.com`
# - web-push-startup-queries 是启动时运行的可选查询列表
# web-push-public-key:
# web-push-private-key:
# web-push-file:
# web-push-email-address:
# web-push-startup-queries:

# 如果启用,ntfy 可以通过"X-Call"标头通过 Twilio 进行语音通话。
# - twilio-account 是 Twilio 帐户 SID,例如 AC12345beefbeef67890beefbeef122586
# - twilio-auth-token 是 Twilio 身份验证令牌,例如 affebeef258625862586258625862586
# - twilio-phone-number 是您购买的外拨电话号码,例如+18775132586
# - twilio-verify-service 是 Twilio Verify 服务 SID,例如 VA12345beefbeef67890beefbeef122586
# twilio-account:
# twilio-auth-token:
# twilio-phone-number:
# twilio-verify-service:

# 客户端发送保持活动消息的间隔。这是为了防止中介因不活动而关闭连接。
# 请注意,Android 应用程序在 77 秒处有一个硬编码的超时,因此应小于该值。
# keepalive-interval: "45s"

# 管理程序修剪旧消息、删除主题和打印统计信息的间隔。
# manager-interval: "1m"

# 定义不允许的主题名称,因为它们以其他方式被使用。有一些默认主题
# 不能使用(例如 app、account、settings 等)。要扩展默认列表,请在此处定义它们。
# 示例:
# disallowed-topics:
# - about
# - pricing
# - contact
# disallowed-topics:

# 定义 Web 应用程序的根路径,或完全禁用 Web 应用程序。
# 可以是任何简单路径,例如"/"、"/app"或"/ntfy"。出于向后兼容性的原因,
# 值"app"(映射到"/")、"home"(映射到"/app")或"disable"(映射到"")以完全禁用 Web 应用程序。
# web-root: /

# 用于控制 Web 应用程序和 API 访问的各种功能标志,主要围绕用户和
# 帐户管理。
# - enable-signup 允许用户通过 Web 应用程序或 API 注册
# - enable-login 允许用户通过 Web 应用程序或 API 登录
# - enable-reservations 允许用户预留主题(如果其层允许)
# enable-signup: false
# enable-login: false
# enable-reservations: false

# Firebase/APNS 连接的 ntfy 服务器的服务器 URL(可能是"https://ntfy.sh")。
# iOS 用户:
# 如果使用 iOS ntfy 应用程序,必须配置此项以及时接收通知。您可能会需要:
# upstream-base-url: "https://ntfy.sh"

# 如果设置,所有传入的消息将向配置的上游服务器发布一个包含
# 原始消息的消息 ID 的"poll_request"消息,指示 iOS 应用程序轮询此服务器以获取实际的消息内容。
# 这是为了防止上游服务器和 Firebase/APNS 能够读取消息。
# - upstream-base-url 是上游服务器的基本 URL。应为"https://ntfy.sh"。
# - upstream-access-token 是用于在上游服务器进行身份验证的令牌。只有在超出上游速率限制或上游服务器需要身份验证时才需要。
upstream-base-url: "https://ntfy.sh"
# upstream-access-token:

# 速率限制:拒绝新主题之前的服务器总主题数。
# global-topic-limit: 15000

# 速率限制:每个访问者(IP 地址)的订阅数量
# visitor-subscription-limit: 30

# 速率限制:每秒每个访问者允许的 GET/PUT/POST 请求:
# - visitor-request-limit-burst 是每个访问者的初始请求桶
# - visitor-request-limit-replenish 是请求桶重新填满的速率
# - visitor-request-limit-exempt-hosts 是一个逗号分隔的主机名、IP 或 CIDR 列表,用于排除请求速率限制。主机名在服务器启动时解析。
# 例如:"1.2.3.4,ntfy.example.com,8.7.6.0/24"
# visitor-request-limit-burst: 60
# visitor-request-limit-replenish: "5s"
# visitor-request-limit-exempt-hosts: ""

# 速率限制:每个访问者每天的消息硬限制。限制在每天 UTC 午夜重置。
# 如果未设置限制(或设置为零),则请求限制(见上文)控制上限。
# visitor-message-daily-limit: 0

# 速率限制:每个访问者允许的电子邮件数:
# - visitor-email-limit-burst 是每个访问者初始电子邮件桶
# - visitor-email-limit-replenish 是请求桶重新填充的速率
# visitor-email-limit-burst: 16
# visitor-email-limit-replenish: "1h"

# 速率限制:每个访问者的附件大小和带宽限制:
# - visitor-attachment-total-size-limit 是每个访问者用于附件的总存储限制
# - visitor-attachment-daily-bandwidth-limit 是每个访问者的每日附件下载/上传流量限制
# visitor-attachment-total-size-limit: "100M"
# visitor-attachment-daily-bandwidth-limit: "500M"

# 速率限制:启用基于订阅者的速率限制(主要用于 UnifiedPush)
# 如果启用,订阅者可以选择将发布的消息计入其自己的速率限制,而不是发布者的速率限制。
# 这对于允许高流量发布者(例如 Matrix/Mastodon 服务器)发送消息的数量非常有用。
# 一旦启用,客户端可以在通过 HTTP 流或 Web 套接字订阅主题时发送"Rate-Topics:<topic1>,<topic2>,..."头,从而注册自己作为"速率访问者",即在此主题上发布时使用的速率限制。
# 注意:设置速率访问者需要主题的读写权限。
# 仅限 UnifiedPush:如果启用此设置,发布到 UnifiedPush 主题将导致 HTTP 507 响应,如果之前未注册"速率访问者",则避免烧毁发布者的"visitor-message-daily-limit"。
# visitor-subscriber-rate-limiting: false

# 通过 Stripe 进行付款集成
# - stripe-secret-key 是用于 Stripe API 通信的密钥。设置此值将启用 ntfy Web 应用程序中的付款(例如升级对话框)。请参阅 https://dashboard.stripe.com/apikeys。
# - stripe-webhook-key 是验证来自 Stripe 的传入 Webhook 的真实性所需的密钥。Webhook 对于保持本地数据库与付款提供程序同步至关重要。请参阅 https://dashboard.stripe.com/webhooks。
# - billing-contact 是在"升级层"对话框中显示的电子邮件地址或网站,以便让人们提出与账单相关的问题。如果未设置,将不显示任何内容。
# stripe-secret-key:
# stripe-webhook-key:
# billing-contact:

# 指标
# ntfy 可以通过/metrics 端点或专用的侦听 IP/端口公开类似 Prometheus 的指标。
# 由于指标可能被视为敏感信息,因此在启用它们之前,请确保您知道自己在做什么,或者在反向代理中安全访问端点。
# - enable-metrics 启用默认 ntfy 服务器(即 HTTP、HTTPS 和/或 Unix 套接字)的/metrics 端点
# - metrics-listen-http 通过专用 [IP]:端口公开指标端点。如果设置了此选项,它也会隐式启用指标,例如"10.0.1.1:9090"或":9090"
# enable-metrics: false
# metrics-listen-http:

# 性能分析
# ntfy 可以公开 Go 的 net/http/pprof 端点,以支持对 ntfy 服务器的性能分析。
# 如果启用,ntfy 将侦听专用的侦听 IP/端口,可以通过 Web 浏览器访问 http://<ip>:<port>/debug/pprof/。
# 这对于公开瓶颈、可视化调用流程很有帮助。有关详细信息,请参阅 https://pkg.go.dev/net/http/pprof。
# profile-listen-http:

# 日志选项
# 默认情况下,ntfy 将日志记录到控制台(stderr),日志级别为"info",格式为人类可读的文本格式。
# ntfy 支持五种不同的日志级别,还可以写入文件、记录为 JSON,甚至支持精细的日志级别覆盖,以便更轻松地进行调试。
# 一些选项(log-level 和 log-level-overrides)可以通过调用"kill -HUP $pid"或"systemctl reload ntfy"来热重载。
# - log-format 定义输出格式,可以是"text"(默认)或"json"
# - log-file 是要写入日志的文件名。如果未设置此选项,ntfy 将日志记录到 stderr。
# - log-level 定义默认日志级别,可以是"trace"、"debug"、"info"(默认)、"warn"或"error"中的一个。
# 请注意,"debug"(特别是"trace")可能会非常啰嗦。仅在调试目的时打开它们。
# - log-level-overrides 允许您覆盖日志级别,如果某些字段匹配。这对于调试系统的某些部分(例如,仅帐户管理或仅特定访问者)非常有用。
# 这是一个字符串数组,格式如下:
# - "field=value -> level"以精确匹配值,例如"tag=manager -> trace"
# - "field -> level"以匹配任何值,例如"time_taken_ms -> debug"
# 警告:使用 log-level-overrides 会对性能造成影响。仅在临时调试时使用它。

# 检查您的权限:
# 如果您正在使用 systemd 运行 ntfy,请确保此日志文件由 ntfy 用户和组拥有,方法是运行:chown ntfy.ntfy <filename>。

# 示例(适用于生产环境):
# log-level: info
# log-format: json
# log-file: /var/log/ntfy.log

# 示例级别覆盖(用于调试,仅在临时使用):
# log-level-overrides:
# - "tag=manager -> trace"
# - "visitor_ip=1.2.3.4 -> debug"
# - "time_taken_ms -> debug"

# log-level: info
# log-level-overrides:
# log-format: text
# log-file:

Nginx 配置:

  location / {
    proxy_pass http://127.0.0.1:20000;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    client_max_body_size 20m;
    
    proxy_connect_timeout 3m;
    proxy_send_timeout 3m;
    proxy_read_timeout 3m;
  }

问题集:

  • 如果重新部署,前端无法收到消息重新订阅即可。
  • ntfy v2.7.0 中文界面发送消息会崩溃。
  • iOS 接受消息无法实时,需要手动下拉刷新。
  • 不是很满意这个方案,但起码能用了。

类似推送还有:

更新 2023-10-12
评论 ( 0 )
私信
pic
code
pre