51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

通过Docker部署ntfy搭建一个私有消息通知服务

ntfy(发音为"notify")是一个基于HTTP的简单发布-订阅通知服务。通过ntfy,您可以从任何计算机通过脚本发送通知到您的手机或桌面。ntfy是开源的,您可以自行部署到您的服务器上使用,并且ntfy还支持Android和IOS APP,非常适合运维人员或开发人员搭建消息推送服务。

529090e58c8f2626.png

使用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界面。

be8d76ec49cf7d40.png

创建授权用户

在上述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界面支持多国语言,但默认使用的英文,可通过设置修改语言为"简体中文"

8a55ff7d13bf5440.png

登录用户

依然是在设置中添加用户,这个步骤是登录已有用户,而不是创建用户,容易造成误解。

06044877cab5de54.png

  • 服务链接地址:填写您自己的域名,末尾不需要/,有可以输入IP + 端口

  • 用户名/密码是上述步骤"创建授权用户"时添加的

9eadad497b2a223a.png

推送消息

在推送消息之前,我们需要先了解ntfy主题这个概念,在ntfy中,"主题"(topic)用于定义和区分消息的发送和接收渠道。简单来说,一个主题就像是一个邮件箱或者消息队列,发送者将消息发布到特定的主题上,而接收者则订阅这个主题以接收相应的消息。主题相当于是一个消息分类,ntfy中不需要额外单独创建topic,在推送和订阅消息的时候直接指定即可。

按下图所示,填写"主题"(这里我们使用的主题是test)和消息标题/内容,最后点发送。

48cbd6441f89acfe.png

订阅主题

在网页上点击"订阅主题",填写我们刚刚的test这个主题,然后"订阅"。

28baf8aae13e2bba.png

这样我们就可以收到刚刚向"test"主题推送的消息。

49d1dcebe607f2fa.png

使用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安装。

bfb32712a8f12a98.png

APP上订阅ntfy主题和WEB页面上订阅主题基本差不多,但是ntfy不支持系统级消息推送服务,因此ntfy APP需要长期保持后台运行,否则无法收到消息推送。

dd018fb9de7cd965.png

另外APP上无法支持渲染Markdown消息,网页版是可以渲染Markdown消息内容的。

更多说明可参考:https://docs.ntfy.sh/subscribe/phone/

赞(9)
未经允许不得转载:工具盒子 » 通过Docker部署ntfy搭建一个私有消息通知服务