code.view: false en el manifiesto, ocultas las variables que te pertenecen con env_hidden y envías un enlace de uso: el cliente lo previsualiza, rellena sus propias respuestas y obtiene una aplicación que arranca, se detiene, registra logs y hace snapshots como cualquier otra, con el código sellado. En este tutorial entregas un bot a un cliente de este modo.
La plataforma aplica el sellado en su propia API, en cada ruta que lee o modifica archivos y código, no solo en el panel. No hace que tu código sea secreto para quien controle la máquina donde se ejecuta ni para el equipo de Vertra, y no puede protegerte de un fallo en tu propio código que sirva archivos. Lee Permisos para ver la lista completa de garantías.
Antes de empezar
Una plantilla de código privada que funcione, como la del primer tutorial. Las plantillas abiertas y cerradas comparten la misma estructura, así que solo cambias los permisos.
Un plan que pueda crear plantillas privadas (consulta Planes y límites).
Una segunda cuenta en la que puedas iniciar sesión. Es la única forma de ver la vista previa y la aplicación cerrada exactamente como las ve el cliente.
Qué puede y qué no puede hacer el cliente
Las bases de datos nunca están cerradas: el cliente tiene acceso completo a sus datos, como en cualquier base de datos que posea. Mantén todo lo que deba quedar fuera del alcance del cliente en tu propio código y variables, no en la base de datos.
Paso a paso
1
Decide qué es tuyo y qué es del cliente
Divide la configuración en dos. Lo que aporta el cliente (su token de Discord) se convierte en una pregunta. Lo que aportas tú (una clave de un servicio que pagas tú, o una licencia) se convierte en una variable oculta: se inyecta en la aplicación, la API nunca la devuelve y nunca se muestra en el panel. En este tutorial el bot lee
VENDOR_API_KEY, que es tuya.2
Escribe el manifiesto cerrado
Parte del manifiesto del primer tutorial y cambia tres cosas: define
code.view como false, añade la variable oculta y deja fuera todo lo que una plantilla cerrada no puede permitir.vertracloud.template.yaml
permissions.code.view: falsees lo que cierra la plantilla. La plataforma deduce el resto: sin variables libres, sin edición de comandos, sin terminal, sin guardar como plantilla, sin desvincular, sin despliegue de código.env_hiddenlista claves deenv. El valor se escribe en el manifiesto solo para que la plataforma pueda almacenarlo; una vez creada la plantilla, el manifiesto almacenado ya no lo contiene.- Lo que debes dejar fuera.
code.edit: true,env.add: true,commands.edit: trueyshare.full_copy: truese rechazan en una plantilla cerrada coninvalid_permissions, porque cada uno devolvería el código o sus secretos. No los incluyas en absoluto. - Los placeholders siguen funcionando. Las respuestas del cliente y los secretos generados entran en la aplicación como de costumbre; el código que ocultas es lo único que el cliente no puede leer.
El código cerrado y
env_hidden solo existen en plantillas privadas, y env_hidden solo en una cerrada (si no, el validador da el error invalid_permissions). Una plantilla del catálogo público siempre muestra su código, y el catálogo rechaza code.view: false y env_hidden con forbidden_in_public.3
Valida
code: { view: false, edit: true } y el hallazgo es permissions.code.edit con código invalid_permissions (“A closed template cannot let users edit its code”). Quita de nuevo la línea edit.4
Crea la plantilla
null.5
Crea el enlace de uso
Un enlace de uso da al cliente el derecho de crear aplicaciones a partir de la plantilla, con su propia copia de la imagen cuando la plantilla usa una. Para un cliente, hazlo de un solo uso y de corta duración:La CLI imprime el token una sola vez. Cópialo y envíaselo al cliente de inmediato; después solo podrás ver el final y revocarlo. En el panel, lo mismo es Plantillas, Mis plantillas, la plantilla, Enlaces para compartir, Crear enlace.También existe un enlace de copia completa, que da al receptor una plantilla propia con código e imagen. No está disponible aquí: un enlace de copia completa muestra el código, así que en una plantilla cerrada el panel dice “No disponible: plantilla cerrada” y la API rechaza la combinación del manifiesto con
invalid_permissions.6
Conoce lo que ve el cliente
El enlace abre una página de vista previa antes de crear nada. El cliente ve el autor, la versión, lo que se creará (servicios, memoria mínima, plan necesario, cupos de imagen), una insignia No verificado por Vertra y este aviso:
Código cerrado. Los valores que rellenas (por ejemplo, tu clave de OpenAI) van a un código que no puedes ver. Estás confiando en el autor.Después el cliente inicia sesión, elige dónde crear la aplicación y responde a las preguntas. La vista previa tiene un botón Denunciar para cualquiera que considere abusivo la plantilla. En la aplicación, el cliente ve la etiqueta Plantilla cerrada y la explicación de que el código pertenece al autor y qué acciones siguen abiertas.Sé honesto con tu cliente sobre la confianza que implica: el aviso anterior se le muestra por diseño.
7
Actualiza y revoca
Para corregir algo, sube Revocar detiene las nuevas creaciones y deja de ofrecer actualizaciones. Lo que el cliente ya creó sigue funcionando: le pertenece, y tú nunca puedes detener, eliminar ni leer nada en su cuenta.
version y ejecuta vertra template create --template support-bot --changelog "Describe the change". El cliente ve Nueva versión disponible y actualiza cuando quiere, con un snapshot de seguridad previo; una actualización nunca es automática. Cuando termina el contrato con el cliente, revoca el enlace:Solución de problemas
Próximos pasos
- Plantillas cerradas para quienes las usan: el lado del cliente de esta misma página.
- Recibir una plantilla por enlace: la vista previa, la copia de la imagen y el flujo de denuncia.
- Enlaces para compartir: enlaces de uso frente a enlaces de copia completa, límites y revocación.
- Permisos: cada combinación y lo que bloquea cada una.
- Buenas prácticas: dónde guardar los datos en una plantilla cerrada.
- Siguiente tutorial: de una plantilla privada al catálogo público.