| Salud | NIT | Equipo | Versión | Plataforma | Licencia | Outbox | Err 24h | Último reporte | Vendedor |
|---|
Editar vendedor
| Salud | NIT | Equipo | Ventas hoy | Monto hoy | Ventas mes | Últ. venta | DIAN ✓ | DIAN ✗ | DIAN ⏳ | Últ. backup | Usuarios | Clientes | Productos | Equipos | BD |
|---|
Métricas agregadas del último check-in de cada instalación (contrato v1 con bloque opcional). Las instalaciones con versiones anteriores de la app aparecen cuando actualicen y reporten.
🤖 Analista IA …
Pregunte en lenguaje natural sobre el consolidado del rango filtrado. El modelo solo recibe las cifras k-anónimas que ve este panel (nunca reportes individuales ni clientes finales).
📅 Tendencia mensual
Venta consolidada por mes (según fecha de fin de cada reporte semanal).
| Mes | Negocios | Reportes | Tickets | Venta | Ticket prom. | vs. mes anterior |
|---|
📆 Serie diaria
Venta por día calendario (requiere reportes v2 de la app 1.0.24+). Pase el cursor por cada barra.
🏷️ Ventas por familia
| Familia | Negocios | Tickets | Unidades | Venta | % venta | Margen % |
|---|
💲 Diferencial de precios por familia
Dispersión del precio unitario del mismo producto entre negocios: (máx − mín) / promedio. Alta dispersión = oportunidad de ajuste de precios.
| Familia | Productos | Precio prom. | Diferencial prom. | Diferencial máx. |
|---|
Ver detalle por producto
| Producto | Familia | Negocios | Mín. | Prom. | Máx. | Diferencial |
|---|
🥇 Productos más vendidos
| # | Producto | Negocios | Tickets | Unidades | Venta |
|---|
🐢 Productos de menor rotación
Entre los productos que reportan los negocios, los de menos unidades vendidas en el rango.
| # | Producto | Negocios | Tickets | Unidades | Venta |
|---|
👥 Compradores por segmento
Segmento = lista de precios asignada al cliente en cada negocio (solo tickets identificados).
🗺️ Geografía
Ciudad del negocio (dónde se vende) y ciudad declarada del comprador (a dónde llega la venta).
| Ciudad del negocio | Negocios | Tickets | Venta | % venta | Ticket prom. |
|---|
| Ciudad del comprador | Negocios | Tickets | Venta | % tickets ident. |
|---|
⏰ Horas pico
📅 Días de la semana
💳 Formas de pago
🗑️ Retirar los reportes de un NIT (derecho de supresión)
Datos consolidados enviados automáticamente cada semana por el equipo principal de cada negocio (nunca facturas ni clientes finales; de los compradores solo llegan conteos). Por k-anonimato, cada grupo (familia, producto, ciudad, segmento, día, mes) solo se muestra si lo reportan al menos el mínimo de negocios configurado (INSIGHTS_MIN_NEGOCIOS); las filas suprimidas se cuentan debajo de cada tabla. El rango filtra por la fecha de fin de cada período semanal.
| Estado | NIT | Meses | Sedes | Valor | Origen | Creada | Pagada | Transacción | Nota |
|---|
| NIT | Razón social | Contacto | Ciudad | Teléfono | Dirección | Instalaciones | Críticas | Licencia mín. | Vendedor(es) | Último reporte |
|---|
Vendedor
Formulario
Confirmación
| Tipo | NIT | Vendedor | Motivo | Emitida | Notificada |
|---|
| Estado | Comando | Huella | Detalle | Creado | Completado |
|---|
Los campos vacíos no se publican (conservan el valor actual). Los campos precargados muestran el valor difundido hoy.
El servidor firma el comando con la clave ECDSA del proveedor y lo entrega a cada instalación en su próximo check-in. Los clientes validan la firma antes de aplicar; el valor aplicado persiste aunque el comando venza.
Valores publicados actualmente
| Clave | Descripción | Valor | Comando vence |
|---|
Relay central de correo
Los POS de la flota envían sus correos (backups, alertas) a través de este servidor. La contraseña SMTP vive SOLO aquí: rotarla es cambiarla una vez, sin tocar ninguna instalación. Base: variables de entorno SMTP_*; lo guardado aquí las reemplaza (data/smtp-config.json).
💡 Con Gmail use una contraseña de aplicación (myaccount.google.com → Seguridad → Verificación en dos pasos → Contraseñas de aplicaciones), no la contraseña normal de la cuenta. Para validar el flujo completo de backup+adjunto, use el botón 📤 Enviar backup de prueba.
Adopción de versiones en la flota
| Plataforma | Versión | Instalaciones | Estado |
|---|
Historial de releases
| Versión | Plataforma | URL | Hosting | Descargas | Obligatoria | Notas | Publicado |
|---|
| NIT | Precio sede/mes | Desde | Hasta | Nota |
|---|
| Fecha | IP | Usuario | Método | Ruta | Resultado |
|---|
| Usuario | Nombre | Rol | Estado | Último ingreso | Acciones |
|---|
🎭 Roles y permisos por módulo
| Rol | Descripción | Permisos | Usuarios | Acciones |
|---|
| Módulo | Permiso |
|---|
| # | Fecha | Evento | Medio | Activación | NIT | Valor | Meses | Sedes | Transacción | Detalle |
|---|
| Archivo | Tamaño | Creado |
|---|
📚 Documentación técnica
Guías y runbooks del sistema. Audiencia: implementador / soporte / administrador técnico.
Cargando catálogo…
📖 Guía de operación del panel de flota
Referencia rápida de cada sección y de los procesos habituales del proveedor. Todo el panel requiere la llave de administrador (variable de entorno ADMIN_API_KEY del servidor), que se ingresa arriba y se guarda en este navegador.
🗺️ ¿Cómo funciona todo? — Mapa general del sistema
Reportan estado (check-in)
y reciben órdenes.
periódico
Licencias, comandos, config,
releases, relay de correo.
+ llave admin
y administra la flota
desde el navegador.
La regla de oro (modelo pull): el servidor NUNCA se conecta a las instalaciones. Cada instalación «llama a casa» periódicamente (check-in) y en esa misma respuesta recibe: comandos pendientes, configuración publicada y noticias de releases. Por eso todo cambio tarda hasta el próximo check-in de cada equipo en aplicarse.
🚀 Primeros pasos y puesta en marcha del servidor
El servidor se configura exclusivamente con variables de entorno (nunca hay secretos en archivos):
ADMIN_API_KEY— llave para entrar a este panel y a los endpoints administrativos.LICENSE_PRIVATE_KEY— clave privada ECDSA del proveedor; firma códigos de activación y comandos de configuración. Sin ella no se puede activar licencias ni publicar configuración.WOMPI_PRIVATE_KEYyWOMPI_EVENTS_SECRET— integración de pagos Wompi.SMTP_HOST/SMTP_USER/SMTP_PASSWORD— relay central de correo de la flota. Rotar la contraseña = cambiar la variable y reiniciar; la flota no se toca.LICENSE_DB_PATH— ruta de la base de datos SQLite única (por defectodata/licenseserver.dbjunto al ejecutable).DEVICE_TOKEN_SECRET— activa el token por instalación del relay de correo (anti-suplantación). Vea la sección «🔐 Seguridad».REQUIRE_HTTPS=true— rechaza todo tráfico sin HTTPS (respetaX-Forwarded-Protodel reverse proxy).BACKUP_OFFSITE_PATH— segunda copia de cada backup en otro destino (regla 3-2-1).NEW_INSTALLS_PER_DAY_ALERT— umbral de alerta por crecimiento anómalo del inventario (por defecto 50/día).
Puesta en marcha desde cero
- Genere el par de claves del proveedor:
licensetool keys→ guardalicense-private.key(secreta, solo el servidor) ylicense-public.key(se embebe en la app). - Defina las variables de entorno del servidor (
ADMIN_API_KEY,LICENSE_PRIVATE_KEY, SMTP, Wompi). - Inicie el servidor (consola, servicio o Docker) y abra
/adminen el navegador. - Ingrese la llave de administrador y pulse Conectar.
- Espere el primer check-in de las instalaciones: aparecerán solas en el tab Instalaciones.
data/: contiene activaciones, instalaciones, precios, vendedores y configuración publicada.📊 Tendencias — analítica de mercado consolidada + analista IA
Cada instalación de la app (solo el equipo principal del negocio; las sucursales no reportan) envía automáticamente una vez por semana a POST /api/insights/ventas un resumen consolidado de sus ventas: totales por familia, productos más vendidos con precio mín/prom/máx, serie diaria, distribución por hora y día de la semana, formas de pago y conteos de compradores (distintos, nuevos, recurrentes, mostrador vs identificados) por segmento (lista de precios) y ciudad. El envío viene activado por defecto y el Administrador del negocio puede apagarlo en Configuración → Backups → Compartir tendencias de consumo.
Nunca llegan facturas individuales ni datos de clientes finales (nombres, documentos, teléfonos, correos, direcciones): de los compradores solo llegan números agregados.
Qué muestra el dashboard
- KPIs: negocios, tickets, venta, ticket promedio, compradores distintos, nuevos, recurrentes y % de tickets identificados.
- Tendencia mensual (variación mes a mes) y serie diaria con los días de mayor venta.
- Familias con participación y margen; diferencial de precios por familia = dispersión del precio del mismo producto entre negocios (rojo ≥ 40 %, ámbar ≥ 15 %).
- Productos más vendidos y de menor rotación.
- Compradores por segmento comercial y mostrador vs identificados; geografía por ciudad del negocio y ciudad del comprador.
- Horas pico, días de la semana y formas de pago.
Cómo consultarlo
- Abra el tab 📊 Tendencias. Por defecto muestra los últimos 90 días (por fecha de fin de cada período semanal); use Rango rápido o ajuste Desde/Hasta.
- Filtre por Ciudad o suba el mínimo de negocios por grupo y pulse Consultar.
- Cada panel tiene botón ⬇ CSV; ⬇ CSV completo exporta todos los bloques para Excel/Power BI.
- Para integraciones:
GET /api/insights/consolidado?desde=AAAA-MM-DD&hasta=AAAA-MM-DD&ciudad=Bogotá&minNegocios=5con headerX-Admin-Key.
🤖 Analista IA
Escriba una pregunta en lenguaje natural (o use los chips de preguntas rápidas) y pulse Analizar con IA. El servidor envía al modelo exactamente el mismo JSON k-anónimo que ve el panel para el rango filtrado, nunca reportes individuales. Requiere AI_API_KEY en el servidor (cualquier API estilo OpenAI: AI_BASE_URL, AI_MODEL; por defecto gpt-4o-mini, el de menor costo con buena calidad). Límite de 30 consultas por hora y caché de 12 h por pregunta para controlar el gasto; la etiqueta junto al título indica el modelo activo o si la IA no está configurada.
k-anonimato
Un grupo (familia, producto, ciudad, segmento, día, mes, forma de pago) solo se publica si lo reportan al menos INSIGHTS_MIN_NEGOCIOS NIT distintos (por defecto 5). Ese umbral puede subirse por consulta, pero nunca bajarse. Si el total de negocios del rango no alcanza el mínimo, el panel solo muestra los conteos. En la app, además, cada grupo de compradores (segmento/ciudad) solo se reporta con 5+ tickets.
Derecho de supresión
Si un comerciante pide retirar sus datos, use «🗑️ Retirar los reportes de un NIT» al final del tab (o DELETE /api/insights/ventas/{nit}). Cada instalación puede enviar máximo 4 reportes por día; los excedentes se rechazan con 429.
Variables: INSIGHTS_MIN_NEGOCIOS (umbral de anonimato), MAX_INSIGHTS_SNAPSHOTS (límite de reportes almacenados; por defecto 100 000), AI_API_KEY/AI_BASE_URL/AI_MODEL/AI_MAX_TOKENS (analista IA). Los bloques de serie diaria, precios y compradores requieren reportes v2 (app 1.0.24+); los reportes v1 anteriores siguen sumándose al resto.
🔐 Seguridad — token por instalación del relay de correo
El relay de correo puede exigir un token secreto por instalación (header X-Device-Token). El servidor lo deriva con HMAC-SHA256 de un secreto que solo el servidor conoce: una huella inventada jamás podrá producir un token válido, lo que elimina por completo la suplantación y el uso del relay como spam.
¿Cómo se distribuye el token a la flota?
Pasos para activarlo
- Genere un secreto fuerte (64 caracteres hex). En PowerShell:
[Convert]::ToHexString([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32))— o en Linux:openssl rand -hex 32. - Configúrelo como variable de entorno
DEVICE_TOKEN_SECRETy reinicie el servidor. Nunca lo guarde en archivos ni en el repositorio. - Espere ~24 horas (un ciclo de check-in): cada POS con licencia pagada recibe y guarda su token automáticamente.
- Listo: el relay ya exige el token. Las huellas falsas reciben 401 aunque hagan check-in.
Preguntas frecuentes
| Situación | Qué pasa |
|---|---|
Sin DEVICE_TOKEN_SECRET | El relay funciona como antes (huella conocida + límites). El token es opcional. |
| Cambio el secreto | Todos los tokens quedan inválidos; la flota recibe el nuevo en su siguiente check-in (~24 h). Útil si sospecha una filtración. |
| Instalación sin pago | Nunca recibe token: no puede usar el relay aunque haga check-in. |
| POS reinstalado | Misma huella + pago previo ⇒ recibe su token de nuevo en el primer check-in. |
🛰️ Instalaciones — monitoreo de la flota
Muestra cada instalación que ha hecho check-in (la app reporta su estado periódicamente de forma automática). Columnas clave:
- Salud: Ok normal, Advertencia requiere atención pronto, Crítico requiere acción inmediata (licencia vencida, muchos errores, sin reportar).
- Licencia: estado y días restantes.
- Outbox: correos/sincronizaciones pendientes en el equipo (número alto sostenido = problema de conectividad del cliente).
- Err 24h: errores registrados en las últimas 24 horas.
Procesos habituales: asignar vendedor a una instalación (campo editable en la fila), verificar geo-discrepancias (⚠️ indica que la ciudad declarada no coincide con la IP — posible copia de la instalación), y enviar comandos remotos desde la fila.
¿Qué hago según la salud?
| Veo | Significa | Acción recomendada |
|---|---|---|
| Ok | Todo normal | Nada 😊 |
| Advertencia | Licencia por vencer u outbox creciendo | Contacte al cliente para renovar / revise su internet |
| Crítico | Licencia vencida, muchos errores o sin reportar | Llame al cliente; envíe Ping para confirmar conectividad |
| ⚠️ geo | Ciudad declarada ≠ ciudad por IP | Posible copia: verifique con el cliente y marque como verificado si es legítimo |
🔑 Licencias — ciclo de vida de las activaciones
Historial completo de todas las activaciones de licencia: pagadas por Nequi (cobro push directo al celular, sin comisión de agregador) o Wompi (link de pago, plan B), generadas manualmente y revocadas. Desde aquí se administra el ciclo de vida completo sin salir del panel. La columna Origen indica el medio usado.
- Ver código (🔑): recupera el código de activación firmado de una licencia pagada, para reenviarlo al cliente si lo perdió.
- Activación manual (➕): genera un código firmado sin pasar por la pasarela de pago. Úsela solo cuando el pago fue verificado por otro medio (transferencia, efectivo). Requiere NIT, huella del equipo (la muestra la app del cliente) y meses. Queda auditada con origen "Manual".
- Revocar (⛔): invalida una licencia pagada en el servidor (p. ej. contracargo o fraude). Pide un motivo y queda registrada en Auditoría. Es idempotente: revocar dos veces no genera error.
Estados de una activación
| Estado | Significa |
|---|---|
| Pendiente | El cliente generó el cobro (push Nequi o link de pago) pero aún no paga. |
| Pagada | Pago confirmado; el código de activación ya fue emitido. |
| Rechazada | El pago fue declinado o anulado en la pasarela. |
| Revocada | Un administrador invalidó la licencia manualmente. |
👥 Clientes — visión por NIT
Agrupa las instalaciones por cliente (NIT) con sus datos de contacto reportados por la propia app. Útil para saber cuántos equipos tiene cada cliente, cuáles están críticos y cuándo reportaron por última vez. Es solo lectura: los datos se corrigen en la app del cliente.
💰 Comisiones y 🧑💼 Vendedores
Comisiones
Liquida comisiones por rango de fechas: elija Desde/Hasta, la tasa % y pulse Liquidar. El cálculo usa los pagos registrados y el vendedor asignado a cada instalación.
Vendedores
Alta y edición de vendedores (nombre, teléfono, email, activo). El nombre del vendedor es el que se asigna a las instalaciones en el tab Instalaciones. Las tarjetas muestran el desempeño de los últimos meses seleccionados.
💵 Precios — precio base, especiales y ajuste masivo
- Precio base: valor por sede/mes que pagan todos los clientes sin precio especial. Cambiarlo aplica a pagos futuros; no requiere tocar la app.
- Precio especial: por NIT, con vigencia opcional (desde/hasta) y nota. Tiene prioridad sobre el base.
- Ajuste masivo: aumenta por % o fija precio a: solo base, solo negociados, ambos, o una lista de NITs. Use la nota para dejar rastro (ej.: «ajuste anual 2026»).
precio especial?
Proceso de aumento anual
- En «Ajuste masivo» elija el alcance: Base + negociados (lo usual para aumento general).
- Tipo: Aumento % y escriba el porcentaje (ej.
8). - Escriba una nota de rastro: «ajuste anual 2026».
- Pulse 📈 Aplicar ajuste masivo y confirme.
- Revise la tabla resultante de precios especiales.
🚨 Alertas — vigilancia automática
El servidor evalúa la flota periódicamente y genera alertas (licencias por vencer, equipos sin reportar, errores altos). Si configuró un webhook, también las notifica allí. Esta vista es el historial; no requiere acción sobre el panel, sino sobre el cliente afectado.
📟 Comandos — acciones remotas sobre una instalación
Permite encolar comandos que la instalación ejecuta en su próximo check-in (modelo pull; no hay conexión directa al equipo). Comandos soportados:
Ping— verificar que el equipo responde y ver su latencia de check-in.ForzarBackup— el equipo genera un backup inmediato.ActualizarEstado— fuerza un reporte de estado completo.
Proceso:
en la fila del equipo
⚙️ Configuración — cambios masivos a toda la flota
Publica valores que TODAS las instalaciones aplican en su próximo check-in, sin redistribuir la app. El servidor firma cada comando con la clave ECDSA del proveedor y cada cliente valida la firma antes de aplicar.
Claves disponibles:
server_url— URL de este servidor (para migraciones de dominio/host).enforcement— enforcement de licencia (1activo /0desactivado).support_phone— teléfono/WhatsApp de soporte mostrado en la app.support_email— correo de soporte mostrado en la app.website— sitio web oficial mostrado en la app.wompi_public_key— llave pública Wompi (pub_prod_/pub_test_) usada por los POS para cobros.wompi_private_key— llave privada Wompi (prv_prod_/prv_test_). Secreto: cada POS la guarda cifrada y nunca la muestra ni reporta; en este panel solo se confirma como «(secreto definido)».wompi_sandbox— ambiente Wompi de los POS (1pruebas /0producción).wompi_payment_link— link de pagos fijo (https://checkout.wompi.co/l/...) mostrado como QR en Venta rápida.
Ejemplo: cambiar el teléfono de soporte en toda la flota
- Elija la clave
support_phoneen el selector. - Escriba el nuevo número (ej.
313 000 0000). - Defina la vigencia del comando en días (tiempo en que las instalaciones pueden recogerlo; el valor aplicado persiste aunque venza).
- Pulse 📡 Publicar a la flota y confirme.
- Cada instalación lo aplica en su siguiente check-in — verifíquelo en la tabla de valores publicados.
Cómo viaja el cambio (seguridad)
o vencido
server_url: si publica una URL errónea, la flota dejará de hacer check-in y no podrá corregirla por este medio. Verifique dos veces antes de publicar.🚀 Releases — actualizaciones de la app
Proceso para publicar una actualización:
- Compile y firme el instalador de la nueva versión y súbalo a un hosting con HTTPS.
- Calcule el SHA-256 del archivo (recomendado: el cliente verifica integridad):
Get-FileHash .\pos-1.4.0.msix -Algorithm SHA256 - En este tab llene: versión (ej.
1.4.0), plataforma (WinUI/Android/iOS/MacCatalyst), URL de descarga, SHA-256 y notas. - Marque Obligatoria solo para correcciones críticas o de seguridad; la app insistirá al usuario hasta actualizar.
- Pulse 🚀 Publicar. Cada instalación se entera en su próximo check-in.
- Vigile la tabla Adopción los días siguientes hasta que la mayoría esté en la nueva versión.
La tabla Adopción muestra cuántas instalaciones ya están en cada versión — úsela para saber cuándo puede retirar soporte de versiones viejas.
🔐 Auditoría — quién hizo qué
Registra cada acceso administrativo (fecha, IP, método, ruta, resultado). 10 intentos fallidos en 15 minutos bloquean la IP temporalmente. Use los filtros de fecha y «solo fallidos» para investigar accesos sospechosos, y la purga para retirar registros antiguos.
💳 Pagos — auditoría fuerte de pagos de licencias
Cada evento del ciclo de pago de licencias queda en un libro de auditoría solo-agregar: cobro creado (Nequi o Wompi), pago aprobado, pago rechazado, código entregado, activación manual y revocación. Cada entrada se sella con SHA-256 encadenado a la anterior (estilo libro contable): editar, borrar o insertar un registro rompe la cadena y se detecta.
Cómo consultar
- Abra el tab 💳 Pagos y filtre por NIT, activación, evento, medio (Nequi/Wompi/Manual) o rango de fechas.
- Para investigar un cobro concreto, filtre por su Id de activación: verá la línea de tiempo completa de ese pago.
- Pulse 🛡️ Verificar integridad periódicamente (por ejemplo, junto a su rutina de backups): confirma que ningún registro fue alterado. Si la cadena está rota, el mensaje indica la entrada exacta donde ocurrió.
auditoria_pagos de la base SQLite (data/licenseserver.db) y se incluye en los backups automáticos.
💾 Backups — protección de los datos del servidor
Los datos del servidor (inventario de la flota, activaciones, comisiones, auditoría) son irremplazables. El servidor los respalda solo, pero la seguridad total depende de que usted saque copias fuera del servidor.
Qué hace el servidor automáticamente
- Cada 6 horas (configurable con
BACKUP_INTERVAL_HOURS) crea un ZIP con todos los archivos de datos. - Cada archivo lleva su huella SHA-256 en un manifiesto; el ZIP se verifica antes de darse por bueno. Un backup corrupto nunca se guarda.
- Conserva los 30 más recientes (configurable con
BACKUP_RETAIN_COUNT) y purga los demás.
Su rutina como operador — regla 3-2-1
3 copias de los datos · en 2 medios distintos · 1 fuera del servidor.
- Entre a este tab (Backups) al menos una vez por semana.
- Pulse ⬇️ Descargar el más reciente y guarde el ZIP en su computador.
- Suba esa copia a un almacenamiento externo (Google Drive, OneDrive, S3…). Puede automatizarlo con un cron:
curl -H "X-Admin-Key: SU_LLAVE" https://su-servidor/api/backups/ultimo -o backup.zip - Si usa Docker, monte
/app/backupsen un disco distinto al de/app/data.
Cómo restaurar (ensáyelo al menos una vez)
- Detenga el servidor.
- Descomprima el ZIP del backup dentro del directorio de datos (
/app/data), reemplazando los archivos. - Arranque el servidor: la flota se re-sincroniza sola con los check-ins diarios.
⚠️ Un backup que nunca se ha probado a restaurar no es un backup: es una esperanza.
🩹 Qué hacer si un archivo de datos se corrompe
Los datos viven en una base SQLite única (data/licenseserver.db) con transacciones ACID y journal WAL: la corrupción por corte de energía es extremadamente improbable. Si una fila individual quedara ilegible, el servidor la omite al cargar y arranca normalmente; nunca se cae por un dato dañado.
Procedimiento de recuperación (base dañada)
- Detenga el servidor.
- Restaure desde el último backup: descomprima el ZIP más reciente y copie
licenseserver.dbal directorio de datos (elimine antes los archivoslicenseserver.db-walylicenseserver.db-shmsi existen). - Arranque el servidor y verifique en el tab Backups que aparezca «✓ Servidor sano».
¿Qué pierdo si arranco con base vacía (sin restaurar)?
| Tabla | Si arranca vacía (sin restaurar) |
|---|---|
instalaciones | Se repobla solo con los check-ins diarios de la flota (se pierden notas/vendedor asignado). |
activaciones / auditoria_pagos | ⚠ CRÍTICO: historial de pagos y códigos emitidos. Restaure siempre del backup. |
precios | Vuelve al precio base de la variable de entorno; se pierden los especiales por NIT. |
config_broadcast | Se deja de difundir, pero las instalaciones conservan lo ya aplicado. Re-publique. |
comandos / alertas / auditoria_admin | Solo historial; sin impacto operativo. |
vendedores / releases | Re-cree los registros o restaure del backup. |
🧯 Solución de problemas del servidor — diagnóstico rápido
Primer paso siempre: abra el tab Backups (consulta /api/salud) y lea los problemas detectados. Luego:
| Síntoma | Causa probable | Solución |
|---|---|---|
| El panel dice «Llave de administrador inválida» | Llave mal escrita o IP bloqueada por 10 fallos en 15 min | Verifique ADMIN_API_KEY; espere 15 minutos si hubo bloqueo. |
| La flota no reporta (todo «Crítico» por última conexión) | Servidor caído, URL cambiada o certificado vencido | Pruebe /api/salud desde fuera; revise DNS/HTTPS; si cambió la URL, publique server_url ANTES de apagar la vieja. |
| No se emiten licencias tras el pago | Falta LICENSE_PRIVATE_KEY o webhook Wompi mal configurado | /api/salud lo indica; verifique el secreto de eventos de Wompi. |
| «El último backup tiene más de N horas» | Worker de backups fallando (disco lleno o sin permisos) | Revise logs del servidor; libere espacio; verifique permisos de /app/backups. |
| «El directorio de datos NO es escribible» | Permisos del volumen o disco lleno | ⚠ Urgente: los cambios se pierden al reiniciar. Corrija permisos/espacio de /app/data. |
| Datos desaparecieron tras redeploy de Docker | Volumen no montado: los datos vivían dentro del contenedor | Monte /app/data y /app/backups como volúmenes; restaure del backup externo. |
Si nada de esto aplica, revise los logs del proceso (Docker: docker logs <contenedor>) — el servidor registra cada backup, alerta y fallo con detalle.
🔑 Licencias — activación y renovación de clientes
El flujo normal es automático: el cliente paga desde la app (Wompi) y el servidor emite el código de activación firmado.
Flujo automático (el habitual)
Flujo manual de respaldo (pago por otro medio o sin internet)
- El cliente le comparte su huella (la muestra la app en la pantalla de licencia) o la solicitud completa (
LIC-REQ|v1|...). - Genere el código con LicenseTool:
licensetool code <nit> <huella> <meses>(ej.:licensetool code 900123456-7 AB3D-K9M2 3) olicensetool code "<solicitud>". - Envíe el código al cliente; lo ingresa en la app y queda activado.
🆘 Problemas frecuentes — diagnóstico rápido
| Síntoma | Causa probable | Solución |
|---|---|---|
| «Llave de administrador inválida» | La llave no coincide con ADMIN_API_KEY | Verifique la llave; tras varios fallos su IP queda bloqueada unos minutos |
| Una instalación no aparece | Aún no hace su primer check-in | Verifique internet del cliente y la URL del servidor configurada en la app |
| Configuración publicada pero un equipo no la aplica | El equipo no hace check-in o el comando venció | Revise «último reporte» en Instalaciones; republique con más días de vigencia |
| El relay de correo devuelve error | Variables SMTP faltantes o credencial vencida | Corrija las variables y reinicie el servicio |
| No se puede publicar configuración (503) | Falta LICENSE_PRIVATE_KEY | Defina la variable en el servidor y reinicie |
| Comando lleva días «pendiente» | El equipo está apagado o sin internet | Contacte al cliente; verifique salud en Instalaciones |
Árbol de decisión: «un cliente reporta un problema»
Instalaciones?
URL del servidor en la app
Ping oActualizarEstadopara confirmar diagnósticopida ZIP de diagnóstico