定时任务监控服务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 仪表板、API、25+ 个用于发送通知的集成、每月电子邮件报告、WebAuthn 2FA 支持、团队管理功能:项目、团队成员、只读访问。
准备
用局域网 IP 访问虽然能看到主界面,但是登录后会显示跨域问题,官方文档中 https://healthchecks.io/docs/self_hosted_docker 的 TLS Termination 章节写了要求,但是没给出具体配置

老苏用 Nginx Proxy Manager 做了反代,准备用域名 https://hc.laosu.ml 来访问(你要准备自己的域名,不是用老苏的)
其中
http://192.168.0.197:8000为群晖的IP+Healthchecks的端口

SSL 部分都勾选了

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

安装
在群晖上以 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 | # 查看端口占用 |
| 本地端口 | 容器端口 |
|---|---|
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 |
- 系统支持
postgres,mysql,sqlite3数据库,默认情况下使用SQLite数据库;- 虽然设了邮箱,但老苏并没有验证过发邮件,
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 | # 创建超级用户 |
输入邮件和密码即可

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

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

设置很简单,而且右上角提供了在线帮助,点 Docs 菜单随时可以查阅
应用
healthchecks 可用于提供监测服务,比如监测 Docker 的监控状况。
例如:每 60 秒用 curl 检测一次容器是否能在 10 秒内回应请求
下面是一段实现上面目的 docker-compose 示例:
- 将第一个
URL地址http://localhost:80更改为您的应用程序的URL。可以是容器内的地址、局域网地址、也可以是公网地址,老苏用了容器内部的地址;- 第二个
URL地址https://hc.laosu.ml/ping/<UUID>是healthchecks实例的地址。这个可以在Healthchecks中获得;
1 | version: "3" |
interval:Health check时间间隔timeout:当Health check超过此设定的时间,则会视为失败retries:当Health check连续失败次数超过此设定时,则会将状态更改为unhealthystart-period:设置容器启动后应忽略健康检查的持续时间
【注意】:需要说明的是,镜像 wbsu2003/webamp 本身在打包的时候并没有打入 curl 命令,所以有两个办法:
重新打包镜像,需要在
Dockerfile中增加一行命令RUN apk -U --no-cache add ca-certificates curl进入容器的终端机,执行
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/healthchecksRunning 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-healthchecksGarrit’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