Homepage 集成 Watchtower 容器更新监控 Widget:配置指南与 Prometheus 指标解析原理
2026/9/10 8:26:17 网站建设 项目流程

Homepage 集成 Watchtower 容器更新监控 Widget:配置指南与 Prometheus 指标解析原理

【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepage

导读

本文讲解如何在 Homepage 应用仪表盘中集成 Watchtower 为骨架,结合仓库中src/widgets/watchtower/目录下的源码与测试,深入剖析该 Widget 如何通过带 Bearer Token 的 HTTP 代理请求 Watchtower 的 Prometheus 指标端点,并把纯文本指标转换为看板数据块的全过程。读完你将能独立完成 Watchtower Widget 的配置、排错,并理解其底层实现机制。

前置条件:为 Watchtower 开启 Metrics API

Watchtower 的默认安装并不会暴露指标接口,因此在配置 Homepage Widget 之前,需要先启用 Watchtower 的 metrics 功能。官方要求 Widget 正常工作,Watchtower 必须配置为启用 metrics API(对应--metrics启动参数或WATCHTOWER_METRICS=true环境变量)。

启用后,Watchtower 会额外监听一个 HTTP 端口(默认8080),并暴露/v1/metrics端点,以 Prometheus 文本格式输出运行时指标——这正是 Homepage Widget 的数据来源。

Widget 基础配置

在 Homepage 的services.yaml中,为对应的 Watchtower 服务添加如下 Widget 配置块:

widget: type: watchtower url: http://your-ip-address:8080 key: demotoken

三个核心字段的含义如下:

字段必填说明
type固定为watchtower,用于在 src/widgets/widgets.js 的组件注册表中查找对应实现
urlWatchtower Metrics API 的访问地址,协议 + IP/域名 + 端口,如http://192.168.1.10:8080
key访问 Metrics API 所需的访问令牌,对应 Watchtower 的--metrics-token启动参数或WATCHTOWER_METRICS_TOKEN环境变量

说明:key是可选的——如果 Watchtower 未设置 token,Homepage 仍会发送Authorization: Bearer <key>请求头,但此时 key 为空即可;若 Watchtower 配置了 token,则必须在此处填写相同值,否则请求会被 Watchtower 拒绝。

数据字段:三个核心指标

该 Widget 支持三个数据字段(由文档明确限定,与前端组件一一对应):

  • containers_scanned:本次扫描检查的容器总数(对应指标watchtower_containers_scanned
  • containers_updated:本次扫描中实际完成更新的容器数量(对应指标watchtower_containers_updated
  • containers_failed:本次扫描中更新失败的容器数量(对应指标watchtower_containers_failed

这三个指标在 public/locales/en/common.json 中定义了显示标签(Scanned / Updated / Failed),前端组件据此渲染三个数据块。

源码级原理:从 Metrics 端点到看板数据块

配置之外的实现细节,全部可以在src/widgets/watchtower/目录下找到。整个数据链路分为三层。

1. Widget 定义与端点映射

widget.js 定义了 API 模板与端点映射:

const widget = { api: "{url}/{endpoint}", proxyHandler: watchtowerProxyHandler, mappings: { watchtower: { endpoint: "v1/metrics", }, }, };
  • api: "{url}/{endpoint}"是通用 API 地址模板,{url}会被替换为配置里的url{endpoint}被替换为v1/metrics,最终拼接出完整地址http://your-ip-address:8080/v1/metrics。模板替换逻辑位于 src/utils/proxy/api-helpers.js 的formatApiCall,该函数还会自动去掉url末尾的多余斜杠。
  • mappings.watchtower.endpoint指明本 Widget 唯一使用的端点是v1/metrics,即 Watchtower 官方文档中的 Prometheus 指标路径。

2. 代理处理器:请求鉴权与指标解析

proxy.js 是核心实现,其工作流程如下:

  1. 从请求参数中取出groupserviceindex,并通过getServiceWidget(来自 src/utils/config/service-helpers.js)加载该服务对应的 Widget 配置;若服务不存在,直接返回400
  2. formatApiCall拼接完整指标 URL。
  3. 通过httpProxy(来自 src/utils/proxy/http.js)发起GET请求,请求头携带Authorization: Bearer ${widget.key}——这就是文档中key字段的底层用途。
  4. 状态码非200或无数据时,记录日志并返回对应 HTTP 错误。
  5. 文本解析:Watchtower 的/v1/metrics返回的是 Prometheus 纯文本格式。代理处理器将响应体按换行拆分,仅保留以watchtower开头的行,再按空格切分,组装为{ 指标名: 值 }的 JSON 对象返回前端。

这一解析逻辑在 proxy.test.js 中有完整的单测覆盖:测试构造了包含watchtower_running 1foo 2watchtower_status 3三行的模拟响应,断言最终只保留watchtower_runningwatchtower_status两个键,并验证请求 URL 为http://watch/metrics、鉴权头为Bearer k

3. 前端组件:渲染三个数据块

component.jsx 通过useWidgetAPI(来自 src/utils/proxy/use-widget-api.js,底层基于 SWR)请求watchtower端点数据:

  • 加载中:渲染三个仅含标签(Scanned / Updated / Failed)的占位块;
  • 加载成功:分别读取watchData.watchtower_containers_scannedwatchData.watchtower_containers_updatedwatchData.watchtower_containers_failed,并用common.number国际化格式化数值后填入三个 Block;
  • 请求出错:显示错误容器。

component.test.jsx 验证了加载占位与数据渲染两种状态,确保三个数据块与指标键严格对应。

完整配置示例

结合以上分析,一个可运行的完整services.yaml配置片段如下:

- Watchtower: icon: sh-watchtower href: http://your-ip-address:8080 description: Container auto-update monitor widget: type: watchtower url: http://your-ip-address:8080 key: demotoken

若 Watchtower 未启用 token 鉴权,key字段可省略。

常见问题排查

  • 显示 HTTP Error 401/403key与 Watchtower 的WATCHTOWER_METRICS_TOKEN不一致,或该字段为空但 Watchtower 启用了 token 校验。
  • 显示 HTTP Error 404:Watchtower 未启用 metrics API(缺少--metrics/WATCHTOWER_METRICS=true),或url端口填写错误(metrics 端口默认8080,与 Watchtower 主控制端口不同)。
  • 数据一直为占位符:确认url中的 IP/端口在 Homepage 服务端可达;Homepage 的代理请求由服务端发起,而非浏览器。
  • 指标值全部为 0:属正常现象——Watchtower 的指标记录的是最近一次扫描结果,若尚未到扫描周期或扫描刚完成、无失败/更新发生,updatedfailed自然为 0。

小结

Watchtower Widget 是 Homepage 服务仪表盘中典型的「Metrics 端点 + 服务端代理 + 纯文本解析」类 Widget 代表:文档负责给出配置入口,widget.js负责端点映射,proxy.js负责 Bearer 鉴权与 Prometheus 文本解析,component.jsx负责三块指标展示,测试文件则固化了整条链路的正确性。配置时只需确保 Watchtower 开启 metrics、端口与 token 一致,即可在首页实时掌握容器自动更新的健康状态。相关实现与测试可继续查阅 src/widgets/watchtower/ 目录。

【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepage

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询