文档/ 部署/ 模板

模板

部署 sh0 内置的 171 个模板之一:一组现成的容器、卷和自动生成的密钥,由一个 YAML 文件描述。

模板目录

1.10.2 版本包含 171 个模板,编译在 sh0 二进制文件中:运行该版本的每台服务器上目录都相同,只有升级 sh0 时才会变化。模板分为 24 个类别:

类别模板数示例
devtools20gitea-runner, dozzle, hoppscotch, code-server
productivity18baserow, excalidraw, homepage, docuseal
database17chroma, couchdb, cockroachdb, cassandra
media16immich, filebrowser, lidarr, jellyseerr
cms12ghost, laravel, october-cms, pocketbase
runtime10php-8.0, php-7.4, php-8.1, php-7.3
networking9adguard-home, headscale, nginx-pm, netmaker
analytics9influxdb, posthog, questdb, clickhouse
ai9anything-llm, dify, langfuse, n8n
communication7cal-com, chatwoot, zulip, matrix-synapse
auth7authentik, authelia, keycloak, logto
finance6akaunting, actual-budget, invoice-ninja, erp-next
service4homebridge, node-red, duplicati, restic-server
queue4kafka, nats, rabbitmq, redpanda
monitoring4changedetection, uptime-kuma, jaeger, loki
storage3minio, seaweedfs, garage
search3meilisearch, opensearch, typesense
forum3flarum, discourse, nodebb
cache3dragonfly, memcached, keydb
email2stalwart, docker-mailserver
ecommerce2saleor, prestashop
marketing1postiz
education1moodle
ai-ml1mindsdb

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 会显示模板将创建的内容:

Terminal
$ 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(可重复)自行设置变量:

Terminal
$ 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 ago
Warning
在 1.10.2 版本中,sh0 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:

templates/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 文件。