Docs/ 运维/ 监控与指标

监控与指标

sh0 每 10 秒采样一次服务器和每个应用容器,并保留最近一小时的数据。告警和可用性检查会在出现问题时通知您。

采集哪些数据

采集器每 10 秒读取一次 Docker 统计数据和主机数据,并存入 sh0 自己的数据库。不会向服务器外发送任何数据。

  • 服务器 -- CPU、已用内存、内存百分比、内存总量、磁盘使用量。
  • 每个运行中的应用容器 -- CPU、已用内存、内存占其限制的百分比、网络接收与发送量。

保留期

指标保留一小时。更早的样本由每小时运行一次的清理任务删除。因此在运行中的服务器上,一个序列最近一小时约有 360 个样本(真实输出):

Terminal
$ curl -s -H "Authorization: Bearer $SH0_TOKEN" \
    "https://panel.example.com/api/v1/metrics?metric_type=server_cpu" \
  | jq -c '{n:(.data|length), oldest:([.data[].recorded_at]|min), newest:([.data[].recorded_at]|max)}'
{"n":360,"oldest":"2026-10-02 02:10:27","newest":"2026-10-02 03:10:17"}

这两个值都是 sh0 serve 的选项:--metric-interval(秒,0 表示禁用采集)和 --metric-retention(秒,默认 3600)。如需修改,请编辑 sh0 服务的 ExecStart 行并重启服务。

Note
sh0 不是长期指标存储。如需数天或数周的历史,请在旁边运行专用工具(Prometheus 配合 cAdvisor 或 node_exporter、Netdata,或云服务商的监控)。

在控制面板中

  • Monitoring 的 Overview 选项卡 -- 服务器当前的 CPU、内存、磁盘和网络。
  • Apps 选项卡 -- 运行中的应用及其 CPU 和内存,可排序。
  • Uptime 选项卡 -- 可用性检查及其事件(Pro 许可证)。
  • Alerts 选项卡 -- 告警规则,提供 Create Alert 和 Test(Pro 许可证)。

指标 API

也可通过 API 获取同样的数据(一个限制为 256 MB 的应用的真实响应):

Terminal
$ curl -s -H "Authorization: Bearer $SH0_TOKEN" https://panel.example.com/api/v1/apps/<app-id>/stats
{"data":{"cpu_percent":0.0,"memory_bytes":8355840,"memory_limit_bytes":268435456,"memory_percent":3.11279296875,"network_rx_bytes":3124,"network_tx_bytes":542}}
  • GET /api/v1/metrics/server -- 服务器当前数据。
  • GET /api/v1/apps/<id>/stats -- 应用当前数据,如上所示;GET /api/v1/apps/stats 一次获取所有应用;GET /api/v1/apps/<id>/metrics -- 应用已保存的样本。
  • GET /api/v1/metrics -- 已保存的样本,可按 app_id、metric_type(cpu、memory、memory_percent、network_rx、network_tx、server_cpu、server_memory、server_memory_percent、server_disk…)和 since 过滤。

告警

告警需要 Pro 或更高级别的许可证。可在 Monitoring 的 Alerts 中创建,或通过 API 创建。channel_config 是以字符串形式传递的 JSON 对象(真实响应):

Terminal
$ curl -X POST https://panel.example.com/api/v1/alerts \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"app_id":"<app-id>","alert_type":"high_memory","threshold":90,"channel":"webhook","channel_config":"{\"url\":\"https://hooks.example.com/sh0\"}"}'
{"data":{"alert_type":"high_memory","app_id":"<app-id>","channel":"webhook","channel_config":"{\"url\":\"https://hooks.example.com/sh0\"}","created_at":"2026-10-02 03:10:54","enabled":true,"id":"ca506b3d-b91a-4ca3-941e-be42c6ad2ef3","last_fired":null,"threshold":90.0}}

带 app_id 的告警需要在该应用所属项目上拥有 developer 角色;不带 app_id 的告警作用于整台服务器,需要 admin 或 owner 角色。viewer 角色的用户能看到告警,但看不到包含凭据的 channel_config。

告警类型

  • high_cpu、high_memory -- 最新样本超过 threshold(百分比)。每 30 秒评估一次;告警触发后 5 分钟内不再重复。
  • app_down -- 最近 30 秒内没有该应用的 CPU 样本,即其容器未在运行。
  • disk_full -- 每 15 分钟按告警的 threshold 检查一次,未设置时为 80%;同一警告 6 小时内不会重发。超过 90% 时将拒绝部署。
  • deploy_failed -- 应用部署失败时发送。
  • uptime、uptime_down、uptime_up -- 由可用性检查发送(见下文)。
  • ssl_expiry -- 自 1.10.3 起:当告警所属应用的证书(未指定应用时为任意域名的证书)剩余有效天数少于阈值(默认 14)时触发。阈值单位是天,不是百分比。根据 sh0 保存在磁盘上的证书评估;*.sh0.app 地址和你自行上传的证书不在范围内。每个告警每天最多发送一次。

通知渠道

  • email -- recipients,地址列表。邮件通过为 sh0 服务配置的 SMTP 服务器发送,使用环境变量 SH0_SMTP_HOST、SH0_SMTP_PORT(默认 587)、SH0_SMTP_USER、SH0_SMTP_PASSWORD、SH0_SMTP_FROM 和 SH0_SMTP_TLS;未设置时不会发送邮件。
  • slack、discord -- webhook_url,即频道的传入 webhook 地址。
  • telegram -- bot_token 和 chat_id。
  • webhook -- url,以及可选的 secret 和 headers。sh0 发送 JSON POST;设置了密钥时,X-sh0-Signature: sha256=… 头携带请求体的 HMAC。

Test(POST /api/v1/alerts/<id>/test)通过配置的渠道发送一条示例通知;每个用户每分钟最多 10 次。

可用性检查

可用性检查以固定间隔请求某个 URL,连续失败多次时创建事件。可在应用的 Uptime 选项卡或 Monitoring 中创建:方法 GET 或 HEAD,间隔 10 到 86,400 秒,超时 1 到 30 秒,以及期望的状态码和失败阈值。可用性检查需要 Pro 许可证;其通知通过 uptime 类型的告警发送。