Plantillas

Despliegue una de las 171 plantillas integradas en sh0: un conjunto listo para usar de contenedores, volúmenes y secretos generados, descrito en un archivo YAML.

El catálogo

La versión 1.10.2 incluye 171 plantillas, compiladas en el binario de sh0: el catálogo es el mismo en todos los servidores con esa versión y solo cambia al actualizar sh0. Se agrupan en 24 categorías:

CategoríaPlantillasEjemplos
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 muestra todo el catálogo con la categoría y la descripción de cada plantilla. En la versión 1.10.2, su columna SERVICES muestra siempre 0; use sh0 templates info <nombre> para ver los servicios.

Algunas plantillas muestran un aviso en el panel: Imagen congelada cuando usan imágenes bitnamilegacy/*, un archivo congelado que ya no recibe parches de seguridad, e Imagen comunitaria para la reconstrucción comunitaria de MinIO.

Desplegar una plantilla

En el panel, abra Plantillas, busque la plantilla con el cuadro de búsqueda y haga clic en Desplegar. Indique el Nombre de la aplicación, revise las Variables (los secretos marcados como Generado automáticamente se crean por usted) y confirme con Desplegar plantilla.

Desde la CLI, sh0 templates info muestra lo que creará una plantilla:

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

Después, sh0 templates deploy <plantilla> --app-name <nombre> la despliega, con --var CLAVE=VALOR (repetible) para fijar usted mismo una variable:

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
En la versión 1.10.2, sh0 templates deploy termina con Failed to parse response aunque el servidor ha aceptado la solicitud y el despliegue continúa. Compruebe el resultado con sh0 apps o en el panel en lugar de fiarse del código de salida.

Una plantilla desplegada se convierte en una aplicación cuyos servicios aparecen en su página. Volver a desplegar esa aplicación (botón de despliegue o sh0 deploy) falla en la versión 1.10.2 con App has no repository URL configured; los servicios que ya están en marcha no se ven afectados.

Variables

Los valores de una plantilla pueden contener marcadores ${NAME}, que se resuelven al desplegar a partir de la lista variables de la plantilla:

  • generated: secret_32 o secret_64 crea un secreto aleatorio de esa longitud (143 y 26 plantillas los usan); también se acepta password.
  • default aporta el valor que se usa si usted no indica ninguno; required: true hace obligatoria la variable.
  • ${DOMAIN} no necesita declararse: sh0 lo sustituye por el dominio que asigna a la aplicación.

Formato de una plantilla

Cada plantilla es un archivo YAML del directorio templates/ del código fuente de sh0. Este es ghost.yaml tal como se distribuye en la versión 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

Además de name, image, port, env, volumes, depends_on, memory_mb y cpu_cores, un servicio acepta command y entrypoint. expose: true marca el servicio principal, el que recibe la dirección pública de la aplicación; un servicio secundario solo obtiene su propia dirección pública con route: true. Los servicios sin ninguno de los dos son internos y se alcanzan por su nombre, como mysql arriba.

Sus propias plantillas

La versión 1.10.2 no puede cargar una plantilla desde un archivo o una URL: el catálogo es el que está compilado en el binario. Para desplegar su propia pila de varios contenedores, use un archivo Docker Compose.