第三方推送又挂了?这次我把推送服务搬到了自己的 NAS 上
家里的 NAS 跑了不少自动化任务——备份完成、磁盘温度报警、下载完毕……这些事情发生的时候,你怎么知道?
大多数人的答案是:装个第三方推送服务,比如 PushPlus 或者 Server酱,把通知转发到微信。用着还行,直到某天打开手机,发现消息一条没来,上去一查,服务挂了,或者改规则了,或者直接停运了。然后你得翻出所有调用代码,一个一个改 Token。
我最近在 NAS 上部署了一个叫 MagicPush 的项目,自己托管推送服务,渠道随便选,Token 永远在自己手里。用了一段时间,值得写出来分享一下。
它能做什么
MagicPush 是一个消息推送的中转管理平台。你在 NAS 上跑一个容器,对外暴露一个 REST API,任何需要发通知的地方,往这个接口发一条请求就行。消息往哪儿推,在后台配好渠道,跟调用方没有关系。
支持的渠道挺全的,家用场景常见的基本都有:邮件(QQ邮箱/163/Gmail)、Bark(iPhone)、Meow(鸿蒙)、Gotify(自建)、微信龙虾机器人、Server酱、钉钉机器人、飞书机器人,还有 Webhook。一个接口,同时推多个渠道也支持。
部署
NAS 上有 Docker 就够了,镜像支持 amd64 和 arm64(armv8),群晖、极空间、飞牛这些常见机型都能跑。
在 NAS 上找一个目录,比如 /volume1/docker/magicpush,新建一个 docker-compose.yml 文件,内容如下:
services:
app:
image: docker.cnb.cool/magiccode1412/magicpush:latest # 国内网络用这个
# image: magiccode1412/magicpush:latest # 国外网络用这个
ports:
- "3600:3000"
volumes:
- ./data:/app/server/data
network_mode: bridge
container_name: magicpush
restart: unless-stopped然后在同一目录执行:
docker compose up -d截图以 飞牛 NAS 为例:
稍等片刻,容器跑起来之后,浏览器访问 http://NAS的IP:3600,就能看到登录页面了。
第一次进来需要注册账号,注册完直接登录就行。
添加渠道
登录后,先去「渠道管理」页面添加你想用的通知渠道。这里以 邮件(SMTP) 和 Bark(iPhone) 为例,这两个是家用场景最实用的。
邮件渠道,点击「添加渠道」,选择 SMTP,填入你的邮箱配置:
QQ邮箱:host 填
smtp.qq.com,port 填465,user 填你的 QQ 邮箱地址,pass 填授权码(不是登录密码,在 QQ 邮箱设置里生成)163邮箱:host 填
smtp.163.com,port 填465,user 填邮箱地址,pass 填授权码to 字段填收件人地址,可以填自己
Bark 渠道,需要先在 iPhone 上装好 Bark app,打开后能看到一串设备 Key。回到 MagicPush,添加 Bark 渠道,serverUrl 填 https://api.day.app,deviceKey 填刚才的那串 Key。
填完之后可以点「测试」按钮,确认消息能正常发出去。
创建推送接口
渠道配好了,还需要创建一个「推送接口」,这个接口对应一个 Token,外部调用的时候带上这个 Token 就能触发推送。
去「接口管理」,点「新建接口」,给它起个名字,比如「通知」,然后把刚才配好的邮件渠道和 Bark 渠道都勾上,保存。
保存后,页面会显示这个接口对应的 Token,复制下来备用。
发送一条测试消息
现在我们就使用其中的 接口调试 功能测试下是否配置成功。
如果手机收到通知,邮箱也收到邮件,说明整个链路通了。
接入 NAS 上的其他服务
推送链路跑通之后,接下来就是把 NAS 上各种服务的通知接进来。
群晖 DSM 的任务计划,可以在脚本末尾加一行 curl,备份任务完成后自动发通知:
curl "http://NASIP:3600/api/push/你的Token?title=备份完成&content=$(date '+%Y-%m-%d %H:%M') 备份任务执行成功"qBittorrent / Transmission,下载完成后触发的脚本里同样可以加这一行,把文件名作为 content 传进去。
Uptime Kuma,在通知设置里选 Webhook,URL 填:
http://NASIP:3600/api/push/你的Tokenmethod 选 POST,body 里填:
{
"title": "{{monitorName}} 状态变更",
"content": "{{msg}}"
}推送历史和安全设置
后台有「推送记录」页面,每一条消息的发送状态、时间、渠道都有记录,出问题方便排查。
安全方面,后台有「安全设置」,可以调整各接口的限流额度,防止 Token 泄露后被滥用。默认配置对家用场景够用,不用特别改。
几点说明
龙虾机器人(直推个人微信)有 10 条/24 小时的限制,超了之后需要你主动给机器人发一条消息才能继续。日常低频通知没问题,高频报警场景建议用 Bark 或者邮件。
镜像是 All-in-One 模式,Express 直接提供静态文件,没有 Nginx 层。家用 NAS 不对公网开放的话,这个完全够用。如果你有公网暴露的需求,建议在前面套一层反向代理(Nginx Proxy Manager 之类的)再做访问控制。
数据存在容器挂载的 ./data 目录下,是 SQLite 文件,备份的时候把这个目录一起备份就行。
项目地址:https://github.com/magiccode1412/magicpush,MIT 协议开源,有问题可以去 Issues 反馈。