暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

定时任务监控服务Healthchecks

各种折腾 2022-04-18
1031

今天是足不出户的第 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
中填入下面的脚本,否则和在局域网访问结果一样

  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 端口号

本地端口容器端口
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
默认是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

  • interval
    Health 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

@所有人:写文不易,如果你都看到了这里,请点个
在看
,分享给更多的朋友;为确保你能收到每一篇文章,请主页右上角设置星标。

文章转载自各种折腾,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论