定时任务监控服务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 中填入下面的脚本,否则和在局域网访问结果一样

1
2
3
4
5
6
7
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 存放数据

端口

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

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
2525 2525
8000 8000

环境

可变
DB_NAME /data/hc.sqlite
SECRET_KEY YOUR_SECRET_KEY
PING_EMAIL_DOMAIN hc.laosu.ml,存疑
SITE_ROOT https://hc.laosu.ml,有端口也要带上
EMAIL_HOST smtp.88.com
EMAIL_PORT 465
EMAIL_USE_TLS True
EMAIL_HOST_USER wbsu2003@88.com
EMAIL_HOST_PASSWORD YOUR_PASSWORD,邮箱的第三方密码
ALLOWED_HOSTS localhost,*
CONTAINER_PRUNE_INTERVAL 缺省为 600
DEBUG 默认是 Ture,改为 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」

执行下面的命令

1
2
# 创建超级用户
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 中获得;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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