定时任务监控服务Healthchecks

今天是足不出户的第 18 天

周六(4月16日)做了核酸,周日在家做的抗原,今天下午核酸。

居委会一早就通知,今天会发放第三批免费物资,是蔬菜包来着,已经有人看到在小区边上卸货了。

第一批政府免费物资是 4 月 4 号发的,第二批是 4 月 16 日发的,今天是第三批,其实算上 4 月 10 日发的口罩、抗原和莲花清瘟胶囊,今天是第四批免费物资了。

太拖沓了,本文开始于 2021 年 12 月,上周才最终完成,看来要做定时任务来检测未完成的文档了🙂


什么是 Healthchecks ?

Healthchecks 是一项 cron 作业监控服务。非常适合 cron 作业和类似 cron 的系统(systemd 计时器、Jenkins 构建作业、Windows 计划任务、wp-cron、类似 uwsgi cron 的界面、Heroku 调度程序等)。当 ping 未按时到达时,Healthchecks 会发出警报。

Healthchecks 带有 Web 仪表板、API25+ 个用于发送通知的集成、每月电子邮件报告、WebAuthn 2FA 支持、团队管理功能:项目、团队成员、只读访问。

准备

用局域网 IP 访问虽然能看到主界面,但是登录后会显示跨域问题,官方文档中 https://healthchecks.io/docs/self_hosted_dockerTLS Termination 章节写了要求,但是没给出具体配置

老苏用 Nginx Proxy Manager 做了反代,准备用域名 https://hc.laosu.ml 来访问(你要准备自己的域名,不是用老苏的)

其中 http://192.168.0.197:8000 为群晖的 IP + Healthchecks 的端口

SSL 部分都勾选了

还需在 Advanced --> Custom Nginx Configuration 中填入下面的脚本,否则和在局域网访问结果一样

  location / {
    proxy_pass              http://192.168.0.197:8000;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto https;
    proxy_set_header        Host $http_host;
  }

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 healthchecks ,选择第二个 galexrt/healthchecks,版本选择 latest

如果需要最新的版本,只能用命令行 docker pull ghcr.io/galexrt/healthchecks:main 下载,因为这个镜像自 v1.22.0 之后,不再推送到 Docker Hub

docker 文件夹中,创建一个新文件夹,并将其命名为 healthchecks,再建一个子目录 data,需要给 data 赋予 Everyone 用户 读写权限

如果这一步没做,会导致容器启动时 SQLite 数据库创建失败,最终引起 CPU 占用高居不下

文件夹装载路径说明
docker/healthchecks/data/data存放数据

端口

端口不冲突就行,不确定的话可以用命令查一下

# 查看端口占用
netstat -tunlp | grep 端口号
本地端口容器端口
25252525
80008000

环境

可变
DB_NAME/data/hc.sqlite
SECRET_KEYYOUR_SECRET_KEY
PING_EMAIL_DOMAINhc.laosu.ml,存疑
SITE_ROOThttps://hc.laosu.ml,有端口也要带上
EMAIL_HOSTsmtp.88.com
EMAIL_PORT465
EMAIL_USE_TLSTrue
EMAIL_HOST_USERwbsu2003@88.com
EMAIL_HOST_PASSWORDYOUR_PASSWORD,邮箱的第三方密码
ALLOWED_HOSTSlocalhost,*
CONTAINER_PRUNE_INTERVAL缺省为 600
DEBUG默认是 True,改为 False
  1. 系统支持 postgres, mysql, sqlite3 数据库,默认情况下使用 SQLite 数据库;
  2. 虽然设了邮箱,但老苏并没有验证过发邮件,PING_EMAIL_DOMAIN 可能应该是要设为 88.com

TZ 记得要改为 Asia/Shanghai

DEBUG 记得要改为 False,否则 Web 界面的顶部会显示 Running in debug mode, do not use in production.

更多的环境参数可以参考:https://hub.docker.com/r/galexrt/healthchecks/

运行

在浏览器中输入 https://hc.laosu.ml 就能看到主界面

创建用户

要登录还需要创建一个 Healthchecks 超级用户,需进入终端机

方法:「终端机」 => 「新增」 => 「通过命令启动」=> 「请输入一个命令」=> 「sh」

执行下面的命令

# 创建超级用户
python3 /healthchecks/manage.py createsuperuser

输入邮件和密码即可

添加项目

在浏览器中输入 https://hc.laosu.ml ,用上一步创建的账号登录,默认会把自己作为第一个监控项目

通过 Add Check 可以添加您要监控的单个服务

设置很简单,而且右上角提供了在线帮助,点 Docs 菜单随时可以查阅

应用

healthchecks 可用于提供监测服务,比如监测 Docker 的监控状况。

