扩缩容
应用的副本、CPU 与内存限制以及自动扩缩容,均在运行该应用的服务器上。
哪些功能需要许可证
在自己的机器上自行设置副本数和资源限制,所有方案均可使用。只有自动化功能需要许可证:
| 功能 | 方案 |
|---|---|
手动设置副本数(sh0 scale、POST …/scale) | 所有方案 |
CPU 与内存限制(PUT …/resources) | 所有方案 |
| 自动扩缩容(创建扩缩容配置、启用它、最小或最大副本数大于 1) | Business |
| 控制面板中的 Scaling 选项卡 | 仅在 Business 许可证下显示;其他方案请使用 CLI 或 API |
手动扩缩容
sh0 scale <app> <副本数> 会启动或停止容器,使应用以所需副本数运行;--status 显示配置(真实输出):
$ 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:
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 修改(真实响应):
$ 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 到机器内存总量。超出范围时,错误会给出真实数值,例如:
- 新限制作用于之后创建的容器:请重新部署应用,让运行中的容器获得新限制。
{"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 和内存使用情况调整副本数。只需创建一次配置:
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、对象存储)。
- 数据库。数据库服务器有各自的资源设置;本页只涉及应用。