使用 Docker 和 Traefik 搭建轻量美观的计划任务工具

news2024/11/19 8:51:58

在《轻量的定时任务工具 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


我们有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软硬件、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

相关版本说明: python版本:Python 3.6.5 PyQt5版本:PyQt5 5.11.3 PyQt5 5.11.3 是有 qsqlmysql.dll 的 但是连接mysql数据库时,还是提示 Driver not loaded Driver not loaded 算往下看 直接上代码和图片 from PyQt5.QtSql im…

啥?你不知道Lucene,这份高级学习文档你值得拥有

最近在项目中用到了solr,查阅资料知道solr是基于Lucene实现了。本着刨根问底的精神,来研究一下Lucene 啥是Lucene? Lucene是apache下的一个开源的全文本搜索引擎包。他为开发人员提供了一个简单工具包,以方便在目标系统中实现全文本搜索的…

JAVA基础——【笔记】14.集合

集合的框架体系: List等接口的实现子类有很多,仅列出常用的。 数组的不足(集合需求的出现): 集合特点: 一、Collection接口方法 1、Collection常用方法及其用法: (Collection为接口&#xff0…

C语言:二维数组的传递

目录 一、从本质了解二维数组 二、访问二维数组的方式 1、指向元素的指针 2、指向每一行的指针(指针数组) 3、指向整个数组的指针(数组指针) 三、3种二维数组的形参声明方式 1、数组法 2、数组指针法 3、指针法 在实践工程项目中&…

【数据结构笔记5】-哈夫曼树

哈夫曼树 结点的权:有某种显示含义的数值(如:表示结点的重要性等) 结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该节点上权值的乘积。 数的带权路径长度:树种所有…

人工智能如何赋能智能安防落地?

作为当下最热门的技术,人工智能基本覆盖了所有的行业,也开始成为了安防行业的“大金矿”。 人工智能赋能安防行业的确是好事,但技术同质化、产品同质化等问题开始凸显出来,并显得越发严重。人工智能将以怎样的新姿态赋能智能安防落…

广东长荣科技有限公司-Java笔试题

Java工程师笔试题目(限30分钟完成) 一、请参考图片回答以下问题。 二、如何理解面向对象编程? 三、String s new String("Hello");s s " world!";这两行代码执行后,内存是如何变化的? 四、…

ASEMI代理力特二极管LSIC2SD120A05,肖特基LSIC2SD120A05

编辑-Z 力特碳化硅肖特基二极管LSIC2SD120A05参数: 型号:LSIC2SD120A05 重复峰值反向电压(VRRM):1200V 连续正向电流(IF):5A 非重复正向浪涌电流(IFSM)&…

Java#7(this关键字和构造方法)

目录 一.就近原则和this关键字 二.构造方法 1.构造方法的格式: 2.构造方法的特点: 有参构造和无参构造​编辑 三.标准的Javabean类 一.就近原则和this关键字 func里的age离System.out.println(age);比较近,所以输出的是10;这就是就近原则,但如果我想使用的是成员变量age前…

OceanBase 首席科学家阳振坤博士入选2022 年度“CCF王选奖”

11 月 14 日,2022 年度“CCF王选奖” 评选结果公布,蚂蚁集团副总裁、 OceanBase 首席科学家阳振坤博士 入选。 “CCF王选奖” 由中国计算机学会(简称 CCF)设立于 2005 年,以我国著名计算机科学家王选先生命名&#…

高精度定时器学习(通过官方手册学习)

高精度定时器学习功能描述一般说明HRTIM引脚和内部信号时钟Timer A..E timing units翻转事件功能描述 一般说明 HRTIM可以划分为几个模块: •主定时器 •计时单元(定时器A至定时器E) •输出级 •突发模式控制器 •所有定时器共享的外部事件…

Android核心技术—内核(Linux) 的IO栈

简述 Linux的IO路径可能是Linux系统中最纷繁复杂的模块了,而它又是如此的重要,直接决定了系统的性能。 接下来我们来看一张熟悉的老图: 由图可见,从系统调用的接口再往下,Linux下的IO栈致大致有几个层次&#xff1a…

【Spring】——3、自定义TypeFilter指定@ComponentScan注解的过滤规则

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

Java中的IO流

Java中的IO流 Java中的4大IO抽象类 InputStream/OutputStream 为字节输入输出流 Reader/Writer 为字符输入输出流 InputStream OutputStream Reader Writer Java中流的概念细分 二进制文件(图片、影音)用字节流 文本信息用字符流 IO流的体系 练手案例…

HTML入门

目录1 HTML快速入门1.1 HTML 的介绍1.1.1 HTML 的组成标签属性1.2 入门案例1.2.1 案例效果1.2.2 实现步骤1.3 总结2 HTML 基本语法2.1 HTML 的注释2.2 HTML 标签2.3 HTML 的属性2.4 HTML 的特殊字符3 HTML 案例 新闻文本3.1 案例效果3.2 案例分析3.2.1 div 样式布局3.2.2 文本标…

软件测试面试真题 | Selenium 的工作原理是什么?

搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核 Selenium 通常被我们用做测试web的自动化测试工具,其实 Selenium 不仅仅是个API,它是一组工具集合,它是由三大组件组成 WebDriver: 可以模拟真正的用户去操作浏览器页面&am…

机械转码日记【24】继承

目录 前言 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 4.1构造函数 5.设计一个不能被继承的类 6.继承与…

瑞吉外卖(三) 分类管理

瑞吉外卖 分类管理瑞吉外卖 分类管理 需求分析自动填充 代码思想ThreadLocal 的 引入瑞吉外卖 分类管理 需求分析 对于当前的多个Model,存在了多个相同的字段 比如说:更新时间,创建时间, 更新人等 这些重复的业务可以通过统一的接…

已有项目eclipse开发配置步骤

已有项目eclipse开发配置步骤 前提:jdk8安装、tomcat8安装 1、eclipse打开已有项目 File->import->Existing Projects into Workspace 说明:我这里已经打开项目了 2、配置Properties 项目根目录右击->点击Properties Java Build Path -&…

【僵尸进程和文件系统调用】

目录虚拟空间物理空间僵尸进程僵尸进程产生僵尸进程的解决孤儿进程文件系统调用虚拟空间物理空间 内存与磁盘的运行速度1:20 x86 32位 4G–> 物理内存:寻址能力4G 4G供内核1G,用户态的3G, 虚拟空间4G,虚拟空间可以…