监控与指标
sh0 每 10 秒采样一次服务器和每个应用容器,并保留最近一小时的数据。告警和可用性检查会在出现问题时通知您。
采集哪些数据
采集器每 10 秒读取一次 Docker 统计数据和主机数据,并存入 sh0 自己的数据库。不会向服务器外发送任何数据。
- 服务器 -- CPU、已用内存、内存百分比、内存总量、磁盘使用量。
- 每个运行中的应用容器 -- CPU、已用内存、内存占其限制的百分比、网络接收与发送量。
保留期
指标保留一小时。更早的样本由每小时运行一次的清理任务删除。因此在运行中的服务器上,一个序列最近一小时约有 360 个样本(真实输出):
$ 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 行并重启服务。
在控制面板中
- Monitoring 的 Overview 选项卡 -- 服务器当前的 CPU、内存、磁盘和网络。
- Apps 选项卡 -- 运行中的应用及其 CPU 和内存,可排序。
- Uptime 选项卡 -- 可用性检查及其事件(Pro 许可证)。
- Alerts 选项卡 -- 告警规则,提供 Create Alert 和 Test(Pro 许可证)。
指标 API
也可通过 API 获取同样的数据(一个限制为 256 MB 的应用的真实响应):
$ 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 对象(真实响应):
$ 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 发送 JSONPOST;设置了密钥时,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 类型的告警发送。