Go 语言消息推送神器:ntfy 项目全面解析
项目概述
ntfy(发音为 “notify”)是一个基于 Go 语言开发的简单 HTTP 消息推送服务,允许用户通过 HTTP 请求向任何设备发送推送通知。该项目由 binwiederhier 开发维护,采用 MIT 许可证开源,是一个轻量级、自托管的推送解决方案。
核心特性
1. 跨平台支持
- 多协议支持:支持 HTTP、WebSocket、SSE(Server-Sent Events)
- 客户端丰富:提供 Web、Android、iOS、命令行客户端
- API 简单:RESTful API 设计,易于集成
2. 部署灵活
- 支持 Docker 一键部署
- 提供单文件二进制版本
- 可配置持久化存储(SQLite、PostgreSQL)
3. 安全可靠
- 支持用户认证和访问控制
- 消息加密传输
- 速率限制防止滥用
技术架构
核心组件
text
// 简化的服务端结构
type Server struct {
config *Config
db *storage.DB
server *http.Server
broadcaster *broadcaster.Broadcaster
auth auth.Provider
}
通信流程
- 发布者通过 HTTP POST 发送消息
- 服务端验证并存储消息
- 订阅者通过 WebSocket/SSE 接收实时推送
- 支持消息持久化和历史查询
实战示例
1. 快速启动服务
text
# 使用 Docker 启动 docker run -p 80:80 -it binwiederhier/ntfy # 或使用二进制文件 ./ntfy serve
2. 发送推送消息
text
# 使用 curl 发送消息
curl -d "服务器磁盘使用率超过90%" ntfy.sh/myserver
# 带标题和优先级
curl -H "Title: 系统告警" \
-H "Priority: high" \
-d "数据库连接池已满" \
ntfy.sh/dbalerts
# 使用认证
curl -u user:pass \
-d "私有消息" \
https://ntfy.example.com/mytopic
3. 订阅消息
text
# 使用 curl 订阅 curl -s ntfy.sh/mytopic # 使用 WebSocket 客户端 wscat -c ws://ntfy.sh/mytopic/ws # 使用官方客户端 ntfy subscribe mytopic
4. Go 语言集成示例
text
package main
import (
"bytes"
"encoding/json"
"net/http"
"time"
)
type Notification struct {
Topic string `json:"topic"`
Message string `json:"message"`
Title string `json:"title,omitempty"`
Priority int `json:"priority,omitempty"`
Tags []string `json:"tags,omitempty"`
}
func SendNotification(serverURL, topic, message string) error {
notif := Notification{
Topic: topic,
Message: message,
Title: "系统通知",
Priority: 3,
Tags: []string{"warning", "server"},
}
jsonData, err := json.Marshal(notif)
if err != nil {
return err
}
client := &http.Client{Timeout: 10 * time.Second}
req, err := http.NewRequest("POST",
serverURL+"/"+topic,
bytes.NewBuffer(jsonData))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
req.SetBasicAuth("user", "password")
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
func main() {
// 发送通知
err := SendNotification(
"https://ntfy.example.com",
"alerts",
"CPU 使用率超过阈值",
)
if err != nil {
panic(err)
}
}
5. 配置示例(server.yml)
text
# 基础配置 base-url: "https://ntfy.example.com" listen-http: ":80" # 认证配置 auth-file: "/var/lib/ntfy/user.db" auth-default-access: "deny-all" # 存储配置 cache-file: "/var/lib/ntfy/cache.db" attachment-cache-dir: "/var/lib/ntfy/attachments" # 速率限制 visitor-request-limit: 60 visitor-request-limit-burst: 10 # 消息保留 message-size-limit: 4096 message-delay-max: 3h
高级功能
1. 消息调度
text
# 定时发送消息
curl -d "每日备份完成" \
-H "At: 08:00" \
ntfy.sh/backup-status
2. 文件附件
text
# 发送带附件的消息
curl -H "Filename: log.txt" \
-d "@/var/log/app.log" \
ntfy.sh/logs
3. Webhook 集成
text
# GitHub Webhook 示例
curl -X POST \
-H "Content-Type: application/json" \
-d '{"topic":"github","message":"新的推送提交"}' \
ntfy.sh/webhook
性能优化建议
1. 生产环境部署
text
# 使用 PostgreSQL 提升性能 database: "postgres://user:pass@localhost/ntfy" # 启用 Redis 缓存 cache: "redis://localhost:6379/0" # 配置反向代理 behind-proxy: true
2. 监控配置
text
# 启用 Prometheus 指标 ./ntfy serve --enable-metrics # 健康检查端点 curl https://ntfy.example.com/v1/health
应用场景
1. 系统监控告警
text
# 监控脚本示例
#!/bin/bash
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
curl -d "磁盘使用率: ${DISK_USAGE}%" \
-H "Priority: high" \
ntfy.sh/system-alerts
fi
2. CI/CD 通知
text
# GitLab CI 配置示例
stages:
- deploy
deploy_production:
stage: deploy
script:
- ./deploy.sh
after_script:
- |
curl -X POST \
-d "生产环境部署完成" \
-H "Tags: deployed,success" \
$NTFY_WEBHOOK_URL
3. 家庭自动化
text
# Home Assistant 集成
import requests
def send_ha_notification(message):
requests.post(
"https://ntfy.example.com/home",
data=message,
headers={
"Title": "智能家居通知",
"Tags": "house,automation"
}
)
总结
ntfy 作为一个用 Go 语言编写的推送服务,展现了 Go 在构建高性能网络服务方面的优势:
- 并发性能优异:利用 Goroutine 轻松处理大量并发连接
- 部署简单:单二进制文件,无运行时依赖
- 内存效率高:适合资源受限的环境
- 跨平台编译:轻松支持多种操作系统和架构
无论是个人使用还是企业部署,ntfy 都提供了一个可靠、灵活的消息推送解决方案。其简洁的 API 设计和丰富的客户端支持,使得集成到现有系统变得异常简单。对于需要自托管推送服务的场景,ntfy 无疑是一个值得考虑的优秀选择。
项目持续活跃开发,社区支持良好,是 Go 语言生态中网络服务开发的优秀范例。
ntfy_20260204150729.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载




还没有评论,来说两句吧...