
ntfy 自建推送服务器一条命令跑通手机秒收告警【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy服务器磁盘快满了你却只能在刷手机时才发现家里自动化设备状态变了通知总慢半拍ntfy 是一个基于 HTTP 的推送通知服务你对任意一台机器发出 PUT/POST 请求手机或桌面端立刻收到通知无需注册、不花钱。本文带你从一条命令把服务器跑起来再一步步加固到可以长期运行的生产配置。一条命令跑通2 分钟验证闭环这条命令拉取官方镜像并在后台启动 ntfy 服务器把容器的 80 端口映射到本机docker run -d -p 80:80 --name ntfy binwiederhier/ntfy serve启动后先确认进程健康这条命令会查询内置健康检查接口curl http://localhost/v1/health你会看到类似{healthy:true,version:2.x.x,...}的返回。再发一条测试消息mytopic主题会被即时创建curl -d 第一条测试消息 http://localhost/mytopic返回ID等信息即发布成功。最后打开浏览器访问http://localhost在 Web 界面输入mytopic订阅就能看到刚才那条消息——这就是 ntfy 推送的完整闭环。没有 Docker 的机器也可以用静态二进制文件下载对应架构的压缩包把ntfy放进PATH运行ntfy serve --cache-file /var/cache/ntfy/cache.db看到Listening on :80即启动成功。30 秒看懂架构单一二进制、零外部依赖静态链接的 Go 程序amd64/armv7/arm64 全支持不强制要求数据库消息默认存在内存缓存里API 极简POST /主题名就是发消息主题名本身就是访问凭证无需注册账号客户端齐全内置 Web 界面另有 Android/iOS 应用和命令行客户端订阅同一主题即可按需增强SQLite/PostgreSQL、S3 附件存储、Web Push、邮件收发全部通过一个server.yml开关两个值得常看的仓库文件完整配置模板 server/server.yml每个选项都有注释以及 10 行 Python 发布示例 examples/publish-python/publish.py。生产环境加固数据持久化别让重启吃掉消息ntfy 默认把消息缓存在内存里 12 小时服务器一重启就清空。最简做法是加一行cache-file让消息落盘到 SQLite客户端也能用since参数补拉错过的消息# /etc/ntfy/server.yml最小持久化配置 base-url: http://ntfy.example.com # 对外访问地址附件/邮件链接依赖它 cache-file: /var/cache/ntfy/cache.db # 消息缓存落盘 attachment-cache-dir: /var/cache/ntfy/attachments # 附件存储生产增强则在持久化之外加上限约束防止磁盘被写满cache-duration: 72h # 缓存保留时长默认 12h attachment-total-size-limit: 5G # 附件总容量上限默认 5G attachment-file-size-limit: 15M # 单文件大小上限 visitor-attachment-total-size-limit: 100M # 匿名访客上传配额防滥用用 Docker 部署时把宿主机目录挂进容器即可仓库自带的 docker-compose.yml 已经是这个形态照抄后只需确认宿主机/var/cache/ntfy对容器用户可写。安全与 HTTPS主题即密码别裸奔ntfy 的默认访问策略是所有人可读可写任意主题主题名就是密码。生产环境建议两步第一步关掉匿名访问并创建管理员密码哈希用ntfy user hash生成auth-file: /var/lib/ntfy/user.db auth-default-access: deny-all # 私有实例的关键项 auth-users: - admin:$2a$10$你的哈希:admin第二步开启 HTTPS避免 Basic Auth 凭证明文传输listen-https: :443 key-file: /etc/letsencrypt/live/ntfy.example.com/privkey.pem cert-file: /etc/letsencrypt/live/ntfy.example.com/fullchain.pem改完执行sudo systemctl restart ntfy或docker compose up -d用curl -k https://域名/v1/health看到 healthy 即生效。如果前面还有 Nginx/Caddy 反代则必须同时设置behind-proxy: true否则 WebSocket 长连接会异常——这一点也直接决定手机收不收得到实时推送。日志与监控出问题先看这两处排查问题时把日志调细在server.yml加log-level: debug更细用tracesystemd 部署用journalctl -u ntfy -f实时查看Docker 部署用docker logs -f ntfy。稳定运行后调回默认info。监控方面ntfy 自带两个端点/v1/health可做存活探测/v1/prometheus输出 Prometheus 指标接入你的监控栈即可对消息量、订阅数做告警——仓库里 examples/grafana-dashboard/ntfy-grafana.json 提供了现成仪表盘。踩坑自救1. 启动失败address already in use现象是ntfy serve或容器起不来日志报端口占用。原因是 80/443 已被 Nginx 之类占用。解法sudo lsof -i :80找到占用进程若你本就用反代把 ntfy 改成只监听内网地址如listen-http: 127.0.0.1:2586再配behind-proxy: true。2. 手机收不到推送Web 端却正常原因几乎都在反向代理Nginx 没转发 WebSocket 的 Upgrade 头或 ntfy 没开behind-proxy: true长连接断掉后消息就走轮询延迟飙升甚至收不到。解法确认代理层支持 WebSocket、配置项已启用另外检查所有订阅主题都授权给了对应用户或everyone任何一个主题返回 403整个订阅请求都会被拒。3. 重启后消息「丢了」你以为丢的消息其实从没落盘——默认内存缓存重启即清空。解法配置cache-file见上文持久化小节客户端订阅时带上since参数即可补拉。4. iOS 只显示「New message」没有正文说明 iPhone 收到了提醒但连不回你的自建服务器去取内容。解法确认手机与服务器网络可达自建实例务必设置base-url为手机实际访问的地址且与 iOS App 里设置的服务器地址完全一致upstream-base-url应指向公共服务而非你自己的域名。Android 端收到 ntfy 推送通知带标题与优先级标签不同环境怎么选你的目标决定路径只想快速验证功能Docker 一条命令足矣跑生产服务系统包deb/rpm自带 systemd 集成和升级通道要改源码或跟进最新特性才需要编译。适用场景推荐方式理由上手难度家庭服务器 / 快速体验Docker 容器隔离性好升级即换镜像⭐生产服务器 / 云主机deb/rpm 系统包开机自启、systemd 日志开箱即用⭐⭐开发调试 / 定制功能源码编译make build最新特性可改可跑测试⭐⭐⭐⭐只需发不收消息直接用公共服务零部署curl即可发⭐如果你是家庭用户直接选 Docker如果是对外提供服务的生产环境选系统包加反代。接下来做什么访问控制把auth-default-access收紧为deny-all用ntfy user add --roleadmin建管理员给每个主题单独授权细节见 docs/config.md接入监控生态把 Grafana、GitHub Webhook、Uptime Kuma 等系统的告警打到你的主题上仓库 server/templates/ 里有现成的模板示例开发自己的客户端读 docs/subscribe/api.md 掌握订阅 API参考 examples/subscribe-go/main.go 或 examples/publish-python/publish.py 用任意语言发消息参与社区遇到 bug 或有想法去提 issue或帮忙翻译文档一起把 ntfy 变好用觉得有用的话点赞收藏一下评论区聊聊你拿 ntfy 接了什么告警场景下一篇我们讲《ntfy 私有化部署Firebase 即时推送与 Web Push 完整配置》。【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考