模板
部署 sh0 内置的 171 个模板之一:一组现成的容器、卷和自动生成的密钥,由一个 YAML 文件描述。
模板目录
1.10.2 版本包含 171 个模板,编译在 sh0 二进制文件中:运行该版本的每台服务器上目录都相同,只有升级 sh0 时才会变化。模板分为 24 个类别:
| 类别 | 模板数 | 示例 |
|---|---|---|
| devtools | 20 | gitea-runner, dozzle, hoppscotch, code-server |
| productivity | 18 | baserow, excalidraw, homepage, docuseal |
| database | 17 | chroma, couchdb, cockroachdb, cassandra |
| media | 16 | immich, filebrowser, lidarr, jellyseerr |
| cms | 12 | ghost, laravel, october-cms, pocketbase |
| runtime | 10 | php-8.0, php-7.4, php-8.1, php-7.3 |
| networking | 9 | adguard-home, headscale, nginx-pm, netmaker |
| analytics | 9 | influxdb, posthog, questdb, clickhouse |
| ai | 9 | anything-llm, dify, langfuse, n8n |
| communication | 7 | cal-com, chatwoot, zulip, matrix-synapse |
| auth | 7 | authentik, authelia, keycloak, logto |
| finance | 6 | akaunting, actual-budget, invoice-ninja, erp-next |
| service | 4 | homebridge, node-red, duplicati, restic-server |
| queue | 4 | kafka, nats, rabbitmq, redpanda |
| monitoring | 4 | changedetection, uptime-kuma, jaeger, loki |
| storage | 3 | minio, seaweedfs, garage |
| search | 3 | meilisearch, opensearch, typesense |
| forum | 3 | flarum, discourse, nodebb |
| cache | 3 | dragonfly, memcached, keydb |
| 2 | stalwart, docker-mailserver | |
| ecommerce | 2 | saleor, prestashop |
| marketing | 1 | postiz |
| education | 1 | moodle |
| ai-ml | 1 | mindsdb |
sh0 templates list 会列出整个目录,包括每个模板的类别和描述。在 1.10.2 版本中,其 SERVICES 列始终显示 0;请使用 sh0 templates info <名称> 查看服务。
部分模板会在控制面板中显示提示:使用 bitnamilegacy/* 镜像的模板标有 Frozen image(这是一个不再接收安全补丁的冻结归档),MinIO 的社区重建版标有 Community image。
部署模板
在控制面板中打开 Templates,用搜索框找到模板,点击 Deploy。填写 Application Name,检查 Variables(标为 Auto-generated 的密钥会自动生成),然后点击 Deploy Template 确认。
在命令行中,sh0 templates info 会显示模板将创建的内容:
$ sh0 templates info ghost
Template: ghost
Description: Ghost publishing platform with MySQL database
Category: cms
Tags: cms, blog, publishing
Services:
- ghost (image: ghost:6-alpine, port: 2368, exposed)
- mysql (image: mysql:8, port: 3306)
Variables:
KEY REQUIRED DEFAULT DESCRIPTION
----------- -------- ------- ---------------------------
DB_PASSWORD auto - Database password for Ghost然后用 sh0 templates deploy <模板> --app-name <名称> 部署,可用 --var KEY=VALUE(可重复)自行设置变量:
$ sh0 templates deploy it-tools --app-name my-tools
[*] Deploying template 'it-tools' as 'my-tools'...
Error: Failed to parse response
Caused by:
missing field `app_id` at line 1 column 650
$ sh0 apps
NAME STATUS BRANCH PORT REPLICAS UPDATED
-------- ------- ------ ---- -------- -------
my-tools running main 80 1 14s agosh0 templates deploy 会以 Failed to parse response 结束,但服务器其实已接受请求,部署仍在进行。请用 sh0 apps 或在控制面板中确认结果,不要依赖退出码。部署后的模板会成为一个应用,其服务列在应用页面中。在 1.10.2 版本中重新部署此类应用(部署按钮或 sh0 deploy)会失败,报错 App has no repository URL configured;已在运行的服务不受影响。
变量
模板中的值可以包含 ${NAME} 占位符,部署时根据模板的 variables 列表解析:
generated: secret_32或secret_64会生成对应长度的随机密钥(分别有 143 和 26 个模板使用);也接受password。default提供未设置时使用的值;required: true表示该变量必填。${DOMAIN}无需声明:sh0 会将其替换为分配给应用的域名。
模板格式
每个模板是 sh0 源码 templates/ 目录中的一个 YAML 文件。以下是 1.10.2 版本附带的 ghost.yaml:
# Ghost -- Modern publishing platform with MySQL backend
name: ghost
description: Ghost publishing platform with MySQL database
icon: ghost
category: cms
tags:
- cms
- blog
- publishing
services:
- name: ghost
image: ghost:6-alpine
port: 2368
expose: true
env:
url: "https://${DOMAIN}"
database__client: mysql
database__connection__host: mysql
database__connection__user: ghost
database__connection__password: "${DB_PASSWORD}"
database__connection__database: ghost
NODE_ENV: production
volumes:
- ghost-data:/var/lib/ghost/content
depends_on:
- mysql
memory_mb: 512
cpu_cores: 0.5
- name: mysql
image: mysql:8
port: 3306
expose: false
env:
MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: "${DB_PASSWORD}"
volumes:
- db-data:/var/lib/mysql
memory_mb: 512
cpu_cores: 0.5
volumes:
- name: ghost-data
- name: db-data
variables:
- name: DB_PASSWORD
description: Database password for Ghost
required: true
generated: secret_32除 name、image、port、env、volumes、depends_on、memory_mb 和 cpu_cores 外,服务还接受 command 和 entrypoint。expose: true 标记主服务,即获得应用公开地址的服务;次要服务只有设置 route: true 才会获得自己的公开地址。两者都未设置的服务保持内部访问,通过服务名访问,如上例中的 mysql。
自定义模板
1.10.2 版本无法从文件或 URL 加载模板:目录就是编译进二进制文件的那一份。要部署自己的多容器栈,请使用 Docker Compose 文件。