在《轻量的定时任务工具 Cronicle:前篇》这篇文章中,我们聊过如何通过容器封装 Cronicle 这个已经迭代了七年之久的轻量计划任务工具。
本篇文章中,我们来聊聊如何将它和 Docker 以及 Traefik 一起搭配使用。
Cronicle 是一款很棒的工具,在上一篇公开的分享中,我有提到过它的各种功能,以及核心的优点:简单小巧、但不失完善功能,以及良好的体验。
在之前的文章中,使用它需要分别执行初始化和运行,在最近的文章中,除了将它升级到最新的版本之外,我也将这两个步骤进行了合并,与此同时也添加了 Traefik 的使用示例。
当然, 它也有许多软件有的问题:
在去年年中的时候,作者曾经下定决定将软件发展方向转向从零开始的 “v2” 版本,但在运作半年不到的过程中,发现 “All-in” 并不是一个最优解,于是,又将船头调转了回来,目前在缓慢的同时迭代 “v1” 和 “v2” 版本的软件。
如果你不介意使用英文界面,不需要秒级执行的任务,那么 Cronicle 对于你而言一定是一个不错的选择,尤其是当我们解决了 Docker 支持之后(技术细节见上一篇文章)。
完整的代码,我开源在了这里:https://github.com/soulteary/docker-cronicle,可以自取。
在分享使用之前,我们先来了解如何使用 Docker “一键”安装、部署 Cronicle。
如果你没有使用过 Cronicle ,可以通过下面的命令一键启动一个属于你的计划任务工具:
docker run \-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \-v `pwd`/data/data:/opt/cronicle/data:rw \-v `pwd`/data/logs:/opt/cronicle/logs:rw \-v `pwd`/data/plugins:/opt/cronicle/plugins:rw \-p 3012:3012 -d \--hostname cronicle \--name cronicle \soulteary/cronicle
当程序运行完毕,我们打开浏览器,访问 http://localhost:3012
,将看的程序的登录界面:
在登录界面分别输入默认用户名 admin
和密码 admin
,就打开了工具的默认控制面板,包含了程序的运行基础状态的概览。
使用 Docker Compose 启动 Cronicle 也非常简单,我们先将下面的内容保存为 docker-compose.yml
:
version: "3"services:cronicle:image: soulteary/cronicle:0.9.16restart: alwayshostname: cronicleports:- 3012:3012volumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- ./data/data:/opt/cronicle/data- ./data/logs:/opt/cronicle/logs- ./data/plugins:/opt/cronicle/pluginsextra_hosts:- "cronicle.lab.io:0.0.0.0"environment:- TZ=Asia/Shanghaihealthcheck:test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:3012/api/app/ping || exit 1"]interval: 5stimeout: 1sretries: 3logging:driver: "json-file"options:max-size: "10m"
接着使用 docker-compose up -d
启动程序即可,使用操作和 Docker 启动方式没有区别。因为我们将命令都使用配置文件(代码)的方式进行了显式声明,在可维护性上来说,会好不少。
想要让 Cronicle 和 Traefik 一同使用,我们需要对上文中的 Compose 配置进行一些微调:
version: "3"services:cronicle:image: soulteary/cronicle:0.9.16restart: alwaysexpose:- 3012labels:- "traefik.enable=true"- "traefik.docker.network=traefik"# - "traefik.http.routers.cronicle-web.middlewares=redir-https@file"- "traefik.http.routers.cronicle-web.entrypoints=http"- "traefik.http.routers.cronicle-web.rule=Host(`cronicle.lab.io`)"- "traefik.http.routers.cronicle-ssl.tls=true"# - "traefik.http.routers.cronicle-ssl.middlewares=gzip@file"- "traefik.http.routers.cronicle-ssl.entrypoints=https"- "traefik.http.routers.cronicle-ssl.rule=Host(`cronicle.lab.io`)"- "traefik.http.services.cronicle-backend.loadbalancer.server.scheme=http"- "traefik.http.services.cronicle-backend.loadbalancer.server.port=3012"volumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- ./data/data:/opt/cronicle/data- ./data/logs:/opt/cronicle/logs- ./data/plugins:/opt/cronicle/pluginsextra_hosts:- "cronicle.lab.io:0.0.0.0"environment:- TZ=Asia/Shanghai- HOSTNAME=cronicle.lab.io- CRONICLE_foreground=1- CRONICLE_echo=1- CRONICLE_base_app_url=http://cronicle.lab.io:3012- CRONICLE_web_socket_use_hostnames=1- CRONICLE_server_comm_use_hostnames=1- CRONICLE_WebServer__http_port=3012- CRONICLE_WebServer__http_bind_address=0.0.0.0- CRONICLE_WebServer__https=0- CRONICLE_web_direct_connect=0healthcheck:test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:3012/api/app/ping || exit 1"]interval: 5stimeout: 1sretries: 3logging:driver: "json-file"options:max-size: "10m"networks:- traefiknetworks:traefik:external: true
将上面的内容保存为 docker-compose.yml
,使用 docker-compose up -d
启动服务,然后访问我们在配置中定义的域名 cronicle.lab.io
就能够看到应用的 Web UI 啦。
在完成基础搭建之后,我们来通过 Cronicle 实现一个最常见的计划任务的场景来演示基础使用。
点击界面上的 “Schedule” 标签,打开计划任务页面,点击“Add Event…”按钮,将来到创建任务的页面。
我们添加一个周期性调用 HTTP 请求的任务,在调用地址中填入我们要检测的页面地址,比如我在这里填写了国民级检测网络连接的服务:百度。
关于频率设置,Cronicle 的选项比较丰富,我们可以根据自己的实际需求来设置。
在完成基础设置和触发频率后,我们需要根据自己的具体需要来设置通知方式和执行成功、执行失败后的下一步动作。我目前选择和常用的 IM 或者自己在用的推送系统联动,所以先不进行额外设置,在下文中我们会翻回来完成最后的设置。
保存任务后,我们再次访问 Cronicle 的控制面板,将看到大量在未来时刻会运行的任务。(未来的运行计划列表)
接下来,我们来了解触发式的任务如何配置。
创建触发式任务,只需要把 “Event Enabled” 关闭即可。其余内容和配置周期性任务没有太大差别,在任务内容上,我们既可以选择 HTTP 调用,又可以选择 Script 调用,还可以采用编写插件来完成我们所需要的任务。
在完成触发式任务的配置后,我们调整上文中周期执行任务的 “Chain Reaction”,比如,当任务执行失败的时候,主动调用这个“触发式任务”,来联动我们的 IM 或者推送服务,告诉我们有程序出现了问题。
在保存任务之后,我们可以等待周期性任务自动执行,也可以手动触发任务,来验证任务执行是否符合预期。
如果想验证失败的场景,最简单的方式是将我们要检测的域名地址改成一个天然“Not Found” 的记录,随便在域名中添加点字符内容,选择一个不存在的域名地址。
如果你在上一步中完成了有效的通知配置,那么在这一步,你将会收到告警通知信息。
去年七月的时候,Cronicle 作者在项目首页添加了一条有趣的公告内容,声称团队因为没有人力,以及希望能够通过完整重写项目来完成社区内积累的用户需求反馈。
出于一些原因,在去年年末,Cronicle 的作者将 “项目处于维护期间,将不再接受 Pull Request,将专注新版本 Orchestra 开发”的文档内容移除掉了。自此,Cronicle 原始项目恢复了正常的日常维护和更新。
这一通折腾之下,Cronicle 的用户应该流失了不少,其他开源社区或许需要引以为戒。
希望这篇文章,能够帮助你重新认识 Cronicle 这款优秀的软件,以及节约不必要的折腾时间。
我们下一篇文章再见。
–EOF
我们有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。
在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴,欢迎阅读下面的内容,扫码添加好友。
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
本文作者: 苏洋
创建时间: 2022年11月17日
统计字数: 6020字
阅读时间: 13分钟阅读
本文链接: https://soulteary.com/2022/11/17/use-docker-and-traefik-to-build-a-lightweight-and-beautiful-scheduled-task-tool.html