Control de licencias (License Server)
¿Para qué sirve?
Este capítulo es distinto a todos los anteriores: no es para quien usa el sistema, sino para quien lo entrega a sus clientes. El plugin se instala únicamente en el hosting del proveedor —nunca en el de un cliente— y desde ahí controla todas las instalaciones del framework repartidas por ahí:
- Dar de alta un cliente nuevo.
- Suspender o dar de baja su acceso al panel de forma remota.
- Elegir qué plugins puede usar cada uno.
- Publicar actualizaciones que solo descargan los clientes con licencia activa.
¿Cuándo lo necesitas?
Solo si eres el proveedor que distribuye instalaciones a múltiples clientes. Si eres un cliente final, este módulo no debería aparecer en tu CMS.
:::info Suspender no apaga el sitio del cliente
Si suspendes una instalación, lo único que se bloquea es el panel de administración (el /cms). El sitio web público del cliente sigue funcionando con normalidad, así que sus visitantes nunca ven nada raro.
:::
Los tres tipos de instalación
Toda instalación del framework sabe qué papel cumple. Ese papel se escribe una sola vez en cms/config.php (línea license.role) y decide qué puede hacer cada una:
| Tipo | Dónde vive | Qué puede hacer |
|---|---|---|
| server (tu servidor) | Tu hosting, el del proveedor. Es una sola. | Es la única que tiene el panel de licencias: da de alta clientes, los suspende y publica actualizaciones. También puede armar paquetes de cliente. |
| workstation (tu taller) | Tu computador de trabajo, o los de tu equipo. Pueden ser varios. | Ahí armas los sistemas de tus clientes y creas sus paquetes. No tiene panel de licencias ni guarda datos de tus clientes. |
| client (tu cliente) | El hosting de cada cliente que atiendes. | Solo usar el sistema. No ve el panel de licencias ni puede crear paquetes de cliente. |
Cómo activarlo
El plugin solo se registra si su carpeta existe en la instalación. Los paquetes de cliente excluyen esa carpeta, así que un cliente ni siquiera lo ve en el selector. Además exige license.role = server para activarse.
Configuración inicial
En License Server → Configuración:
- Generar claves: se hace una sola vez, la primera vez que usas el plugin. Son las claves de firma con las que el servidor "sella" cada licencia.
Dar de alta un cliente, paso a paso
- Presiona Registrar instalación y escribe el nombre del cliente y el dominio autorizado (
cafeteria-aroma.cl). El sistema genera la clave de licencia. - Marca con las casillas qué plugins tendrá ese cliente. Puedes cambiarlo cuando quieras: en su próxima validación el cliente recibe la lista actualizada.
- Copia los tres valores que te muestra la pantalla al archivo
cms/config.phpdel cliente:- Dirección del servidor de licencias (
server_url). - Clave de licencia (
key). - Clave pública de la flota (
public_key).
- Dirección del servidor de licencias (
- Listo. La instalación del cliente se valida sola una vez al día; no hay que hacer nada más.
Si empaquetas el sistema para ese cliente en modo cliente (ver Empaquetar y desplegar), esos tres valores los escribes una sola vez al crear el paquete y el sistema del cliente ya llega configurado.
:::warning Sin licencia válida, el panel del cliente no abre
Una instalación entregada como client necesita su licencia para funcionar. Si la licencia falta, venció o la suspendiste, su panel muestra el aviso y no deja entrar. El sitio público del cliente sigue online y sus visitantes no notan nada.
Cuidado con el atajo que a alguien se le puede ocurrir: borrar los datos de licencia no libera el panel, lo deja bloqueado igual. La única llave es una licencia válida emitida por ti. :::
El panel de la flota
La tabla de instalaciones muestra de un vistazo cómo está cada cliente:
| Cliente | Dominio | Estado | Versión | Última validación |
|---|---|---|---|---|
| Cafetería Aroma | cafeteria-aroma.cl | Activa | 1.10.0 | hace 6 horas |
| Servicios de Aseo Brillo | aseobrillo.cl | Activa | 1.10.0 | hace 1 día |
| Ferretería El Tornillo | eltornillo.cl | Activa | 1.7.0 | hace 4 días |
| Vivero Las Rosas | viverolasrosas.cl | Suspendida | 1.6.2 | hace 12 días |
El semáforo de última validación
| Color | Qué significa |
|---|---|
| 🟢 Verde | La instalación validó hace menos de 2 días. Todo normal. |
| 🟡 Amarillo | Su última validación fue hace 2 a 7 días. Vale la pena vigilarla. |
| 🔴 Rojo | Lleva más de 7 días sin validar, o no ha validado nunca. Revisa la instalación del cliente. |
La tabla también muestra la versión instalada de cada cliente —así sabes quién quedó atrasado— y te avisa si una licencia se está usando desde un dominio distinto al autorizado.
Publicar una actualización
- Antes de venir aquí, crea el archivo en Configuración → Empaquetado eligiendo Paquete de actualización. Es el único tipo que se puede publicar.
- Presiona Publicar versión e indica el número (
1.10.1). - Escribe la lista de cambios en palabras que tus clientes entiendan.
- Sube el
.zipde la actualización. Si es muy grande, indica una ruta en el servidor donde ya lo dejaste. - Guarda. El checksum de seguridad se calcula solo: sirve para que cada cliente compruebe que el paquete llegó íntegro.
Desde ese momento, los clientes con licencia activa ven la nueva versión en Configuración → Actualizaciones y pueden descargarla. Los suspendidos, no.
:::warning Solo se acepta el "Paquete de actualización"
Al guardar, el sistema abre el .zip y comprueba de qué tipo es. Si le pasas un paquete propio o un paquete de cliente, lo rechaza — esos llevan base de datos y archivos, y publicarlos entregaría datos de otra instalación a cada cliente. Vuelve a empaquetar eligiendo Paquete de actualización.
:::
Dos candados que el sistema pone por ti
| Si intentas… | El sistema lo impide, porque… |
|---|---|
| Restaurar un paquete de cliente sobre tu servidor de licencias | Reemplazaría la base de datos entera, y un paquete de cliente no trae el panel de licencias: perderías el registro de todos tus clientes y sus claves. |
| Publicar como actualización un paquete que no es de actualización | Una actualización copia los archivos encima de cada cliente. Si llevara base de datos, cada cliente terminaría con datos de otra instalación. |
Si el servidor de licencias se cae
Nada grave: cada instalación sigue funcionando 7 días por su cuenta (el período de gracia), mostrando un aviso discreto pero sin bloquearse. Te da tiempo de sobra para levantar el servidor sin que ningún cliente se entere.
Seguridad técnica
- Estados firmados (RS256): cada validación devuelve un JWT firmado con RSA-2048. El cliente verifica con la clave pública de la flota. No se puede fabricar un estado "activo" sin la llave privada.
- Estado atado a la clave local: el JWT queda vinculado a la clave local del cliente, así que copiar el JWT entre instalaciones no sirve.
- Gracia offline de 7 días anclada al
iatdel servidor (mover el reloj local no revive un estado vencido). - Sin enumeración de claves: clave desconocida y dominio no autorizado devuelven la misma forma firmada (
sta: invalid).
Se conecta con
core/license_client.phpycore/license_engine.php— contrapartes en la instalación cliente (viajan con el framework, no son plugin).cms/views/template.php,cms/ajax/session-init.phpyplugins/plugins-loader.php— 3 puntos de enforcement independientes.
Preguntas frecuentes
¿Los clientes pueden eludir la validación? No. Sin la llave privada del proveedor no se puede fabricar un estado "activo". Y el estado queda atado a la clave local, así que no se puede copiar entre instalaciones.
¿Puedo revocar una licencia y volver a activarla? Sí, desde el panel. El cliente lo recibe en su próximo check-in.
¿Es necesario para vender el framework? No — pero es la forma profesional de mantener control comercial. Sin este plugin, no tienes forma de saber cuántos clientes lo usan ni de aplicar control post-venta.
¿Los clientes ven este plugin? No. Se excluye del paquete cliente. En su instalación no aparece en el menú ni en el selector de plugins.
¿Qué sigue?
- Empaquetar y desplegar — cómo generar paquetes cliente que excluyen este plugin.
- Actualizar a nuevas versiones — cómo se distribuyen las actualizaciones a los clientes.