Templates
Implante um dos 171 modelos embutidos no sh0: um conjunto pronto de contêineres, volumes e segredos gerados, descrito em um arquivo YAML.
O catálogo
A versão 1.10.2 traz 171 modelos, compilados no binário do sh0: o catálogo é o mesmo em todo servidor com essa versão e só muda com uma atualização do sh0. Eles estão agrupados em 24 categorias:
| Categoria | Modelos | Exemplos |
|---|---|---|
| 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 mostra todo o catálogo, com a categoria e a descrição de cada modelo. Na versão 1.10.2, a coluna SERVICES sempre mostra 0; use sh0 templates info <nome> para ver os serviços.
Alguns modelos exibem um aviso no painel: Imagem congelada quando usam imagens bitnamilegacy/*, um arquivo congelado que não recebe mais correções de segurança, e Imagem comunitária para a reconstrução comunitária do MinIO.
Implantar um modelo
No painel, abra Modelos, encontre o modelo com a caixa de busca e clique em Implantar. Informe o Nome do aplicativo, revise as Variáveis (os segredos marcados como Gerado automaticamente são criados para você) e confirme com Implantar modelo.
Pela CLI, sh0 templates info mostra o que um modelo vai criar:
$ 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 GhostDepois, sh0 templates deploy <modelo> --app-name <nome> o implanta, com --var CHAVE=VALOR (repetível) para definir você mesmo uma variável:
$ 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 termina com Failed to parse response, embora o servidor tenha aceitado a solicitação e a implantação continue. Confira o resultado com sh0 apps ou no painel em vez de confiar no código de saída.Um modelo implantado vira um aplicativo cujos serviços aparecem na sua página. Reimplantar esse aplicativo (botão de implantação ou sh0 deploy) falha na versão 1.10.2 com App has no repository URL configured; os serviços já em execução não são afetados.
Variáveis
Os valores de um modelo podem conter marcadores ${NAME}, resolvidos na implantação a partir da lista variables do modelo:
generated: secret_32ousecret_64cria um segredo aleatório desse tamanho (143 e 26 modelos os usam);passwordtambém é aceito.defaultfornece o valor usado quando você não informa nenhum;required: truetorna a variável obrigatória.${DOMAIN}não precisa ser declarado: o sh0 o substitui pelo domínio que atribui ao aplicativo.
Formato de um modelo
Cada modelo é um arquivo YAML do diretório templates/ do código-fonte do sh0. Este é o ghost.yaml distribuído na versão 1.10.2:
# 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_32Além de name, image, port, env, volumes, depends_on, memory_mb e cpu_cores, um serviço aceita command e entrypoint. expose: true marca o serviço principal, o que recebe o endereço público do aplicativo; um serviço secundário só ganha endereço público próprio com route: true. Serviços sem nenhum dos dois ficam internos e são acessados pelo nome, como mysql acima.
Seus próprios modelos
A versão 1.10.2 não consegue carregar um modelo de um arquivo ou de uma URL: o catálogo é o compilado no binário. Para implantar sua própria pilha de vários contêineres, use um arquivo Docker Compose.