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 deservices. Las apps, las bases de datos y las carpetas Blob conviven, y los placeholders las conectan:
Servicios opcionales
Haz opcional una base de datos conwhen, 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. 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 servicioblob 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 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:
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 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 necesitaweb: 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:
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.Relacionado
Placeholders e inputs
Todos los placeholders de bases de datos y Blob.
Stacks para usuarios
Qué ve y qué puede hacer el usuario con un stack.