ntfy 允许你使用简单的 HTTP PUT 或 POST 请求,通过任何电脑上的脚本向手机或桌面发送推送通知。我用它来在脚本失败或长时间运行的命令完成时通知自己。
获取应用程序
要在手机上接收通知,请通过 Google Play、App Store 或 F-Droid 安装该应用。安装后,打开并订阅您选择的主题。主题无需明确创建,只需选择一个名称,稍后发布消息时使用即可。请注意,主题名称是公开的,因此最好选择一个不容易被猜到的名称。
安装 ntfy
CLIntfy
允许您发布消息、订阅主题以及自行托管 ntfy 服务器。一切都非常简单。只需安装二进制文件、软件包或 Docker 镜像,配置并运行即可。就像任何其他软件一样,无需任何测试。
Docker
ntfy 镜像适用于 amd64、armv6、armv7 和 arm64。使用起来应该相当简单。
该服务器在 80 端口上公开其 Web UI 和 API,因此您需要在 Docker 中公开它们。要使用持久消息缓存,您还需要将卷映射到/var/cache/ntfy
。要更改其他设置,您应该映射/etc/ntfy
,以便可以编辑/etc/ntfy/server.yml
。
首先我们在想要保存的路径如:
cd /opt/apps/1panel/local/ #转到此目录
mkdir ntfy #创建ntfy目录
cd ntfy #进入ntfy目录
然后我们创建Docker-compose.yml
文件:
在此用到的是tee
命令结合 Here Document (EOF) 来创建
tee docker-compose.yml <<EOF
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command:
- serve
environment:
- TZ=Asia/Shanghai # 时区
volumes:
- ./cache/ntfy:/var/cache/ntfy #持久化存储
- ./ntfy:/etc/ntfy #持久化存储
ports:
- 30000:80 #映射端口
restart: unless-stopped
EOF
接着我们启动服务:
docker compose up -d
启动ntfy
服务后,如果一切顺利,访问http://IP:30000
就能看到ntfy WEB界面。
如果需要停止服务:
docker compose down
访问控制
默认情况下,ntfy 服务器对所有人开放,这意味着每个人都可以读写任何主题(ntfy.sh 就是这样配置的)。为了限制对您自己服务器的访问,您可以选择配置身份验证和授权。
/etc/ntfy/server.yml
文件。如果您想使用配置文件,请在镜像外部手动创建一个文件并将其映射为卷,例如通过-v /etc/ntfy:/etc/ntfy
。您可以使用server.yml
GitHub 上的文件作为模板。
首先,我们需要在ntfy
也就是同docker-compose.yml路径下找到ntfy
文件夹
cd /opt/apps/1panel/local/ntfy/ntfy
在创建一个server.yml
文件,
tee server.yml <<EOF
# 填写你自己的域名,末尾不需要
base-url: "https://ntfy.yatu.icu"
# 认证数据库的位置
auth-file: "/var/lib/ntfy/user.db"
# 默认访问策略,deny-all代表默认禁止所有未授权用户
auth-default-access: "deny-all"
EOF
创建授权用户
在上述server.yml
配置文件中,我们禁止了所有未授权用户,这是生产环境中推荐的做法,因此我们需要为ntfy创建用户后才能发送和订阅消息,可通过下面的命令完成。
如果是个人使用,一般创建一个管理员角色就行了,如果是团队使用,需自行分配ACL权限规则,更多权限说明,请参考ntfy官方文档:https://docs.ntfy.sh/config/?h=acl#access-control-list-acl
Nginx反向代理
为了方便访问和使用,通常我们会配合Nginx反向代理一起使用,下方是博主使用的Nginx反代配置,请根据自身情况修改。
server {
listen 80;
# 改成你自己的域名
server_name www.xxx.com;
# 设置301重定向到https
rewrite ^(.*) https://www.xxx.com$1 redirect;
}
server {
listen 443 ssl http2;
# 改成你自己的域名
server_name www.xxx.com;
# 设置日志路径
access_log /data/logs/www.xxx.com_nginx.log xlog;
# See https://ssl-config.mozilla.org/#server=nginx&version=1.18.0&config=intermediate&openssl=1.1.1k&hsts=false&ocsp=false&guideline=5.6see https://ssl-config.mozilla.org/#server=nginx&version=1.18.0&config=intermediate&openssl=1.1.1k&hsts=false&ocsp=false&guideline=5.6
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 配置证书路径
ssl_certificate /xxx/www.xxx.com.crt;
ssl_certificate_key /xxx/www.xxx.com.key;
location / {
# 改成你自己的ntfy端口
proxy_pass http://127.0.0.1:4080;
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 0; # Stream request body to backend
}
}
网页版使用
设置语言
ntfy WEB界面支持多国语言,但默认使用的英文,可通过设置修改语言为“简体中文”
登录用户
依然是在设置中添加用户,这个步骤是登录已有用户,而不是创建用户,容易造成误解。
- 服务链接地址:填写您自己的域名,末尾不需要
/
,有可以输入IP + 端口
- 用户名/密码是上述步骤“创建授权用户”时添加的
推送消息
在推送消息之前,我们需要先了解ntfy主题这个概念,在ntfy中,"主题"(topic)用于定义和区分消息的发送和接收渠道。简单来说,一个主题就像是一个邮件箱或者消息队列,发送者将消息发布到特定的主题上,而接收者则订阅这个主题以接收相应的消息。主题相当于是一个消息分类,ntfy中不需要额外单独创建topic
,在推送和订阅消息的时候直接指定即可。
按下图所示,填写“主题”(这里我们使用的主题是test
)和消息标题/内容,最后点发送。
订阅主题
在网页上点击“订阅主题”,填写我们刚刚的test
这个主题,然后“订阅”。
这样我们就可以收到刚刚向“test”主题推送的消息。
使用curl命令
生产环境中,我们通常很少使用网页版去推送消息,一般是调用ntfy API接口进行消息推送,比如我们使用curl
命令来推送消息:
curl \
-u testuser:fakepassword \
-d "Look ma, with auth" \
http://localhost/test
testuser:fakepassword
改成你自己的用户名/密码http://localhost
改成你自己的域名test
改成你自己的主题,比如刚刚的test
使用APP订阅ntfy消息
ntfy提供了Android和IOS APP,苹果用户直接在应用商店搜索ntfy
安装,Android用户可通过Google Play搜索ntfy
安装。
APP上订阅ntfy主题和WEB页面上订阅主题基本差不多,但是ntfy不支持系统级消息推送服务,因此ntfy APP需要长期保持后台运行,否则无法收到消息推送。
另外APP上无法支持渲染Markdown消息,网页版是可以渲染Markdown消息内容的。
以上就是通过Docker Compose部署ntfy的实践操作,推荐给有需要的运维或开发人员使用,另外ntfy的功能还远不止如此,有兴趣的可自行研究ntfy官方文档:https://docs.ntfy.sh/