本教程将引导您使用官方 Ntfy 服务 (https://ntfy.sh/), 为哪吒监控配置通知功能。本教程侧重于提供可直接上手的配置。
Ntfy 是一个简单而强大的推送通知服务,具有以下优点:完全开源且免费使用、支持自托管、无需注册账号即可使用、支持多平台(Android、iOS、Web)、配置简单快捷、支持端到端加密,是服务器监控通知的理想选择。其轻量级的特性和简单的 API 使其特别适合与哪吒监控集成。
相比之下,Server酱免费版存在以下局限性:
名称: Ntfy
URL: https://ntfy.sh/
请求方式: POST
类型: JSON
请求头:
{
"Content-Type": "application/json"
}
注意: Ntfy 官方服务不需要 Authorization header。
请求体:
{
"topic": "哪吒监控",
"title": "服务器状态 - #SERVER.NAME#",
"message": "CPU: #SERVER.CPU#% | 内存: #SERVER.MEM# | 硬盘: #SERVER.DISK# | 上行: #SERVER.NETOUTSPEED# | 下行: #SERVER.NETINSPEED# | 负载: #SERVER.LOAD1#/#SERVER.LOAD5#/#SERVER.LOAD15#",
"priority": 3,
"tags": ["warning"]
}
重要: 将 哪吒监控
替换为您想要订阅的主题名称,建议使用随机字符串以保证安全性。
安装 ntfy 应用
哪吒监控
)。在哪吒监控面板中添加通知配置
https://ntfy.sh/
POST
JSON
topic
为您在 Ntfy 应用中订阅的主题。测试通知
https://ntfy.sh/
,不需要在 URL 中添加主题名称。Content-Type
为 application/json
,无需 Authorization
。topic
: 这是您在 Ntfy 应用中订阅的主题,确保此值和您在应用中订阅的名称一致,这是接收通知的关键。title
: 通知的标题,#SERVER.NAME#
会被替换为服务器的名称。message
: 通知的具体内容,包含服务器的 CPU、内存、硬盘、网络速度和负载等信息。priority
: 通知的优先级,3 为中等优先级。tags
: 标签,可以根据需要添加,这里使用 "warning"。#SERVER.NAME#
: 服务器名称
#SERVER.CPU#
: CPU 使用率
#SERVER.MEM#
: 内存使用情况
#SERVER.DISK#
: 磁盘使用情况
#SERVER.NETINSPEED#
: 网络入站速度
#SERVER.NETOUTSPEED#
: 网络出站速度
更多变量信息请参考哪吒监控官方文档。 https://nezha.wiki/guide/notifications.html
topic
的值一致。收不到通知:
topic
是否与订阅的主题一致。通知格式错误:
Content-Type
是否设置为 application/json
。准备工作
创建 Docker Compose 配置
创建目录并编写 docker-compose.yml
:
mkdir -p /opt/ntfy
cd /opt/ntfy
vim docker-compose.yml
配置文件内容:
version: "3.8"
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command:
- serve
environment:
- TZ=Asia/Shanghai
volumes:
- ./data:/var/lib/ntfy
- ./cache:/var/cache/ntfy
ports:
- 8080:80
具体教程看官方文档: https://ntfy.sh/docs/self-hosting/docker
如果您的 Ntfy 服务器部署在内网环境,建议使用 Cloudflare Tunnel 进行安全的内网穿透。这样可以:
version: "3.8"
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command:
- serve
environment:
- TZ=Asia/Shanghai
volumes:
- ./data:/var/lib/ntfy
- ./cache:/var/cache/ntfy
- ./config.yml:/etc/ntfy/config.yml
ports:
- 8080:80
cloudflared:
image: cloudflare/cloudflared
container_name: cloudflared
command: tunnel run
environment:
- TUNNEL_TOKEN=your-tunnel-token
restart: unless-stopped
这样你就只要在 Cloudflare有域名就能随时访问了
Content-Type
为 application/json
,最好设置 Authorization
。{
"Content-Type": "application/json",
"Authorization": "Basic base64(username:password)"
}
假设账号密码为:
生成 base64 编码:
# Linux/Mac
echo -n "monitor:ntfy2024" | base64
# 输出: bW9uaXRvcjpudGZ5MjAyNA==
# Windows PowerShell
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("monitor:ntfy2024"))
# 输出: bW9uaXRvcjpudGZ5MjAyNA==
{
"Content-Type": "application/json",
"Authorization": "Basic bW9uaXRvcjpudGZ5MjAyNA=="
}
注意:
示例配置:
{
"topic": "哪吒监控",
"title": "警报 - #SERVER.NAME#",
"message": "CPU使用率超过90%: #SERVER.CPU#%",
"priority": 5,
"tags": ["warning", "cpu"]
}
{
"topic": "哪吒监控",
"title": "【#SERVER.STATUS#】#SERVER.NAME#",
"message": "时间: #SERVER.DATE#\n状态: #SERVER.STATUS#\n详情: CPU=#SERVER.CPU#% MEM=#SERVER.MEM#\n位置: #SERVER.LOCATION#",
"priority": 3,
"tags": ["status", "#SERVER.STATUS#"],
"click": "https://你哪吒监控的地址"
}
示例配置:
{
"topic": "哪吒监控",
"title": "警报 - #SERVER.NAME#",
"message": "CPU使用率超过90%: #SERVER.CPU#%",
"priority": 5,
"tags": ["warning", "cpu"]
}
{
"topic": "哪吒监控",
"title": "【离线警报】#SERVER.NAME#",
"message": "⚠️ 服务器已离线\n主机名: #SERVER.HOST#\nIP: #SERVER.IP#\n离线时间: #DATETIME#",
"priority": 5,
"tags": ["alert", "offline"]
}
{
"topic": "哪吒监控",
"title": "【资源告警】#SERVER.NAME#",
"message": "CPU: #SERVER.CPU#% | 内存: #SERVER.MEM#% | 硬盘: #SERVER.DISK#%\n负载: #SERVER.LOAD1#/#SERVER.LOAD5#/#SERVER.LOAD15#",
"priority": 4,
"tags": ["warning", "resource"]
}
{
"topic": "哪吒监控",
"title": "【流量告警】#SERVER.NAME#",
"message": "月度流量超限\n上行: #SERVER.TRANSFEROUT#\n下行: #SERVER.TRANSFERIN#",
"priority": 3,
"tags": ["warning", "traffic"]
}
在通知消息中可以使用以下变量:
变量 | 说明 |
---|---|
#NEZHA# | 通知内容 |
#DATETIME# | 事件发生的时间 |
#SERVER.NAME# | 服务器名称 |
#SERVER.IP# | 服务器 IP |
#SERVER.IPV4# | IPv4 地址 |
#SERVER.IPV6# | IPv6 地址 |
#SERVER.CPU# | CPU 使用率 |
#SERVER.MEM# | 内存使用率 |
#SERVER.SWAP# | 交换分区使用率 |
#SERVER.DISK# | 磁盘使用率 |
#SERVER.NETINSPEED# | 实时上传速度 |
#SERVER.NETOUTSPEED# | 实时下载速度 |
#SERVER.TRANSFERIN# | 总上传流量 |
#SERVER.TRANSFEROUT# | 总下载流量 |
#SERVER.LOAD1# | 1分钟负载 |
#SERVER.LOAD5# | 5分钟负载 |
#SERVER.LOAD15# | 15分钟负载 |
配置项 | 说明 | 示例值 |
---|---|---|
名称 | 通知方式名称 | ntfy-alert |
URL | Ntfy服务器地址 | https://ntfy.sh/ |
请求方式 | 固定为POST | POST |
请求类型 | 固定为JSON | JSON |
最大重试次数 | 失败重试次数 | 3 |
通知间隔(秒) | 两次通知最小间隔 | 300 |
[
{
"Type": "offline",
"Duration": 300
}
]
[
{
"Type": "cpu",
"Max": 90,
"Duration": 300
},
{
"Type": "memory",
"Max": 90,
"Duration": 300
}
]
[
{
"Type": "transfer_out_cycle",
"Max": 1099511627776,
"Cycle_start": "2024-01-01T00:00:00+08:00",
"Cycle_interval": 1,
"Cycle_unit": "month",
"Cover": 1,
"Ignore": {"1": true, "2": true}
}
]