我做了一个轻量级定时任务平台 ChronoFlow

最近我做了一个轻量级的定时任务平台,名字叫 ChronoFlow

它的定位很简单:给内网单团队使用的轻量级任务调度系统

如果你只是想管理几十个定时任务,不想上太重的平台,又希望有 Web 页面、执行日志、手动运行、Cron 配置、任务终止、Docker 部署这些能力,那么 ChronoFlow 可能会比较适合。

项目地址:

text
复制代码
https://github.com/Honghuaijie/chronoFlow

ChronoFlow 登录页

为什么做这个项目

在很多中小型团队或者个人项目里,经常会有一些定时任务需求,比如:

  • 每隔几分钟同步一次数据
  • 每天凌晨跑统计脚本
  • 定时清理临时数据
  • 定时调用 Python 脚本生成报表
  • 手动触发某个后台任务
  • 查看任务执行日志和失败原因

这些需求一开始可能直接写在 Linux crontab 里。

但任务一多,问题就来了:

  • 不方便查看有哪些任务
  • 不方便手动运行
  • 不方便看执行日志
  • 任务失败了不直观
  • 多台机器执行脚本不好管理
  • 想终止正在运行的任务比较麻烦
  • 非运维同学不方便操作

所以我做了 ChronoFlow,希望它足够轻量,但又能覆盖日常任务调度的大部分场景。

ChronoFlow 是什么

ChronoFlow 主要由三个部分组成:

text
复制代码
UI -> Admin -> Exec ^ | | v +-- callback
  • chronoFlow-ui:调度中心前端页面
  • chronoFlow-admin:调度器后端,负责任务、执行器、日志、调度逻辑
  • chronoFlow-exec:执行器后端,负责真正执行 Shell 脚本

其中只有 Admin 连接 MySQL,Exec 不连接数据库。

Exec 执行完任务后,会通过 callback 回调 Admin,把执行结果、退出码、日志信息写回来。

目前支持的功能

ChronoFlow 第一版主要支持这些功能。

1. 执行器管理

可以在页面中新增、编辑、删除执行器。

执行器会有在线/离线状态,Admin 会定期检查执行器健康状态。

如果 Admin 和 Exec 都在 Docker Compose 里部署,执行器地址可以填写:

text
复制代码
http://chronoflow-exec:10004

image.png

2. 任务管理

支持创建任务、编辑任务、删除任务、启动调度、停止调度、手动运行。

任务可以绑定到某一个执行器上。

同一个任务默认不允许并发运行,避免同一个脚本重复执行导致数据问题。

image.png

新增任务时,可以选择执行器、配置 Cron 表达式、设置超时时间和任务说明。

image.png

3. Cron 可视化配置

页面提供了 Cron 配置弹窗,支持常见的分钟、小时、日、周、月配置,也支持手动输入 Cron 表达式。

同时会展示接下来几次运行时间,方便确认表达式是否符合预期。

image.png

4. Glue Shell

每个任务可以维护一段 Glue Shell 脚本。

例如:

bash
复制代码
#!/bin/bash set -e echo "hello chronoflow" echo "run time: $(date '+%Y-%m-%d %H:%M:%S')" python3 --version echo "done"

如果你的脚本比较复杂,也可以把 Python 文件挂载到执行器容器里,然后在 Glue Shell 里调用:

bash
复制代码
python3 /scripts/report.py

image.png

5. 异步执行和回调

Admin 下发任务后不会一直阻塞等待结果。

Exec 会异步执行脚本,执行完成后回调 Admin。

如果 Admin 临时重启或不可用,Exec 会把待回调结果临时落盘,后续继续重试。

6. 任务终止

对于长时间运行的任务,可以在页面上点击终止。

Exec 会尽量终止整个进程组,而不是只 kill 主进程。

这对 Shell 脚本里再启动 Python、子进程的场景比较重要。

7. 执行日志

MySQL 只保存日志元数据,完整日志正文保存到文件里。

这样可以避免把大量 stdout/stderr 直接塞进 MySQL,后续日志增长也更好处理。

