站外存活监测

external-monitor 是独立 Python 探针,不依赖 Halo 或 Insight 进程。仅安装插件不会自动启动探针;请把它部署到另一台服务器,同主机的另一个容器无法覆盖主机宕机。

探针检查公开页面,不需要 Halo 管理员账号或密码。通知也应使用独立于 Halo 的 Webhook 或 SMTP 渠道。

Docker 部署

从源码仓库获取 external-monitor 目录,复制到独立服务器。在该目录执行:

cp .env.example .env
# 编辑 .env,填写站点地址和独立通知渠道
docker compose up -d --build
docker compose logs -f --tail=50

最小 Webhook 配置示例:

MONITOR_URL=https://your-halo.example/
EXPECTED_TEXT=
INTERVAL_SECONDS=30
TIMEOUT_SECONDS=5
FAILURE_THRESHOLD=3
RECOVERY_THRESHOLD=2
ALLOW_HTTP=false
WEBHOOK_URL=https://your-receiver.example/insight
WEBHOOK_SECRET=replace-with-your-secret

域名和密钥均为占位值,请替换后再启动。.env 含有渠道凭据,不要提交到代码仓库或分享到反馈记录。

目标地址怎么选

MONITOR_URL 应使用最终 HTTPS 地址,探针不跟随重定向,默认期望 2xx。EXPECTED_TEXT 可检查响应前 64 KiB 中的特征文字,帮助识别返回 200 的代理错误页。

站点首页可能被 CDN 缓存,建议选择能反映源站状态的专用公开地址。确实需要 HTTP 的环境可设 ALLOW_HTTP=true;HTTPS 始终验证证书。

邮件渠道

不用 Webhook 时,可填写完整 SMTP 配置:

SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=monitor@example.com
SMTP_PASSWORD=replace-with-your-password
SMTP_FROM=monitor@example.com
SMTP_TO=admin@example.com

独立探针的 SMTP 使用 STARTTLS,默认端口 587。它的配置与插件内通知设置分别维护,不能把插件内的 465 SMTPS 设置直接照搬到探针。

触发与恢复

默认每 30 秒检查一次,单次超时 5 秒。连续失败 3 次生成宕机事件,连续成功 2 次生成恢复事件;同一宕机期间不重复生成告警。

通知保存在探针自己的 SQLite 中,失败指数退避,最多尝试 5 次,重启后继续重试。Webhook 带 X-Insight-Event-Id 可用于去重;设置 WEBHOOK_SECRET 后,还带 X-Insight-Signature(SHA-256 HMAC)。

发送线程独立于检查线程,慢渠道不会推迟存活检查。新状态替代旧的待重试消息,但无法撤回已在发送的消息。网络中断时可能重复投递,成功也不代表收件人已经阅读。

查看与停止

docker compose logs --tail=50
docker compose stop

探针每 5 分钟输出一次状态,状态变化和发送失败会立即记录。Compose 中的 probe-data 卷保存事件与投递记录,重建容器时保留该卷才能继续使用历史状态。