ntfy 无需注册的通知服务
什么是 ntfy ?
ntfy
(发音:notify
)是一个简单的基于 HTTP
的 pub-sub
通知服务。它允许您通过任何计算机上的脚本向您的手机或桌面发送通知,完全无需注册或费用。
官方提供了免费的版本:https://ntfy.sh/app
安装
群晖(Docker)
下载
在注册表中搜索 ntfy
,选择第一个 binwiederhier/ntfy
,版本选择 latest
。
卷
在 docker
文件夹中,创建一个新文件夹,并将其命名为 ntfy
,并在其中建 2
个子文件夹,分别为 cache
和 config
文件夹 | 装载路径 | 说明 |
---|---|---|
docker/ntfy/cache | /var/cache/ntfy | 存放消息缓存 |
docker/ntfy/config | /etc/ntfy | 存放设置 |
端口
本地端口不冲突就行,不确定的话可以用命令查一下
# 查看端口占用
netstat -tunlp | grep 端口号
默认并没有指定端口
需要点 +
号自己添加
命令行(Docker)
如果你熟悉命令行,可能用 docker cli
更快捷
# 新建目录
mkdir -p /volume2/docker/ntfy/{ cache,config}
# 进入 ntfy 目录
cd /volume2/docker/ntfy
# 启动容器
docker run -d \
--name ntfy \
-v $(pwd)/cache:/var/cache/ntfy \
-v $(pwd)/config:/etc/ntfy \
-p 3680:80 \
binwiederhier/ntfy
docker-compose
脚本如下:
version: "3"
services:
ntfy:
image: binwiederhier/ntfy:latest
container_name: ntfy
command:
- serve
environment:
- TZ=Asia/Shanghai
volumes:
- /home/ntfy/data/cache:/var/cache/ntfy
- /home/ntfy/data/config:/etc/ntfy
ports:
- 12332:80
restart: unless-stopped
反向代理
便捷版
# /etc/nginx/sites-*/ntfy
#
# This config allows insecure HTTP POST/PUT requests against topics to allow a short curl syntax (without -L and "https://" prefix).
# It also disables output buffering, which has worked well for the ntfy.sh server.
#
# This is how ntfy.sh is configured.
#
# 译文(机翻):
# 这个配置允许针对主题的不安全的HTTP POST/PUT请求,允许简短的curl语法(没有-L和 "https://"前缀)。它还禁止输出缓冲,这在ntfy.sh服务器上运行良好。
# 这是 ntfy.sh 的配置方式。
#
server {
listen 80;
server_name ntfy.sh;
location / {
# Redirect HTTP to HTTPS, but only for GET topic addresses, since we want
# it to work with curl without the annoying https:// prefix
set $redirect_https "";
if ($request_method = GET) {
set $redirect_https "yes";
}
if ($request_uri ~* "^/([-_a-z0-9]{0,64}$|docs/|static/)") {
set $redirect_https "${redirect_https}yes";
}
if ($redirect_https = "yesyes") {
return 302 https://$http_host$request_uri$is_args$query_string;
}
proxy_pass http://127.0.0.1:2586;
proxy_http_version 1.1;
proxy_buffering off;
proxy_request_buffering off;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml
}
}
server {
listen 443 ssl;
server_name ntfy.sh;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/letsencrypt/live/ntfy.sh/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ntfy.sh/privkey.pem;
location / {
proxy_pass http://127.0.0.1:2586;
proxy_http_version 1.1;
proxy_buffering off;
proxy_request_buffering off;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml
}
}
安全版
# /etc/nginx/sites-*/ntfy
#
# This config requires the use of the -L flag in curl to redirect to HTTPS, and it keeps nginx output buffering
# enabled. While recommended, I have had issues with that in the past.
#
# 译文(机翻):
# 这个配置需要在curl中使用-L标志来重定向到HTTPS,并且保持nginx输出缓冲的功能。虽然推荐使用,但我在过去也遇到过这样的问题。
#
#
server {
listen 80;
server_name ntfy.sh;
location / {
return 302 https://$http_host$request_uri$is_args$query_string;
proxy_pass http://127.0.0.1:2586;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml
}
}
server {
listen 443 ssl;
server_name ntfy.sh;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/letsencrypt/live/ntfy.sh/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ntfy.sh/privkey.pem;
location / {
proxy_pass http://127.0.0.1:2586;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml
}
}
我的配置
server {
server_name xxxx.cn;
listen 18080 ssl http2;
ssl_certificate /home/nginxWebUI/ssl/xxxx.cn_bundle.pem;
ssl_certificate_key /home/nginxWebUI/ssl/xxxx.cn.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
配置文件
参考官方配置文件示例
配置文件需要映射为容器中的
/etc/ntfy/server.yml
文件。
vim server.yml
官方配置
-
http + 缓存 + 附件
base-url: "http://ntfy.example.com" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments"
-
http + https + 缓存 + 附件
base-url: "http://ntfy.example.com" listen-http: ":80" listen-https: ":443" key-file: "/etc/letsencrypt/live/ntfy.example.com.key" cert-file: "/etc/letsencrypt/live/ntfy.example.com.crt" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments"
-
ntfy.sh 生产环境配置
# All the things: Behind a proxy, Firebase, cache, attachments, # SMTP publishing & receiving # # 译文(机翻): # 所有的,在代理后面,Firebase,缓存,附件。 # SMTP发布和接收 # base-url: "https://ntfy.sh" listen-http: "127.0.0.1:2586" firebase-key-file: "/etc/ntfy/firebase.json" cache-file: "/var/cache/ntfy/cache.db" behind-proxy: true attachment-cache-dir: "/var/cache/ntfy/attachments" smtp-sender-addr: "email-smtp.us-east-2.amazonaws.com:587" smtp-sender-user: "AKIDEADBEEFAFFE12345" smtp-sender-pass: "Abd13Kf+sfAk2DzifjafldkThisIsNotARealKeyOMG." smtp-sender-from: "ntfy@ntfy.sh" smtp-server-listen: ":25" smtp-server-domain: "ntfy.sh" smtp-server-addr-prefix: "ntfy-" keepalive-interval: "45s"
我的配置
base-url: "https://xxxx.cn:18080"
cache-file: "/var/cache/ntfy/cache.db"
attachment-cache-dir: "/var/cache/ntfy/attachments"
upstream-base-url: "https://ntfy.sh"
# 配置私有实例的最简单方法在 server.yml 中添加 auth-default-access: "deny-all"
# 下面是用户认证,不需要可删除,目前配置了认证,将影响iOS端消息接收速度(大概延迟十几分钟的样子)
# 参考:https://docs.ntfy.sh/config/#example-private-instance
#auth-file: "/var/cache/ntfy/user.db"
#auth-default-access: "deny-all"
运行
在浏览器中输入 http://IP:3680
就能看到主界面
左侧菜单 Add Subscription
添加订阅,因为主题没有密码保护,所以要选择一个不容易猜到的名称
默认情况下,
ntfy
服务器对所有人开放,这意味着每个人都可以读取和写入任何主题(这就是ntfy.sh
的配置方式)。要限制对您自己的服务器的访问,您可以选择配置身份验证和授权。配置方法可以看看官方文档:https://ntfy.sh/docs/config/#access-control
左上角如果出现下面的提示,需要授予浏览器显示通知的权限,前提是必须要使用 https
协议
授权之后
发消息
下面是一个示例,展示了如何使用 POST
请求(通过 curl -d
)发布消息:
格式比较简单:curl -d <消息> <服务器IP:端口>/<主题>
# 简单消息测试
curl -d "Hi" http://192.168.0.197:3680/laosu_test_ch
在网页端可以看到刚刚发送的消息
您可以设置 通知优先级
、标题
和 标签
消息。这是一起使用其中一些的示例:
# 更复杂的消息示例
curl \
-H "Title: Unauthorized access detected" \
-H "Priority: urgent" \
-H "Tags: warning,skull" \
-d "Remote access to $(hostname) detected. Act right away." \
http://192.168.0.197:3680/laosu_test_ch
在网页端可以看到刚刚发送的消息是 👇 这样的
手机客户端
因为老苏没有 iPhone
,Mac
也不在身边,所以目前试了 Android
客户端。
除了 Google Play
外,还可以在 F-Droid
下载:https://f-droid.org/en/packages/io.heckel.ntfy/
这里下载的是最新的 Version 1.10.0 (24)
本文完成于 2 个月前,目前最新的版本已经是
1.13.0
第一次启动
设置订阅和服务器(要勾选 Use another server
才能输入自己的服务器地址)
收到消息
查看详情
应用场景
和 Alertover
、WxPusher
一样,ntfy
也是消息推送,所以使用的场景也很多,比如 SSH 登录时通知
、磁盘空间不足警报
等等,
在 https://ntfy.sh/docs/examples/ 有一些示例,作者还在 Github
收集了一些示例:https://github.com/binwiederhier/ntfy/tree/main/examples
参考文档
真诚点赞 诚不我欺~