查看 CHANGELOG.md 了解版本更新记录。
自行注册即可
提示:演示环境仅作测试使用,请勿发送违规信息,数据会定期重置,请勿存储重要信息。
市面上有很多消息推送服务,但是各个各的局限,例如:
也有一些开发者,开始转向App推送,更甚者,开始支持手机系统底层推送,例如:
其实市面上的推送服务基本都覆盖到了(除了万恶之首的微信),但是我们必须考虑如果作为中转的第三方推送服务宕机了,或者说不玩了,会有什么后端,得更新所有的调用代码/令牌
通过以下几张图,就会明白,自己拥有一个推送服务,是多么的有用:



注意: 预构建的 Docker 镜像(
magiccode1412/magicpush:latest)为 All-in-One 模式(Express 直接提供静态文件),不包含 Nginx,因此仅具备 Express 层的两层限流。如需启用 Nginx 层的兜底限流,请使用docker-compose up -d自行构建前后端分离镜像。
本项目对各推送接口有默认的限流策略(可在管理后台「安全设置」中动态调整),同时各消息渠道平台自身也有频率限制,配置时需注意:
| 渠道 | 平台频率限制 | 限制维度 | 说明 |
|---|---|---|---|
| 企业微信群机器人 | 20 条/分钟 | 每个 Webhook | 官方文档明确标注,超限返回错误码 |
| 企业微信应用 | ~200 次/分钟 | 每个应用 | 与接收人数相关 |
| Telegram Bot | 1 条/秒(同群) 30 条/秒(不同群) | 每个群聊 / 全局 | 超限返回 429,需等待 retry-after |
| PushPlus | 200 条/天 5 次/秒 | 每个 Token | 免费用户限制,会员可提升额度 |
| WxPusher | 200 条/天 | 每个 AppToken | 免费限制 |
| 飞书群机器人 | 50 次/分钟 | 每个 Webhook | 自定义机器人限制 |
| 钉钉群机器人 | 20 条/分钟 | 每个机器人每群 | 超限被限流一段时间 |
| Server酱 | 5 次/秒 | 每个 SendKey | Turbo 版限制 |
| 微信公众号 | 10 万 条/天 | 每个模板 | 认证服务号,测试号同样 10 万/天 |
| SMTP 邮件 | 因服务商而异 | 每个账号 | QQ 邮箱/163: 约 500/天,Gmail: 约 500/天 |
| QQ 机器人 | 20 条/秒 | 每个机器人 | 全局限速 |
| Bark | 无限制 | - | 自建服务,无平台限制 |
| Gotify | 无限制 | - | 自建服务,无平台限制 |
| Meow | 无限制 | - | 自建服务,无平台限制 |
| Webhook | 无限制 | - | 取决于目标服务器 |
| 微信龙虾机器人 | 10 条/24 小时 | 每个微信号 | 连续发送 10 条后需用户主动发消息才能继续 |
| 企业微信应用 | ~200 次/分钟 | 每个应用 | 与接收人数相关 |
提示: 以上为各平台官方公开的限制信息,具体限制可能随平台政策调整而变化,请以各平台最新文档为准。高频推送场景建议优先选择无平台限制的自建渠道(Bark/Gotify/Webhook)。
免费资源需要验证信用卡
latest镜像已支持amd/armv8架构
docker命令
docker run -d -p 3000:3000 \
-v $(pwd)/data:/app/server/data \
magiccode1412/magicpush:latest
docker compose
services:
app:
image: magiccode1412/magicpush:latest # 国外用这个
#image: docker.cnb.cool/magiccode1412/magicpush:latest # 国内用这个
ports:
- "3000:3000"
# environment:
# - JWT_SECRET=your-secret-key # 可选,不设置则自动生成安全密钥
volumes:
- ./data:/app/server/data
network_mode: bridge
container_name: magicpush
分离部署前后端
支持更灵活的配置,这种方法需要拉取项目自行构建
docker-compose up -d
单一镜像
docker build -t magicpush .
/workspace/ ├── server/ # 后端项目 │ ├── src/ │ │ ├── config/ # 配置文件 │ │ ├── controllers/ # 控制器 │ │ ├── middleware/ # 中间件 │ │ │ └── rateLimit.middleware.js # 限流中间件 │ │ ├── models/ # 数据模型 │ │ ├── routes/ # 路由定义 │ │ ├── services/ # 业务服务 │ │ │ ├── channels/# 渠道适配器 │ │ │ └── rateLimitConfig.service.js # 限流配置服务 │ │ ├── utils/ # 工具函数 │ │ └── database/ # 数据库初始化 │ ├── Dockerfile # 后端 Dockerfile │ ├── package.json │ └── .env │ ├── web/ # 前端项目 │ ├── src/ │ │ ├── api/ # API接口 │ │ ├── components/ # 组件 │ │ ├── router/ # 路由 │ │ ├── stores/ # 状态管理 │ │ ├── views/ # 页面视图 │ │ │ └── settings/ # 设置页面(含安全设置) │ │ └── styles/ # 样式文件 │ ├── Dockerfile # 前端 Dockerfile │ ├── nginx.conf # 前端 nginx 配置 │ ├── index.html # 入口 HTML │ ├── vite.config.js # Vite 配置 │ ├── tailwind.config.js # Tailwind 配置 │ ├── package.json │ └── .env │ ├── scripts/ # 脚本目录 │ ├── start.sh # 本地开发启动脚本 │ ├── start-docker.sh # Docker 容器内启动脚本 │ ├── docker.sh # Docker 镜像构建推送脚本 │ └── version.js # 版本管理脚本 │ ├── docs/ # 文档目录 ├── public/ # 静态资源(演示图片) ├── Dockerfile # All-in-One Dockerfile(Express 提供静态文件) ├── docker-compose.yml # Docker Compose 配置(前后端分离) └── version.json # 版本配置
# 后端依赖
cd server
npm install
# 前端依赖
cd web
npm install
cd server
npm run init-db
# 使用启动脚本(同时启动前后端)
bash ./scripts/start.sh
# 或分别启动
# 后端
cd server && npm start
# 前端(新终端)
cd web && npm run dev
访问地址:
支持多种调用方式:
# GET 请求(适合简单测试)
curl "http://localhost:3000/api/push/{your_token}?title=标题&content=内容&type=text"
# POST 请求
curl -X POST http://localhost:3000/api/push/{your_token} \
-H "Content-Type: application/json" \
-d '{
"title": "消息标题",
"content": "消息内容",
"type": "text"
}'
更安全的方式,Token 不会暴露在 URL 中
curl -X POST http://localhost:3000/api/push \
-H "Authorization: Bearer {your_token}" \
-H "Content-Type: application/json" \
-d '{
"title": "消息标题",
"content": "消息内容",
"type": "text"
}'
参数说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | string | 否 | 消息标题 |
| content | string | 是 | 消息内容 |
| type | string | 否 | 消息类型: text/markdown/html,默认 text |
Authorization: Bearer {accessToken}| 渠道 | 必需配置 |
|---|---|
| 微信龙虾机器人 | 扫码绑定 (自动获取配置) |
| 企业微信 | key (机器人Key) |
| Telegram | botToken, chatId |
| PushPlus | token (可选: topic) |
| WxPusher | appToken (可选: uids, topicIds) |
| 飞书 | webhookUrl (可选: secret) |
| 钉钉 | webhookUrl (可选: secret) |
| 微信公众号 | appId, appSecret, templateId, openIds (多个用逗号分隔) |
| Server酱 | sendKey (可选: channel) |
| Webhook | url, method (可选: headers, bodyTemplate) |
| SMTP邮件 | host, port, user, pass, to (可选: secure, from) |
| Gotify | serverUrl, token (可选: priority) |
| Bark | serverUrl, deviceKey (可选: group, sound, level, icon) |
| Meow | nickname (可选: type) |
| 企业微信应用 | corpid, corpsecret, agentid, touser (可选: type) |
微信龙虾机器人限制说明: 机器人连续主动发送 10 条消息后,需用户主动发送一条消息才能继续推送;自用户上次主动发消息起 24 小时后,也需主动发消息才能继续推送。系统会在接近限额时自动在消息中提醒用户。
后端 .env 配置:
NODE_ENV=development # JWT_SECRET=your-secret-key # 可选,不设置则自动生成安全密钥 JWT_ACCESS_EXPIRES_IN=15m # 可选,默认 15 分钟 JWT_REFRESH_EXPIRES_IN=7d # 可选,默认 7 天 DB_PATH=./data/push_service.db # 可选 LOG_LEVEL=info # 可选,默认 info
server/src/services/channels/ 创建新的适配器类BaseChannel 基类send(), validate(), test() 方法index.js 中注册新渠道在 server/src/utils/jsonpath.js 的 PRESET_TEMPLATES 对象中添加新模板:
const PRESET_TEMPLATES = {
// 现有模板...
// 添加新模板
jenkins: {
name: 'Jenkins', // 显示名称
description: 'Jenkins 构建通知', // 描述文字
fieldMapping: {
title: '$.name', // 标题的 JSONPath 表达式
content: '$.build.full_url', // 内容的 JSONPath 表达式
},
defaultValues: {
type: 'text', // 消息类型: text/markdown/html
},
},
};
模板字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 显示名称 |
description | string | 描述文字 |
fieldMapping.title | string | 标题的 JSONPath 表达式 |
fieldMapping.content | string | 内容的 JSONPath 表达式 |
defaultValues.type | string | 消息类型:text / markdown / html |
前端通过 API 自动获取模板列表,无需修改前端代码。
users - 用户信息channels - 渠道配置endpoints - 推送接口endpoint_channels - 接口-渠道关联push_logs - 推送记录refresh_tokens - 刷新令牌system_settings - 系统设置(如注册开关)端口被占用
3000 端口web/vite.config.js 中的 server.port 可更改前端开发端口数据库权限错误
server/data/ 目录有写入权限DB_PATH 到其他有权限的位置CORS 错误
server/src/app.js 中的 CORS 配置FRONTEND_URLMIT License