扩缩容

应用的副本、CPU 与内存限制以及自动扩缩容,均在运行该应用的服务器上。

哪些功能需要许可证

在自己的机器上自行设置副本数和资源限制,所有方案均可使用。只有自动化功能需要许可证:

功能方案
手动设置副本数(sh0 scale、POST …/scale)所有方案
CPU 与内存限制(PUT …/resources)所有方案
自动扩缩容(创建扩缩容配置、启用它、最小或最大副本数大于 1)Business
控制面板中的 Scaling 选项卡仅在 Business 许可证下显示;其他方案请使用 CLI 或 API

手动扩缩容

sh0 scale <app> <副本数> 会启动或停止容器,使应用以所需副本数运行;--status 显示配置(真实输出):

Terminal
$ sh0 scale my-api 2
my-api: scaled 1 -> 2 replica(s)

$ sh0 scale my-api --status
Scaling status for my-api:
  Current replicas:   2
  Min replicas:       1
  Max replicas:       1
  Autoscaling:        disabled
  CPU threshold:      80%
  Memory threshold:   80%
  LB policy:          round_robin
  Cooldown:           300s

通过 API:

Terminal
curl -X POST https://panel.example.com/api/v1/apps/<app-id>/scale \
  -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
  -d '{"replicas":2}'

API 接受 1 到 50 个副本;CLI 拒绝超过 10 个(“Replicas must be between 1 and 10”)。扩缩容需要在应用所属项目上拥有 developer 角色。

CPU 与内存限制

每个应用容器都带有 CPU 配额和内存限制。使用 PUT /api/v1/apps/<id>/resources 修改(真实响应):

Terminal
$ curl -X PUT https://panel.example.com/api/v1/apps/<app-id>/resources \
    -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"cpu_limit":500,"memory_limit":256}'
{"data":{"app_id":"<app-id>","autoscale_cpu_threshold":80,"autoscale_enabled":false,"autoscale_memory_threshold":80,"cooldown_seconds":300,"cpu_limit":500,"created_at":"2026-10-02 02:55:05","current_replicas":2,"id":"4930c97a-d6ab-44ac-bfd0-368d2c6ac4cd","last_scale_at":null,"lb_policy":"round_robin","max_replicas":1,"memory_limit":256,"min_replicas":1,"updated_at":"2026-10-02 02:55:05"}}
  • cpu_limit 以毫核为单位(1000 = 一个核心),memory_limit 以 MB 为单位。省略的字段保持不变;0 恢复默认值。
  • 未设置时的默认值:内存 512 MB,CPU 为机器核心数的一半(至少 0.5 核)。
  • 上下限取决于机器:CPU 从 100 毫核到核心总数,内存从 64 MB 到机器内存总量。超出范围时,错误会给出真实数值,例如:
  • 新限制作用于之后创建的容器:请重新部署应用,让运行中的容器获得新限制。
Response
{"error":{"code":"VALIDATION_ERROR","message":"memory_limit must be between 64 and 7751 MB (this machine has 7751 MB of RAM), or 0 to reset"}}

自动扩缩容

在 Business 许可证下,sh0 会根据 CPU 和内存使用情况调整副本数。只需创建一次配置:

Terminal
curl -X POST https://panel.example.com/api/v1/apps/<app-id>/scaling \
  -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
  -d '{"min_replicas":1,"max_replicas":4,"target_cpu_percent":70,"target_memory_percent":80,"cooldown_seconds":300,"enabled":true}'
  • min_replicas、max_replicas -- 1 到 50,最大值不得小于最小值。两者默认均为 1。
  • target_cpu_percent、target_memory_percent -- 10 到 100,默认 80。
  • cooldown_seconds -- 60 到 3600,默认 300:上一次扩缩容后,在此时间内不会再次操作。
  • lb_policy -- round_robin(默认)、least_conn 或 random。
  • cpu_limit、memory_limit -- 可选,含义与上下限同上。

一旦设置过资源限制,配置就已存在,再次 POST 会被拒绝(“Scaling config already exists for this app. Use PATCH to update.”)。请使用 PATCH /api/v1/apps/<id>/scaling/update 修改,所有字段均为可选。没有 Business 许可证时,拒绝响应为 403,代码为 LICENSE_REQUIRED。

Warning
sh0 scale <app> --auto 会创建一个 1 到 3 个副本的配置。如果配置已存在,它只会开启自动扩缩容并保留现有上下限:若最大值为 1(设置资源限制后留下的值),则永远不会扩容。请用 --status 检查,并通过 API 提高 max_replicas。

自动扩缩容如何决策

  • 自动扩缩容每 30 秒运行一次(sh0 serve --autoscale-interval,设为 0 则禁用),读取应用最近两分钟的 CPU 和内存指标。
  • 当平均 CPU 或平均内存超过目标值时扩容。
  • 当两项平均值都低于目标值的一半,且各自至少有 10 个样本时缩容。
  • 每次一个副本,不超出上下限,冷却期内不操作。
  • 每次运行都会检查方案:许可证失效后,自动扩缩容即停止。

负载均衡

所有副本位于相同的域名之后:Caddy 按 lb_policy 在副本间分发请求。在项目网络内,应用别名(my-api.internal)会解析到每个副本。

局限

  • 单台服务器。副本运行在托管该应用的服务器上;它们带来 CPU 并行和故障容错,而不是更多机器。
  • 挂载。通过 sh0 scale 增加的副本启动时不带应用的卷挂载。不要对写入卷的应用进行扩容。
  • 状态。同一用户的请求可能到达不同副本:请将会话和上传文件放在容器之外(数据库、Redis、对象存储)。
  • 数据库。数据库服务器有各自的资源设置;本页只涉及应用。