> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vertracloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Stacks de plantilla: varias apps, bases de datos y carpetas Blob en una plantilla

> Crea una plantilla multiservicio: apps, bases de datos y carpetas Blob creadas juntas y conectadas con placeholders, certificados y el modo público.

Una plantilla con dos o más servicios crea un **stack**: un recurso que agrupa las apps, las bases de datos y las carpetas Blob, las mantiene conectadas y se actualiza, se guarda en snapshot y se elimina como una unidad. No declaras el stack; existe porque `services` tiene más de una entrada (hasta 8).

Una plantilla con una sola app crea solo esa app, sin stack.

## Declara los servicios

Cada servicio es una entrada de `services`. Las apps, las bases de datos y las carpetas Blob conviven, y los placeholders las conectan:

```yaml theme={null}
services:
  app:
    source: { type: image, image: "docker.io/n8nio/n8n@sha256:942bc274709f27f99f7c6024a785d8e8f75ac06838cabcba448abb8d9127ec7b", context: . }
    port: 5678
    ram: { min: 1024, recommended: 2048 }
    web: required
    env:
      DB_POSTGRESDB_HOST: "{{services.db.host}}"
      DB_POSTGRESDB_PORT: "{{services.db.port}}"
      DB_POSTGRESDB_DATABASE: "{{services.db.database}}"
      DB_POSTGRESDB_USER: "{{services.db.user}}"
      DB_POSTGRESDB_PASSWORD: "{{services.db.password}}"
  db:
    database: postgres
    ram: { min: 1024, recommended: 1024 }
```

Todo se crea en un solo job. El orden es: validación, el stack, las bases de datos (el job espera a que estén listas), las carpetas Blob, las imágenes, las apps, las variables, los certificados, el inicio, el healthcheck y los outputs. Si falla algún paso, la plataforma elimina solo lo que creó ese job, sin snapshot de seguridad porque todavía nada contiene datos del usuario, e informa del paso y del error.

### Servicios opcionales

Haz opcional una base de datos con `when`, o activa o desactiva cualquier servicio con `sets.services` en una opción de pregunta. Un servicio desactivado no se crea y sus placeholders quedan vacíos. Así un misma plantilla ofrece «Postgres o SQLite» o «añadir workers»; consulta [Opciones y sets](https://docs.vertracloud.app/es-es/templates/create/placeholders-and-inputs.md#opciones-y-sets). La memoria de un servicio desactivado no cuenta para el plan requerido.

### Varias bases de datos del mismo motor

Puedes declarar más de una base de datos del mismo motor, por ejemplo un Redis para caché y otro para una cola. Cada una es una base de datos normal con su propia memoria tomada del plan, y cada una tiene su propio id de servicio y sus placeholders. Una base de datos pertenece a un solo stack, y varias apps del stack pueden usar la misma base de datos.

### Carpetas Blob

Un servicio `blob` da al stack la carpeta `stacks/<stack-slug>/` y una clave gestionada por la plataforma, restringida a esa carpeta. La app la lee mediante los placeholders de estilo `S3_*`. Si el usuario deshace el stack, la clave se revoca y **los archivos se conservan**. Consulta el [servicio Blob](https://docs.vertracloud.app/es-es/templates/create/manifest-reference.md#carpeta-de-blob) para ver los campos.

## Cómo se conectan los servicios

Nunca escribes una dirección. Usa `{{services.<id>.host}}` o `{{services.<id>.url}}`. La app llega a la base de datos por su dirección pública, con certificados de cliente. Un `network_mode` distinto de `public` se rechaza con `STACK_NETWORK_MODE_UNAVAILABLE`.

### Certificados

Las bases de datos exigen un certificado de cliente. La plataforma escribe los archivos en la app en `/app/.vertra/certs/<database_id>/` en cada inicio, en solo lectura, y `{{services.<id>.ssl.*_path}}` te da sus rutas absolutas:

| Archivo | Placeholder | Usado por |
| - | - | - |
| `ca.pem` | `ssl.ca_path` | Todos los motores |
| `client.crt` | `ssl.cert_path` | Postgres, MySQL, Redis |
| `client.key` | `ssl.key_path` | Postgres, MySQL, Redis |
| `client.pem` | `ssl.pem_path` | MongoDB |
| `client.p12` | `ssl.p12_path` | Prisma 6 (contraseña vacía) |

La carpeta está reservada por la plataforma: las subidas de código, las restauraciones de snapshot, los rollbacks, las descargas y «Guardar como plantilla» la omiten, de modo que una clave privada nunca viaja con el código. Si el usuario restablece los certificados de la base de datos, la plataforma reescribe los archivos y le pide que reinicie la app.

Algunos drivers no pueden recibir certificados solo por ruta. Cuando el tuyo los lee de la URL de conexión, usa `{{services.<id>.url}}`; para Prisma 6, usa `{{services.<id>.prisma_url}}`. Consulta [Conectar una app a una base de datos](https://docs.vertracloud.app/es-es/templates/use/connect-databases.md) para ver cómo lee los certificados cada driver.

### Conectar app con app

Una app llega a otra por su URL pública, así que la app llamada necesita `web: required` o `web: optional` y queda **expuesta en internet**. La plataforma no autentica la llamada: si quieres que solo se acepte tu propia app, comprueba un secreto compartido en ambos lados:

```yaml theme={null}
secrets: [internal_token]

services:
  web:
    # ...
    env:
      API_URL: "{{services.api.url}}"
      API_TOKEN: "{{secrets.internal_token}}"
  api:
    # ...
    env:
      EXPECTED_TOKEN: "{{secrets.internal_token}}"
```

Tu `api` debe rechazar una petición sin ese token.

## Variables gestionadas por el stack

Las variables que vienen de un placeholder de una base de datos, de una carpeta Blob o de una app están **gestionadas**: llevan una insignia «gestionada por el stack» y se actualizan solas cuando cambia una contraseña, un certificado o una dirección. La plataforma avisa al usuario de que la app debe reiniciarse. Editar una a mano la convierte en una variable normal.

## Actualizaciones

Un stack que vino de tu plantilla actualiza todos sus servicios juntos: un snapshot de seguridad de cada miembro, luego los servicios uno tras otro y una vuelta completa al snapshot si uno falla. Los recursos que el usuario añadió a mano al stack son ignorados por las actualizaciones. Consulta [Actualizar y hacer rollback](https://docs.vertracloud.app/es-es/templates/use/updates-and-rollback.md).

## Relacionado

> [card] [Placeholders e inputs](https://docs.vertracloud.app/es-es/templates/create/placeholders-and-inputs.md)
>
> Todos los placeholders de bases de datos y Blob.

> [card] [Stacks para usuarios](https://docs.vertracloud.app/es-es/templates/use/stacks.md)
>
> Qué ve y qué puede hacer el usuario con un stack.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.