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

ntfy首页

如果需要停止服务:

docker compose down

访问控制

默认情况下,ntfy 服务器对所有人开放,这意味着每个人都可以读写任何主题(ntfy.sh 就是这样配置的)。为了限制对您自己服务器的访问,您可以选择配置身份验证和授权。

请注意,Docker 镜像不包含/etc/ntfy/server.yml文件。如果您想使用配置文件,请在镜像外部手动创建一个文件并将其映射为卷,例如通过-v /etc/ntfy:/etc/ntfy。您可以使用server.ymlGitHub 上的文件作为模板。

首先,我们需要在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”主题推送的消息。

web端演示

使用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需要长期保持后台运行,否则无法收到消息推送。

安卓客户端展示1

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

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

以上就是通过Docker Compose部署ntfy的实践操作,推荐给有需要的运维或开发人员使用,另外ntfy的功能还远不止如此,有兴趣的可自行研究ntfy官方文档:https://docs.ntfy.sh/

END
最后修改:2025 年 08 月 15 日
如果觉得我的文章对你有用,请随意赞赏