notify-scheduler
基于 ANotify 库的通知定时发送系统,支持多种通知渠道的定时和重复发送。
6.9K
主界面

日历视图

日历导出(订阅)

日历导入(同步)

┌─────────────────┐
│ Web 前端界面 │ ← 用户交互(任务管理、日历视图、渠道配置)
└────────┬────────┘
│ HTTP + SSE
┌────────▼────────┐
│ Flask API │ ← RESTful 接口 + JWT 认证
│ + 用户认证 │
└────────┬────────┘
│
┌────┴────┬─────────┬─────────┐
│ │ │ │
┌───▼───┐ ┌──▼──┐ ┌───▼───┐ ┌──▼────┐
│ SQLite│ │APSche│ │Encrypt│ │EventMgr│
│ 数据库 │ │ duler│ │ 加密 │ │ SSE推送 │
└───┬───┘ └──┬──┘ └───────┘ └────────┘
│ │
│ ┌───▼────────────┐
│ │ Task Executor │ ← 任务执行与日志记录
│ └───┬────────────┘
│ │
│ ┌───▼────────────┐
│ │ Notification │ ← 发送通知(模板变量替换)
│ │ Sender │
│ └───┬────────────┘
│ │
│ ┌───▼────────────┐
│ │ ANotify │ ← 多渠道通知发送
│ └───┬────────────┘
│ │
└────────┴────────────────────────┐
│
┌─────────────────────────────────▼──────┐
│ 企业微信 │ 飞书 │ 钉钉 │ PushPlus ... │
└────────────────────────────────────────┘
# 1. 克隆项目
git clone https://github.com/TommyMerlin/Notify-Scheduler.git
cd Notify-Scheduler
# 2. 构建并启动容器
docker-compose up -d
# 3. 查看日志
docker-compose logs -f
# 4. 停止服务
docker-compose down
# 1. 克隆项目
git clone https://github.com/TommyMerlin/Notify-Scheduler.git
cd Notify-Scheduler
# 2. 安装依赖并启动(开发模式)
./start.sh
# 3. 或使用生产模式(Gunicorn)
./start.sh prod
# 1. 克隆项目
git clone https://github.com/TommyMerlin/Notify-Scheduler.git
cd Notify-Scheduler
# 2. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
pip install gunicorn ANotify
# 4. 启动应用
python app.py # 开发模式
# 或
gunicorn -c gunicorn_config.py app:app # 生产模式
访问 http://localhost:5000 打开 Web 管理界面。
首次使用需要先注册账号:
在左侧表单中填写通知信息:
点击"创建任务"按钮
支持一次性向多个渠道发送通知:
通知标题和内容支持以下模板变量:
{{date}}: 当前日期 (YYYY-MM-DD){{time}}: 当前时间 (HH:MM:SS){{datetime}}: 日期时间{{year}}, {{month}}, {{day}}: 年月日{{hour}}, {{minute}}, {{second}}: 时分秒{{timestamp}}: Unix 时间戳{{weekday}}: 星期 (英文){{weekday_cn}}: 星期 (中文)pending: 待发送sent: 已发送failed: 发送失败cancelled: 已取消paused: 已暂停(重复任务)点击"日历"标签切换到日历视图:
在"我的通知渠道"板块可以:
系统支持生成标准 iCal 格式的日历订阅:
支持从外部日历导入事件并自动创建通知任务:
POST /api/auth/register - 用户注册POST /api/auth/login - 用户登录GET /api/auth/profile - 获取当前用户信息PUT /api/auth/profile - 更新用户资料POST /api/tasks - 创建任务(支持单渠道和多渠道)GET /api/tasks - 获取任务列表(支持分页、排序、筛选)GET /api/tasks/{id} - 获取任务详情PUT /api/tasks/{id} - 更新任务DELETE /api/tasks/{id} - 取消任务GET /api/tasks/{id}/logs - 获取任务执行日志GET /api/channels - 获取支持的渠道列表GET /api/user/channels - 获取用户保存的渠道配置POST /api/user/channels - 保存新渠道配置PUT /api/user/channels/{id} - 更新渠道配置DELETE /api/user/channels/{id} - 删除渠道配置POST /api/test-notification - 测试通知发送GET /api/calendar/token - 获取日历订阅令牌POST /api/calendar/token - 生成新的订阅令牌GET /calendar/feed/{token}.ics - 日历订阅源(iCal 格式)GET /api/calendar/external - 获取外部日历列表POST /api/calendar/external - 添加外部日历DELETE /api/calendar/external/{id} - 删除外部日历POST /api/calendar/sync/{id} - 手动同步外部日历GET /api/logs - 查询执行日志GET /api/scheduler/jobs - 获取调度器任务状态GET /api/health - 系统健康检查GET /api/alerts/rules - 获取告警规则POST /api/alerts/rules - 创建告警规则PUT /api/alerts/rules/{id} - 更新告警规则DELETE /api/alerts/rules/{id} - 删除告警规则GET /api/export - 导出数据(带加密)POST /api/import - 导入数据GET /api/version - 获取系统版本GET /api/version/check - 检查更新.
├── app.py # Flask Web API 主程序
├── models.py # 数据库模型定义
├── scheduler.py # APScheduler 任务调度器
├── notifier.py # 通知发送器(封装 ANotify)
├── auth.py # 用户认证模块
├── encryption.py # 数据加密模块
├── static/
│ ├── index.html # Web 前端单页应用
│ ├── css/
│ │ ├── styles.css # 主样式文件
│ │ └── calendar.css # 日历视图样式
│ └── js/
│ ├── app.js # 主应用逻辑
│ └── calendar.js # 日历功能
├── data/
│ └── notify_scheduler.db # SQLite 数据库
├── logs/ # 日志目录
├── requirements.txt # Python 依赖
├── gunicorn_config.py # Gunicorn 配置
├── docker-compose.yml # Docker Compose 配置
├── Dockerfile # Docker 镜像配置
├── notify-scheduler.service # Systemd 服务配置
├── start.sh # 启动脚本
├── stop.sh # 停止脚本
├── config_examples.json # 渠道配置示例
├── README.md # 项目文档
└── CLAUDE.md # 开发者指南
具体见 ANotify
| 渠道 | channel 值 | 配置字段 |
|---|---|---|
| 企业微信 | wecom | corpid, corpsecret, agentid |
| 企业微信Webhook | wecom_webhook | webhook_url |
| 飞书 | feishu | appid, appsecret, receiver_type, receiver_id |
| 飞书Webhook | feishu_webhook | webhook_url |
| 钉钉Webhook | dingtalk_webhook | webhook_url |
| PushPlus | pushplus | token |
| Server酱 | serverchan | token |
| Gotify | gotify | server_url, token |
| Ntfy (ntfy.sh) | ntfy | server_url, topic |
| IYUU | iyuu | token (可选 server_url) |
| 巴法云 | bafayun | token (可选 server_url) |
# 备份数据库
cp data/notify_scheduler.db data/notify_scheduler.db.backup
# 使用 cron 定期备份
0 2 * * * cp /var/www/notify-scheduler/data/notify_scheduler.db /backup/notify_scheduler_$(date +\%Y\%m\%d).db
Q: 如何更改运行端口?
A: 修改 gunicorn_config.py 中的 bind 配置,或在 Docker Compose 中修改端口映射。
Q: 支持哪些 Python 版本?
A: Python 3.8 及以上版本。建议使用 Python 3.11。
Q: 可以同时运行多个实例吗?
A: 不建议,APScheduler 可能导致任务重复执行。如需高可用,建议使用主备模式或配置外部调度器。
Q: 重复任务的 Cron 表达式格式?
A: 支持标准 5 位格式(分 时 日 月 周)和 6 位格式(秒 分 时 日 月 周)。示例:
0 9 * * * - 每天 9:00*/5 * * * * - 每 5 分钟0 0 9 * * MON - 每周一 9:00(6位格式)Q: 如何查看系统日志?
A: 日志保存在 logs/ 目录下,或使用 docker-compose logs -f 查看容器日志。
MIT License
本项目使用 ANotify 作为通知发送库。
Content type
Image
Digest
sha256:704bd90f6…
Size
140 MB
Last updated
3 months ago
docker pull 7ommymerlin/notify-scheduler