日志里可以看到:

  • 执行状态
  • 开始时间
  • 结束时间
  • 执行耗时
  • exit code
  • 错误信息
  • Glue 快照
  • 文件日志内容

image.png

8. 运行报表

目前也做了一个简单的运行报表页面,可以看到:

  • 任务数量
  • 调度次数
  • 执行器数量
  • 最近执行成功/失败比例
  • 近 7 天执行趋势

image.png

部署方式

ChronoFlow 支持两种 Docker 部署方式。

源码构建部署

适合开发者自己修改代码后构建:

bash
复制代码
git clone https://github.com/Honghuaijie/chronoFlow.git chronoflow cd chronoflow/deploy cp .env.example .env docker compose -f docker-compose.mysql.yml up -d docker compose up -d --build

作者镜像部署

如果服务器空间比较小,不想拉完整源码,可以只复制 deploy 目录,然后使用已经发布的镜像:

env
复制代码
CHRONOFLOW_ADMIN_IMAGE=ghcr.io/honghuaijie/chronoflow-admin:v0.1.2 CHRONOFLOW_EXEC_IMAGE=ghcr.io/honghuaijie/chronoflow-exec:v0.1.2 CHRONOFLOW_UI_IMAGE=ghcr.io/honghuaijie/chronoflow-ui:latest

启动:

bash
复制代码
docker compose -f docker-compose.image.yml up -d

默认访问地址:

text
复制代码
http://127.0.0.1:5173

默认账号:

text
复制代码
admin / admin123

生产环境需要修改默认密码、JWT Secret、Callback Token、执行器 Token 和数据库密码。

技术栈

后端主要使用 Go。

整体结构分为:

  • API 层
  • Service 层
  • Biz 层
  • Data 层
  • Worker / Scheduler
  • Executor Client
  • Log Store

前端是一个 Web 调度中心,主要面向 PC 页面,不追求移动端复杂适配。

部署使用 Docker Compose,MySQL 单独拆成一个 compose 文件,避免频繁构建业务镜像时影响数据库容器。

适合什么场景

ChronoFlow 当前更适合:

  • 内网环境
  • 单团队使用
  • 几十个以内任务
  • 单调度器
  • Shell / Python 脚本调度
  • 希望轻量部署
  • 希望有 Web 页面和日志查看

它暂时不定位为大规模分布式任务调度平台,也不追求复杂的多租户、权限体系和海量任务调度能力。

第一版的一些取舍

第一版我做了一些偏轻量的选择:

  • 单调度器
  • MySQL 保存元数据
  • 日志正文保存文件
  • Exec 不连接数据库
  • 全局 callback token
  • 同一个任务不允许并发运行
  • Linux 优先,任务终止基于进程组
  • Docker 部署优先

这些选择不是为了“做少”,而是希望系统更容易部署、理解和维护。

当前状态

目前 ChronoFlow 第一版已经完成了核心功能,并且已经做过本地和线上 Docker 部署验证。

线上验证过的链路包括:

text
复制代码
UI -> Admin -> Exec -> Glue Shell -> Callback -> 执行日志

也就是说,从页面创建任务、手动运行、执行器执行脚本、回调结果、查看日志,这条主链路已经跑通。

后续计划

后续可能会继续优化这些方向:

  • 添加任务失败提醒
  • 更完善的部署文档
  • 更好的日志降噪
  • 更细的报表统计
  • 更友好的 Cron 配置体验
  • 更多执行器运行环境示例
  • GitHub Release 和镜像版本管理
  • 更完善的错误提示

总结

ChronoFlow 是我做的一个轻量级定时任务平台,目标不是替代大型调度系统,而是解决一些更日常、更直接的内网任务调度问题。

如果你也有类似需求,比如想把 crontab、Shell 脚本、Python 脚本统一放到一个 Web 平台里管理,可以试试这个项目。

项目地址:

text
复制代码
https://github.com/Honghuaijie/chronoFlow

欢迎体验、反馈和交流。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
hhj
下载 APP