本教程將引導您使用官方 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、記憶體、硬碟等)
- 通知配置
- 定義如何發送消息(通過什麼方式發送通知)
- 包含消息格式、接收方式等
- 可以配置多個通知方式
- 支持自定義消息模板
工作流程#
- 告警觸發流程
- 監控數據 -> 匹配告警規則 -> 觸發通知
- 規則匹配邏輯
- 檢查監控指標
- 判斷是否超過閾值
- 確認持續時間
- 驗證是否需要忽略
- 通知發送流程
- 生成通知內容
- 應用消息模板
- 通過配置的通知方式發送
最佳實踐#
- 告警規則設置
- 根據伺服器性能設置合理閾值
- 避免過於頻繁的告警
- 合理設置持續時間避免誤報
- 針對重要伺服器設置更嚴格的規則
- 通知配置建議
- 設置合適的通知間隔
- 根據告警級別使用不同優先級
- 自定義清晰的消息格式
- 配置重試機制處理發送失敗
- 監控維護
- 定期檢查規則有效性
- 及時調整不合理的閾值
- 分析告警歷史優化配置
- 確保通知方式可用性