《轻量的定时任务工具 Cronicle:前篇》这篇文章中,我们聊过如何通过容器封装 Cronicle 这个已经迭代了七年之久的轻量计划任务工具。

本篇文章中,我们来聊聊如何将它和 Docker 以及 Traefik 一起搭配使用。

写在前面

Cronicle 是一款很棒的工具,在上一篇公开的分享中,我有提到过它的各种功能,以及核心的优点:简单小巧、但不失完善功能,以及良好的体验。

在之前的文章中,使用它需要分别执行初始化和运行,在最近的文章中,除了将它升级到最新的版本之外,我也将这两个步骤进行了合并,与此同时也添加了 Traefik 的使用示例。

当然, 它也有许多软件有的问题:

  1. 在当前云原生时代,软件功能架构稍显落后。
  2. 由于第一点,许多社区的功能支持上能力、效率比较低:比如秒级任务支持、多语言支持、容器化支持。

在去年年中的时候,作者曾经下定决定将软件发展方向转向从零开始的 “v2” 版本,但在运作半年不到的过程中,发现 “All-in” 并不是一个最优解,于是,又将船头调转了回来,目前在缓慢的同时迭代 “v1” 和 “v2” 版本的软件。

如果你不介意使用英文界面,不需要秒级执行的任务,那么 Cronicle 对于你而言一定是一个不错的选择,尤其是当我们解决了 Docker 支持之后(技术细节见上一篇文章)。

完整的代码,我开源在了这里:https://github.com/soulteary/docker-cronicle,可以自取。

使用容器部署 Cronicle

在分享使用之前,我们先来了解如何使用 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,将看的程序的登录界面:

Cronicle 登录界面

在登录界面分别输入默认用户名 admin 和密码 admin,就打开了工具的默认控制面板,包含了程序的运行基础状态的概览。

Cronicle 运行概览

通过 Docker Compose 部署 Cronicle

使用 Docker Compose 启动 Cronicle 也非常简单,我们先将下面的内容保存为 docker-compose.yml

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 配置进行一些微调:

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 创建任务

点击界面上的 “Schedule” 标签,打开计划任务页面,点击“Add Event..”按钮,将来到创建任务的页面。

Cronicle 添加一个周期性调用 HTTP 请求的任务

我们添加一个周期性调用 HTTP 请求的任务,在调用地址中填入我们要检测的页面地址,比如我在这里填写了国民级检测网络连接的服务:百度。

Cronicle 设置任务调用频率

关于频率设置,Cronicle 的选项比较丰富,我们可以根据自己的实际需求来设置。

Cronicle 设置通知和串行任务

在完成基础设置和触发频率后,我们需要根据自己的具体需要来设置通知方式和执行成功、执行失败后的下一步动作。我目前选择和常用的 IM 或者自己在用的推送系统联动,所以先不进行额外设置,在下文中我们会翻回来完成最后的设置。

Cronicle 完成任务创建

保存任务后,我们再次访问 Cronicle 的控制面板,将看到大量在未来时刻会运行的任务。(未来的运行计划列表)

Cronicle 任务列表

接下来,我们来了解触发式的任务如何配置。

使用触发式任务完成结果通知

Cronicle 创建一个触发式的任务

创建触发式任务,只需要把 “Event Enabled” 关闭即可。其余内容和配置周期性任务没有太大差别,在任务内容上,我们既可以选择 HTTP 调用,又可以选择 Script 调用,还可以采用编写插件来完成我们所需要的任务。

Cronicle 更新任务串行配置

在完成触发式任务的配置后,我们调整上文中周期执行任务的 “Chain Reaction”,比如,当任务执行失败的时候,主动调用这个“触发式任务”,来联动我们的 IM 或者推送服务,告诉我们有程序出现了问题。

验证配置好的定时任务

Cronicle 触发任务进行测试

在保存任务之后,我们可以等待周期性任务自动执行,也可以手动触发任务,来验证任务执行是否符合预期。

如果想验证失败的场景,最简单的方式是将我们要检测的域名地址改成一个天然“Not Found” 的记录,随便在域名中添加点字符内容,选择一个不存在的域名地址。

如果你在上一步中完成了有效的通知配置,那么在这一步,你将会收到告警通知信息。

关于 Cronicle 的项目维护插曲

去年七月的时候,Cronicle 作者在项目首页添加了一条有趣的公告内容,声称团队因为没有人力,以及希望能够通过完整重写项目来完成社区内积累的用户需求反馈。

出于一些原因,在去年年末,Cronicle 的作者将 “项目处于维护期间,将不再接受 Pull Request,将专注新版本 Orchestra 开发”的文档内容移除掉了。自此,Cronicle 原始项目恢复了正常的日常维护和更新。

这一通折腾之下,Cronicle 的用户应该流失了不少,其他开源社区或许需要引以为戒。

最后

希望这篇文章,能够帮助你重新认识 Cronicle 这款优秀的软件,以及节约不必要的折腾时间。

我们下一篇文章再见。

–EOF