CF-Cron - 基于 Cloudflare Workers 的定时任务管理系统
CF-Cron - 基于 Cloudflare Workers 的定时任务管理系统
📝 项目简介
CF-Cron 是一个基于 Cloudflare Workers 和 D1 数据库的定时任务管理系统,参考了 gocron 的设计理念。它支持 HTTP 请求类型的定时任务,并提供了完整的 Web 管理界面。
✨ 核心特性
- 定时任务管理:支持创建、编辑、删除、启用/禁用任务
- HTTP 请求支持:支持 GET、POST 请求方法
- 自定义配置:支持自定义请求头和请求体
- 完整的日志系统:任务执行日志和系统登录日志记录
- 角色权限管理:区分管理员和普通用户权限
- 响应式 Web 界面:基于 Ant Design 实现的美观界面
- 任务缓存机制:减少数据库查询,提高性能
- Token 过期处理:自动跳转到登录页面
- 任务执行资源监控:优化资源使用
🛠️ 技术栈
前端
- React + TypeScript
- Vite 构建工具
- Ant Design UI 库
- React Router 路由管理
- Fetch API HTTP 客户端
后端
- Cloudflare Workers
- Hono Web 框架
- Cloudflare D1 数据库
- JWT 认证
- Cron 表达式解析
📁 项目结构
cf-cron/
├── client/ # 前端代码
│ ├── public/ # 静态资源
│ ├── src/ # 源代码
│ │ ├── components/ # 通用组件
│ │ ├── pages/ # 页面组件
│ │ ├── App.tsx # 应用入口
│ │ └── main.tsx # 主入口
│ ├── package.json # 前端依赖
│ └── vite.config.ts # Vite 配置
├── server/ # 服务端代码
│ ├── routes/ # API 路由
│ ├── services/ # 业务逻辑
│ ├── sql/ # 数据库文件
│ ├── index.ts # 服务端入口
│ ├── package.json # 服务端依赖
│ └── wrangler.toml # Cloudflare 配置
├── .gitignore # Git 忽略文件
└── README.md # 项目文档
🚀 快速开始
1. 前提条件
- Node.js 20+ 环境
- npm 或 yarn 包管理器
- Cloudflare 账户
- Wrangler CLI 已安装 (
npm install -g wrangler)
2. 安装依赖
前端依赖
cd client
npm install
后端依赖
cd server
npm install
3. 本地开发启动
启动服务端
cd server
npm run dev -- --test-scheduled
服务端将运行在 http://127.0.0.1:8787
启动前端
cd client
npm run dev
前端将运行在 http://localhost:5173
☁️ Cloudflare 部署
1. 准备工作
- 登录 Cloudflare 账户
- 创建一个新的 Worker 项目
- 创建一个 D1 数据库(命名为
cf-cron-db)
2. 配置 Wrangler
编辑 server/wrangler.toml 文件,配置数据库绑定和JWT密钥:
name = "cf-cron"
main = "index.ts"
compatibility_date = "2025-12-08"
d1_databases = [
{
binding = "DB",
database_name = "cf-cron-db",
database_id = "" # 在Cloudflare控制台创建数据库后填入
}
]
[vars]
JWT_SECRET = "" # 填入安全的JWT密钥
[triggers]
crons = ["* * * * *"] # 每分钟触发一次检查
3. 数据库初始化
执行数据库初始化脚本:
cd server
npm run db:migrate
4. 部署服务端
cd server
npm run deploy
部署成功后,Wrangler 会返回 Worker 的 URL。
5. 配置前端 API 地址
编辑 client/.env 文件(如果不存在则创建),添加以下环境变量:
VITE_SERVER_URL=https://YOUR_WORKER_NAME.YOUR_ACCOUNT.workers.dev/api
6. 构建前端
cd client
npm run build
7. 部署前端
将 client/dist 目录部署到 Cloudflare Pages。
📊 数据库结构
users 表 - 用户信息
id(INTEGER PRIMARY KEY AUTOINCREMENT): 用户 IDusername(VARCHAR(32) UNIQUE): 用户名password(VARCHAR(64)): 密码哈希salt(VARCHAR(6)): 密码盐值email(VARCHAR(50) UNIQUE): 邮箱is_admin(TINYINT): 是否为管理员 (1=是, 0=否)status(TINYINT): 状态 (1=启用, 0=禁用)created(DATETIME): 创建时间updated(DATETIME): 更新时间
tasks 表 - 任务信息
id(INTEGER PRIMARY KEY AUTOINCREMENT): 任务 IDname(VARCHAR(32)): 任务名称level(TINYINT): 任务级别dependency_task_id(VARCHAR(64)): 依赖任务 IDdependency_status(TINYINT): 依赖状态spec(VARCHAR(64)): Cron 表达式(5位格式:分 时 日 月 星期)protocol(TINYINT): 执行协议 (1=HTTP, 其他值保留)command(VARCHAR(256)): 请求 URL(当 protocol=1 时)http_method(TINYINT): HTTP 请求方法 (1=GET, 2=POST)timeout(INTEGER): 超时时间(秒)multi(TINYINT): 是否允许多实例执行retry_times(TINYINT): 重试次数retry_interval(SMALLINT): 重试间隔(秒)notify_status(TINYINT): 通知状态notify_type(TINYINT): 通知类型notify_receiver_id(VARCHAR(256)): 通知接收者 IDnotify_keyword(VARCHAR(128)): 通知关键词tag(VARCHAR(32)): 任务标签remark(VARCHAR(100)): 任务备注status(TINYINT): 是否启用 (1=启用, 0=禁用)request_headers(TEXT): HTTP 请求头 (JSON 格式,默认:'')request_body(TEXT): HTTP 请求体 (默认:'')created(DATETIME): 创建时间deleted(DATETIME): 删除时间
🔐 初始账户
系统初始化后会创建一个默认管理员账户:
- 用户名:
admin - 密码:
123456
⚠️ 首次登录后请立即修改密码!
📖 使用指南
1. 登录系统
访问前端页面,使用默认账户登录系统。
2. 管理任务
创建任务
- 点击「任务管理」→「新建任务」
- 填写任务名称、Cron 表达式(5位格式:分 时 日 月 星期)
- 选择请求方法(GET、POST)
- 填写请求 URL
- 设置请求头和请求体(JSON 格式,如果需要)
- 选择任务状态(启用/禁用)
- 填写标签和备注(可选)
- 点击「创建」按钮
编辑任务
- 在任务列表中找到要编辑的任务
- 点击「编辑」按钮
- 修改任务信息
- 点击「更新」按钮
执行任务
- 在任务列表中找到要执行的任务
- 点击「执行」按钮
- 任务将立即执行,并在日志中记录结果
刷新缓存
- 在任务列表页面,点击「刷新缓存」按钮
- 系统将重新从数据库加载所有启用的任务到缓存中
查询缓存
- 在任务列表页面,点击「查询缓存」按钮
- 系统将显示当前缓存中的任务列表,包括任务数量、最后更新时间和缓存状态
3. 查看日志
点击「任务日志」查看所有任务的执行记录。
4. 查看登录日志
仅管理员可操作
点击「登录日志」查看所有用户的登录记录,包括用户名、登录IP和登录时间。
5. 管理用户
仅管理员可操作
- 点击「用户管理」
- 可以查看、编辑用户信息,或创建新用户
⏰ Cron 表达式格式
系统使用标准的 5 位 Cron 表达式格式(分 时 日 月 星期):
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-6) (0 表示星期日)
│ │ │ │ │
* * * * *
示例
* * * * *- 每分钟执行一次0 * * * *- 每小时执行一次0 0 * * *- 每天午夜执行一次0 0 * * 0- 每周日午夜执行一次0 0 1 * *- 每月1日午夜执行一次
🔍 常见问题排查
1. 任务不执行
- 检查任务是否已启用
- 验证 Cron 表达式是否正确
- 检查网络连接是否正常
- 查看任务日志了解详细错误信息
2. 登录失败
- 检查用户名和密码是否正确
- 确认服务端是否正常运行
- 查看浏览器控制台是否有错误信息
3. API 调用失败
- 检查前端 API 地址配置是否正确
- 确认服务端是否正常运行
- 查看浏览器网络请求详情
4. 部署到 Cloudflare 后任务不执行
- 确认
wrangler.toml中的crons配置已设置 - 检查 Cloudflare Worker 的状态
- 查看 Cloudflare 控制台的日志
🛡️ 安全建议
- 修改默认密码:首次登录后立即修改管理员密码
- 使用 HTTPS:确保所有通信都通过 HTTPS 进行
- 限制访问:考虑使用 Cloudflare Access 限制对管理界面的访问
- 定期备份:定期备份 D1 数据库
- 使用强密码:为所有用户设置强密码
- 最小权限:仅为需要管理权限的用户分配管理员角色
🤝 贡献指南
欢迎提交 Issue 和 Pull Request 来改进这个项目!
📄 许可证
MIT License
📞 联系方式
如有问题或建议,请通过 GitHub Issues 提交。
注意:本系统仅供学习和内部使用,生产环境请确保适当的安全措施。
浙公网安备 33010602011771号