本教程将引导您使用官方 Ntfy 服务 (https://ntfy.sh/), 为哪吒监控配置通知功能。本教程侧重于提供可直接上手的配置。
Ntfy 是一个简单而强大的推送通知服务,具有以下优点:完全开源且免费使用、支持自托管、无需注册账号即可使用、支持多平台(Android、iOS、Web)、配置简单快捷、支持端到端加密,是服务器监控通知的理想选择。其轻量级的特性和简单的 API 使其特别适合与哪吒监控集成。
相比之下,Server 酱免费版存在以下局限性:
- 每天仅支持 5 条推送消息,超出需付费,不支持自托管,完全依赖第三方服务。消息通道单一,仅支持微信推送。免费版消息不支持分组管理,无法进行消息撤回等高级操作,服务可用性依赖微信公众号平台。
配置说明#
基本信息#
-
名称: 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 应用
- 通过 Google Play 或 F-Droid 安装 ntfy 应用 (或使用网页版 https://ntfy.sh/)。
- 打开应用,订阅您在请求体中设置的主题名称 (例如:
哪吒监控
)。 - 请记下您选择的主题,在后续配置中会用到。
-
在哪吒监控面板中添加通知配置
- 打开哪吒监控面板。
- 进入通知配置页面。
- 点击 "添加通知"。
- 按照 “配置说明” 部分填写信息。
- URL:
https://ntfy.sh/
- 请求方式: 选择
POST
- 类型: 选择
JSON
- 请求头: 复制粘贴上面的 JSON 内容。
- 请求体: 复制粘贴上面的 JSON 内容,请务必修改
topic
为您在 Ntfy 应用中订阅的主题。 - 验证 TLS: 勾选此项。
- URL:
-
测试通知
- 保存配置后,点击 "测试" 按钮,发送测试通知。
- 检查您的手机或 Ntfy 应用是否收到通知。
详细解释#
URL#
- 使用官方 Ntfy 服务时,URL 固定为
https://ntfy.sh/
,不需要在 URL 中添加主题名称。
请求头#
- 对于官方 Ntfy 服务,只需要设置
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
注意事项#
- 主题: 确保 Ntfy 应用中订阅的主题名称与请求体中
topic
的值一致。 - 验证 TLS: 必须勾选 "验证 TLS" 选项以确保通信安全。
- 测试: 测试通知是否成功发送,是确保配置正确的关键步骤。
常见问题#
-
收不到通知:
- 检查 Ntfy 应用是否订阅了正确的主题。
- 检查请求体中的
topic
是否与订阅的主题一致。 - 确保 "验证 TLS" 选项已勾选。
-
通知格式错误:
- 确保请求体的 JSON 格式正确。
Content-Type
是否设置为application/json
。
警报规则配置 (简述)#
- 警报规则的配置方式与之前文档一致,关键在于设置合适的触发条件和通知组。
- 可以根据您的实际需求,设置 CPU、内存、硬盘、网络和离线等多种监控类型的警报规则。
- 详细配置步骤请参考哪吒监控官方文档,以及本文档之前的 “警报规则配置” 部分。
进阶说明#
自托管 Ntfy 服务器安装#
-
准备工作
- 确保服务器已安装 Docker 和 Docker Compose
- 准备好域名并解析到服务器(可选,但推荐)
- 建议使用 Caddy 或 Nginx 作为反向代理
-
创建 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
使用 Cloudflare Tunnel 进行内网穿透#
如果您的 Ntfy 服务器部署在内网环境,建议使用 Cloudflare Tunnel 进行安全的内网穿透。这样可以:
- 无需开放任何端口
- 自动配置 SSL 证书
- 获得 DDoS 防护
- 支持访问控制
- **Docker Compose 集成 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 有域名就能随时访问了
请求头#
- 对于自托管 Ntfy 服务,需要设置
Content-Type
为application/json
,最好设置Authorization
。
Authorization Token 配置#
- Basic Auth 方式
{
"Content-Type": "application/json",
"Authorization": "Basic base64(username:password)"
}
- 实际示例
假设账号密码为:
- 用户名:monitor
- 密码:ntfy2024
生成 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=="
}
注意:
- 请将 username 和 password 替换为您实际的用户名和密码
- Base64 编码不是加密,不要在请求头中使用明文密码
- 建议使用 HTTPS 确保传输安全
示例配置:
{
"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}
}
]
规则说明#
- Duration: 持续时间 (秒),在此期间超过 30% 触发阈值才报警
- Max/Min:
- 流量单位:字节 (1KB=1024B)
- CPU / 内存 / 硬盘:百分比 (0-100)
- Cover:
- 0: 监控所有服务器
- 1: 仅监控指定服务器
- Ignore: 指定服务器 ID 的监控策略
告警和通知的区别#
- 告警规则
- 用于定义触发条件(什么情况下需要发送通知)
- 包含阈值、持续时间等具体判断标准
- 可以针对不同服务器设置不同规则
- 支持多种监控类型(CPU、内存、硬盘等)
- 通知配置
- 定义如何发送消息(通过什么方式发送通知)
- 包含消息格式、接收方式等
- 可以配置多个通知方式
- 支持自定义消息模板
工作流程#
- 告警触发流程
- 监控数据 -> 匹配告警规则 -> 触发通知
- 规则匹配逻辑
- 检查监控指标
- 判断是否超过阈值
- 确认持续时间
- 验证是否需要忽略
- 通知发送流程
- 生成通知内容
- 应用消息模板
- 通过配置的通知方式发送
最佳实践#
- 告警规则设置
- 根据服务器性能设置合理阈值
- 避免过于频繁的告警
- 合理设置持续时间避免误报
- 针对重要服务器设置更严格的规则
- 通知配置建议
- 设置合适的通知间隔
- 根据告警级别使用不同优先级
- 自定义清晰的消息格式
- 配置重试机制处理发送失败
- 监控维护
- 定期检查规则有效性
- 及时调整不合理的阈值
- 分析告警历史优化配置
- 确保通知方式可用性