ntfy 无需注册的通知服务

猎隼丶止戈 猎隼丶止戈 | 1331 | 2022-11-28

​​什么是 ntfy ?

ntfy​​​(发音:notify​​​)是一个简单的基于 HTTP​​​ 的 pub-sub​​​ 通知服务。它允许您通过任何计算机上的脚本向您的手机或桌面发送通知,完全无需注册或费用。

官方提供了免费的版本:https://ntfy.sh/app

安装

群晖(Docker)

下载

在注册表中搜索 ntfy​ ,选择第一个 binwiederhier/ntfy​,版本选择 latest​。

308d6e48645b4ff09204b488f12656b1.png

docker​ 文件夹中,创建一个新文件夹,并将其命名为 ntfy​,并在其中建 2​ 个子文件夹,分别为 cache​ 和 config

09636f4a9fa041cf88029078fb09700e.png

文件夹装载路径说明
docker/ntfy/cache/var/cache/ntfy存放消息缓存
docker/ntfy/config/etc/ntfy存放设置

454acd8fa8b047e4b1eba5ebfe13482e.png

端口

本地端口不冲突就行,不确定的话可以用命令查一下

# 查看端口占用
netstat -tunlp | grep 端口号

默认并没有指定端口

a1c3ec7da2e14aa797c2ef9db0db446a.png

需要点 +​ 号自己添加

6f87a9db0f4d4981a935197a8606ade4.png

命令行(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

反向代理

更多示例参考 代理配置 ,这里仅摘录 Nginx 方式。

便捷版

# /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

参考文档

文章标签: CI/CD
推荐指数:

转载声明:

原作者: 杨浦老苏

转载自: 《无需注册的通知服务ntfy》,如有侵权,请联系本站删除。

真诚点赞 诚不我欺~

ntfy 无需注册的通知服务

点赞 收藏 评论