例如:每 60 秒用 curl 检测一次容器是否能在 10 秒内回应请求

下面是一段实现上面目的 docker-compose 示例:

  1. 将第一个 URL地址 http://localhost:80 更改为您的应用程序的 URL。可以是容器内的地址、局域网地址、也可以是公网地址,老苏用了容器内部的地址;
  2. 第二个 URL 地址 https://hc.laosu.ml/ping/<UUID>healthchecks 实例的地址。这个可以在 Healthchecks 中获得;
version: "3"
services:

  app:
    image: wbsu2003/webamp
    container_name: webamp
    ports:
      - 7080:80
	command: apk --no-cache add curl
    healthcheck:
      test:
        [
          "CMD",
          "curl",
          "-f",
          "http://localhost:80",
          "&&",
          "curl",
          "-f",
		  "--insecure",
          "https://hc.laosu.ml/ping/<UUID>"
        ]
      interval: 60s
      timeout: 10s
      retries: 6
  • intervalHealth check 时间间隔
  • timeout:当 Health check 超过此设定的时间,则会视为失败
  • retries:当 Health check 连续失败次数超过此设定时,则会将状态更改为 unhealthy
  • start-period:设置容器启动后应忽略健康检查的持续时间

【注意】:需要说明的是,镜像 wbsu2003/webamp 本身在打包的时候并没有打入 curl 命令,所以有两个办法:

  1. 重新打包镜像,需要在 Dockerfile 中增加一行命令 RUN apk -U --no-cache add ca-certificates curl

  2. 进入容器的终端机,执行 apk -U --no-cache add ca-certificates curl

老苏用了第二个方法

添加 healthchecks 之后,用 docker ps 查看 STATUS 状态会有标识

如果要查看日志,可以用 docker inspect --format='{{json .State.Health}}' webamp

或者从 portainer 中查看

过一会儿,状态会从 starting

转变为 healthy

对于 unhealthy 的容器,

或者

可以采用 Docker Autoheal 来监控和重启,不过老苏还没开始研究。

参考文档

healthchecks/healthchecks: A cron monitoring tool written in Python & Django
地址:https://github.com/healthchecks/healthchecks

Running with Docker - Healthchecks.io
地址:https://healthchecks.io/docs/self_hosted_docker/

galexrt/container-healthchecks: Simple to use Container Image for https://github.com/healthchecks/healthchecks.
地址:https://github.com/galexrt/container-healthchecks

Garrit’s Notes
地址:https://garrit.xyz/posts/2021-05-15-healthchecks-io-with-docker

[Docker] Health Check and Restart Unhealthy Container | wshs0713’s blog
地址:https://wshs0713.github.io/posts/b8226bad/

willfarrell/docker-autoheal: Monitor and restart unhealthy docker containers.
地址:https://github.com/willfarrell/docker-autoheal

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用 Java 的定时任务框架 Quartz 来监控文件是否有新增文件。以下是一个示例: 1. 首先,需要创建一个 Quartz 的 Job 类,用于实现文件监控逻辑。例如: ```java public class FileMonitorJob implements Job { private String folderPath; private List<File> currentFiles = new ArrayList<>(); @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { File folder = new File(folderPath); if (!folder.exists()) { return; } File[] files = folder.listFiles(); if (files == null || files.length == 0) { return; } List<File> newFiles = Arrays.stream(files).filter(file -> !currentFiles.contains(file)).collect(Collectors.toList()); if (!newFiles.isEmpty()) { // 处理新增文件 newFiles.forEach(file -> System.out.println("New file detected: " + file.getName())); currentFiles.addAll(newFiles); } } public void setFolderPath(String folderPath) { this.folderPath = folderPath; } } ``` 2. 接着,需要创建一个 Quartz 的 JobDetail 实例,用于指定要执行的 Job 类。例如: ```java JobDetail job = JobBuilder.newJob(FileMonitorJob.class) .withIdentity("fileMonitorJob", "fileMonitorGroup") .build(); ``` 3. 然后,需要创建一个 Quartz 的 Trigger 实例,用于指定 Job 的执行时间和间隔。例如: ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("fileMonitorTrigger", "fileMonitorGroup") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) // 每 10 秒执行一次 .repeatForever()) .build(); ``` 4. 最后,将 JobDetail 和 Trigger 注册到 Quartz 的 Scheduler 中,启动定时任务。例如: ```java SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); ``` 在这个例子中,定时任务每隔 10 秒钟执行一次 FileMonitorJob 类的 execute 方法。该方法会检查指定文件夹下是否有新增文件,如果有,则处理这些新增文件。注意,在这个例子中,currentFiles 列表用于记录当前文件夹下已有的文件,以便后续判断是否有新增文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨浦老苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值