ntfy(发音为“notify”)是一个基于HTTP的简单发布-订阅通知服务。通过ntfy,您可以从任何计算机通过脚本发送通知到您的手机或桌面。ntfy是开源的,您可以自行部署到您的服务器上使用,并且ntfy还支持Android和IOS APP,非常适合运维人员或开发人员搭建消息推送服务。
使用Docker Compose部署ntfy
为了降低后续维护成本,博主使用Docker Compose来进行部署ntfy
,官方提供了多种部署方式,有兴趣的可自行研究:https://docs.ntfy.sh/install/
创建配置文件
在开始之前,我们需要先创建一个ntfy
配置文件,以便挂载到容器中使用。
# 创建配置目录
mkdir -p etc
# 创建配置文件
touch server.yml
在server.yml
中写入以下内容:
# 填写你自己的域名,末尾不需要
base-url: "https://www.baidu.com"
# 认证数据库的位置
auth-file: "/var/lib/ntfy/user.db"
# 默认访问策略,deny-all代表默认禁止所有未授权用户
auth-default-access: "deny-all"
以上是基础的配置选项,如果您需要更多自定义配置,可参考官方配置文件说明:https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
部署ntfy
接下来创建docker-compose.yaml
文件,内容如下:
version: "2.3"
services:
ntfy:
image: binwiederhier/ntfy:v2.10.0
container_name: ntfy
command:
- serve
environment:
- TZ=Asia/Shanghai # optional: set desired timezone
volumes:
- ./cache:/var/cache/ntfy
- ./etc:/etc/ntfy
- ./db:/var/lib/ntfy
ports:
- 4080:80
healthcheck: # optional: remember to adapt the host:port to your environment
test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 40s
restart: unless-stopped
v2.10.0
是ntfy版本号,你可以自行修改4080
是WEB访问端口,您可以自行修改
输入命令docker-compose up -d
启动ntfy
服务,如果一切顺利,访问http://IP:4080
就能看到ntfy WEB界面。
创建授权用户
在上述server.yml
配置文件中,我们禁止了所有未授权用户,这是生产环境中推荐的做法,因此我们需要为ntfy创建用户后才能发送和订阅消息,可通过下面的命令完成。
# 创建一个管理员角色,username请自行设置
docker exec -it ntfy ntfy user add --role=admin username
# 创建一个普通用户
docker exec -it ntfy ntfy user add --role=user username
# 修改用户权限,权限可以是read-write、read-only、write-only或deny
docker exec -it ntfy ntfy access 用户名 主题 权限
# 查看访问控制列表(ACL)
docker exec -it ntfy ntfy access
如果是个人使用,一般创建一个管理员角色就行了,如果是团队使用,需要自行分配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
更多消息推送渠道,请参考官方文档说明:https://docs.ntfy.sh/publish/
使用APP订阅ntfy消息
ntfy提供了Android和IOS APP,苹果用户直接在应用商店搜索ntfy
安装,Android用户可通过Google Play搜索ntfy
安装。
APP上订阅ntfy主题和WEB页面上订阅主题基本差不多,但是ntfy不支持系统级消息推送服务,因此ntfy APP需要长期保持后台运行,否则无法收到消息推送。
另外APP上无法支持渲染Markdown消息,网页版是可以渲染Markdown消息内容的。
更多说明可参考:https://docs.ntfy.sh/subscribe/phone/
结语
以上就是通过Docker Compose部署ntfy的实践操作,推荐给有需要的运维或开发人员使用,另外ntfy的功能还远不止如此,有兴趣的可自行研究ntfy官方文档:https://docs.ntfy.sh/