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:

CategoriaModelosExemplos
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 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:

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

Depois, sh0 templates deploy <modelo> --app-name <nome> o implanta, com --var CHAVE=VALOR (repetível) para definir você mesmo uma variável:

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
Na versão 1.10.2, sh0 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_32 ou secret_64 cria um segredo aleatório desse tamanho (143 e 26 modelos os usam); password também é aceito.
  • default fornece o valor usado quando você não informa nenhum; required: true torna 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:

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

Alé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.