本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 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 ----- # 使用 Docker 和 Traefik 搭建简单美观的计划任务工具 在[《轻量的定时任务工具 Cronicle:前篇》](https://soulteary.com/2021/12/05/cronicle-a-lightweight-tool-for-timed-tasks-part-1.html)这篇文章中,我们聊过如何通过容器封装 Cronicle 这个已经迭代了七年之久的轻量计划任务工具。 本篇文章中,我们来聊聊如何将它和 Docker 以及 Traefik 一起搭配使用。 ## 写在前面 Cronicle 是一款很棒的工具,在上一篇公开的分享中,我有提到过它的各种功能,以及核心的优点:简单小巧、但不失完善功能,以及良好的体验。 在之前的文章中,使用它需要分别执行初始化和运行,在最近的文章中,除了将它升级到最新的版本之外,我也将这两个步骤进行了合并,与此同时也添加了 Traefik 的使用示例。 当然, 它也有许多软件有的问题: 1. 在当前云原生时代,软件功能架构稍显落后。 2. 由于第一点,许多社区的功能支持上能力、效率比较低:比如秒级任务支持、多语言支持、容器化支持。 在去年年中的时候,作者曾经下定决定将软件发展方向转向从零开始的 “v2” 版本,但在运作半年不到的过程中,发现 “All-in” 并不是一个最优解,于是,又将船头调转了回来,目前在缓慢的同时迭代 “v1” 和 “v2” 版本的软件。 如果你不介意使用英文界面,不需要秒级执行的任务,那么 Cronicle 对于你而言一定是一个不错的选择,尤其是当我们解决了 Docker 支持之后(技术细节见[上一篇文章](https://soulteary.com/2021/12/05/cronicle-a-lightweight-tool-for-timed-tasks-part-1.html))。 完整的代码,我开源在了这里:[https://github.com/soulteary/docker-cronicle](https://github.com/soulteary/docker-cronicle),可以自取。 ## 使用容器部署 Cronicle 在分享使用之前,我们先来了解如何使用 Docker “一键”安装、部署 Cronicle。 ### 直接使用 Docker 完成 Cronicle 的部署 如果你没有使用过 Cronicle ,可以通过下面的命令一键启动一个属于你的计划任务工具: ```bash 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`,将看的程序的登录界面: ![Cronicle 登录界面](https://attachment.soulteary.com/2022/11/17/login.png) 在登录界面分别输入默认用户名 `admin` 和密码 `admin`,就打开了工具的默认控制面板,包含了程序的运行基础状态的概览。 ![Cronicle 运行概览](https://attachment.soulteary.com/2022/11/17/dashboard.png) ### 通过 Docker Compose 部署 Cronicle 使用 Docker Compose 启动 Cronicle 也非常简单,我们先将下面的内容保存为 `docker-compose.yml`: ```yaml version: "3" services: cronicle: image: soulteary/cronicle:0.9.16 restart: always hostname: cronicle ports: - 3012: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/plugins extra_hosts: - "cronicle.lab.io:0.0.0.0" environment: - TZ=Asia/Shanghai healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:3012/api/app/ping || exit 1"] interval: 5s timeout: 1s retries: 3 logging: driver: "json-file" options: max-size: "10m" ``` 接着使用 `docker-compose up -d` 启动程序即可,使用操作和 Docker 启动方式没有区别。因为我们将命令都使用配置文件(代码)的方式进行了显式声明,在可维护性上来说,会好不少。 ## 让 Cronicle 和 Traefik 搭配使用 想要让 Cronicle 和 Traefik 一同使用,我们需要对上文中的 Compose 配置进行一些微调: ```yaml version: "3" services: cronicle: image: soulteary/cronicle:0.9.16 restart: always expose: - 3012 labels: - "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/plugins extra_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=0 healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:3012/api/app/ping || exit 1"] interval: 5s timeout: 1s retries: 3 logging: driver: "json-file" options: max-size: "10m" networks: - traefik networks: traefik: external: true ``` 将上面的内容保存为 `docker-compose.yml`,使用 `docker-compose up -d` 启动服务,然后访问我们在配置中定义的域名 `cronicle.lab.io` 就能够看到应用的 Web UI 啦。 ## 使用 Cronicle 实现一个简单的监控 在完成基础搭建之后,我们来通过 Cronicle 实现一个最常见的计划任务的场景来演示基础使用。 ### 新建周期性任务 ![Cronicle 创建任务](https://attachment.soulteary.com/2022/11/17/create-event.png) 点击界面上的 “Schedule” 标签,打开计划任务页面,点击“Add Event..”按钮,将来到创建任务的页面。 ![Cronicle 添加一个周期性调用 HTTP 请求的任务](https://attachment.soulteary.com/2022/11/17/add-schedule-job.png) 我们添加一个周期性调用 HTTP 请求的任务,在调用地址中填入我们要检测的页面地址,比如我在这里填写了国民级检测网络连接的服务:百度。 ![Cronicle 设置任务调用频率](https://attachment.soulteary.com/2022/11/17/set-schedule.png) 关于频率设置,Cronicle 的选项比较丰富,我们可以根据自己的实际需求来设置。 ![Cronicle 设置通知和串行任务](https://attachment.soulteary.com/2022/11/17/notice-and-chain.png) 在完成基础设置和触发频率后,我们需要根据自己的具体需要来设置通知方式和执行成功、执行失败后的下一步动作。我目前选择和常用的 IM 或者自己在用的推送系统联动,所以先不进行额外设置,在下文中我们会翻回来完成最后的设置。 ![Cronicle 完成任务创建](https://attachment.soulteary.com/2022/11/17/event-created.png) 保存任务后,我们再次访问 Cronicle 的控制面板,将看到大量在未来时刻会运行的任务。(未来的运行计划列表) ![Cronicle 任务列表](https://attachment.soulteary.com/2022/11/17/job-list.png) 接下来,我们来了解触发式的任务如何配置。 ### 使用触发式任务完成结果通知 ![Cronicle 创建一个触发式的任务](https://attachment.soulteary.com/2022/11/17/create-trigger-event.png) 创建触发式任务,只需要把 “Event Enabled” 关闭即可。其余内容和配置周期性任务没有太大差别,在任务内容上,我们既可以选择 HTTP 调用,又可以选择 Script 调用,还可以采用编写插件来完成我们所需要的任务。 ![Cronicle 更新任务串行配置](https://attachment.soulteary.com/2022/11/17/update-chain.png) 在完成触发式任务的配置后,我们调整上文中周期执行任务的 “Chain Reaction”,比如,当任务执行失败的时候,主动调用这个“触发式任务”,来联动我们的 IM 或者推送服务,告诉我们有程序出现了问题。 ### 验证配置好的定时任务 ![Cronicle 触发任务进行测试](https://attachment.soulteary.com/2022/11/17/trigger-test.png) 在保存任务之后,我们可以等待周期性任务自动执行,也可以手动触发任务,来验证任务执行是否符合预期。 如果想验证失败的场景,最简单的方式是将我们要检测的域名地址改成一个天然“Not Found” 的记录,随便在域名中添加点字符内容,选择一个不存在的域名地址。 如果你在上一步中完成了有效的通知配置,那么在这一步,你将会收到告警通知信息。 ## 关于 Cronicle 的项目维护插曲 去年七月的时候,Cronicle 作者在项目首页添加了一条有趣的[公告内容](https://github.com/jhuckaby/Cronicle/commit/374818641b02f53adea577d18d16f8fd3255af56),声称团队因为没有人力,以及希望能够通过完整重写项目来完成社区内积累的用户需求反馈。 出于一些原因,在去年年末,Cronicle 的作者将 “项目处于维护期间,将不再接受 Pull Request,将专注新版本 [Orchestra](https://github.com/cronicle-edge/cronicle-edge) 开发”的文档内容[移除掉了](https://github.com/jhuckaby/Cronicle/commit/c2bfdc15e6067661c9ec1f83a2f4b08d3c2ca3a3)。自此,Cronicle 原始项目恢复了正常的日常维护和更新。 这一通折腾之下,Cronicle 的用户应该流失了不少,其他开源社区或许需要引以为戒。 ## 最后 希望这篇文章,能够帮助你重新认识 Cronicle 这款优秀的软件,以及节约不必要的折腾时间。 我们下一篇文章再见。 --EOF