应用与服务
应用是您管理的配置;它运行的容器即服务。本页介绍两者的关系、应用的设置项以及 sh0 的默认行为。
应用与服务
- 应用:持久化的配置。其来源、设置、环境变量、域名和资源限制在每次部署后都会保留。
- 服务:由一次部署创建的容器,命名为
sh0-<stack-id 前缀>-<app>-<deployment-id 前缀>。每次部署都会新建一个;只有新容器健康并完成路由后,旧容器才会被停止并删除。
应用状态
应用会显示以下状态之一:
| 状态 | 含义 |
|---|---|
| inactive | 已创建,从未部署。 |
| building | 部署正在构建镜像或启动容器。 |
| running | 容器已通过健康检查并接收流量。 |
| stopped | 被用户停止(sh0 stop 或控制面板)。 |
| failed | 最近一次部署失败。之前部署中仍在运行的容器会继续提供服务。 |
创建应用
在 Stack 中点击 Add App 会打开预选了该 Stack 的 Deploy 页面。应用可以来自 Docker 镜像、Git 仓库、上传的归档、Dockerfile、Docker Compose 文件、框架模板或模板目录。在终端中,sh0 push 会上传当前目录并部署。
应用设置
应用的 Settings 标签页包含以下字段,点击 Save Changes 保存:
| 字段 | 说明 |
|---|---|
| 应用名称 | 应用标识,也是它在 Stack 内的主机名(<name> 和 <name>.internal)。 |
| Repository URL、Branch | Git 应用:仓库地址和要部署的分支。 |
| Build Path、Dockerfile | 构建所用的子目录及 Dockerfile。没有 Dockerfile 时,sh0 会检测技术栈并自动生成。 |
| 端口 | 应用在容器内监听的端口,公网流量会路由到该端口。 |
| Replicas、Start order、Project | 容器数量、整体部署 Stack 时的启动顺序,以及应用所属的 Stack。 |
没有构建命令或启动命令字段:由 Dockerfile 决定。构建参数即标记为构建时的环境变量,参见环境变量。
资源限制
每个应用容器都有 CPU 和内存限制,适用于所有安装,无论是否有许可证:
| 字段 | 默认值 | 允许范围 |
|---|---|---|
| CPU | 主机核数的一半,至少 0.5 | cpu_limit,单位为毫核(1000 = 1 核),范围 100 至主机核数 |
| 内存 | 512 MB | memory_limit,单位 MB,范围 64 至主机内存 |
在应用的 Scaling 标签页的 Resource Limits 中修改,然后点击 Save Configuration。通过 API 时两个值都是整数,0 表示恢复默认值。像 "512m" 这样的字符串会被以 422 拒绝。
$ curl -s -X PUT https://panel.example.com/api/v1/apps/e17d4314-ff61-485a-a509-58b3974c1eee/resources \
-H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
-d '{"cpu_limit":500,"memory_limit":256}'
{"data":{"app_id":"e17d4314-ff61-485a-a509-58b3974c1eee","autoscale_cpu_threshold":80,"autoscale_enabled":false,"autoscale_memory_threshold":80,"cooldown_seconds":300,"cpu_limit":500,"created_at":"2026-10-02 02:52:11","current_replicas":1,"id":"64433fb7-a676-4257-8c78-474d2fb961fd","last_scale_at":null,"lb_policy":"round_robin","max_replicas":1,"memory_limit":256,"min_replicas":1,"updated_at":"2026-10-02 03:04:09"}}新限制在下一次部署时生效,在此之前运行中的容器保持旧限制。在测试应用上观察到:重新部署前容器仍为 512 MB 和 2 核(4 核主机),之后为 256 MB 和 0.5 核:
$ docker inspect <container> --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}'
536870912 2000000000
$ sh0 deploy my-api
[*] Deploying my-api...
Deployment ID: 9b98d35b-0751-490e-88e8-f089fb0a6007
Status: queued
$ docker inspect <new-container> --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}'
268435456 500000000 Warning
超出内存限制的容器会被内核杀死(OOMKilled)。如果发生在部署过程中,部署会立即失败,而不是等到健康检查超时。请提高限制或降低应用的内存占用。
重启策略
每个应用容器都使用 Docker 策略 unless-stopped:除非您主动停止,否则崩溃或主机重启后 Docker 都会重新启动它。该策略不可配置。
部署健康检查
在把流量切到新容器之前,sh0 会等待其健康,最长 300 秒。检查方式自动选择,没有可配置项:
- 如果镜像定义了 Docker
HEALTHCHECK,sh0 会使用它。 - 否则,对于 Web 应用,必须能成功建立到应用端口的 TCP 连接。不会检查 HTTP 路径。
- Worker(无端口)在持续运行 15 秒且未重启后即视为健康。
Note
崩溃循环或内存不足被杀会让部署立即失败。部署失败时,旧容器不会被停止,会继续提供服务。