[{"data":1,"prerenderedAt":619},["ShallowReactive",2],{"guide:es:system-settings":3},{"id":4,"title":5,"body":6,"description":12,"extension":612,"meta":613,"navigation":614,"path":615,"seo":616,"stem":617,"__hash__":618},"guide_es/es/user/system-settings/index.md","",{"type":7,"value":8,"toc":585},"minimark",[9,13,18,21,26,29,34,50,54,58,73,76,80,92,100,103,107,117,133,139,153,157,166,176,186,195,199,209,219,225,229,239,249,254,260,266,270,273,277,286,299,303,326,332,338,342,350,358,366,374,382,386,392,398,404,408,471,475,505,508,512,518,524,533,539,545,551,557,561,567,573,579],[10,11,12],"p",{},"--- título: «Configuración del sistema» descripción: «Arquitectura de seguridad, configuración de aplicaciones y opciones de implementación» ---",[14,15,17],"h1",{"id":16},"configuración-del-sistema","Configuración del sistema",[10,19,20],{},"La configuración del sistema controla el comportamiento de toda la aplicación, los parámetros de seguridad y la configuración de implementación. En esta sección se tratan la arquitectura de seguridad, la configuración de la aplicación y los modelos de implementación alternativos.",[22,23,25],"h2",{"id":24},"arquitectura-de-seguridad","Arquitectura de seguridad",[10,27,28],{},"Aptli utiliza un modelo de seguridad de cuatro capas con aplicación de renderización del lado del servidor (SSR):",[30,31,33],"h3",{"id":32},"capa-1-autenticación-quién-eres-verifica-la-identidad-del-usuario-antes-de-permitirle-el-acceso-inicio-de-sesión-con-contraseña-con-requisitos-de-complejidad-proveedores-de-oauth-github-google-autenticación-de-dos-factores-totp-se-requiere-validación-por-correo-electrónico-gestión-de-sesiones-con-caducidad-bloqueo-permanente-tras-intentos-fallidos","Capa 1: Autenticación Quién eres: verifica la identidad del usuario antes de permitirle el acceso. - Inicio de sesión con contraseña (con requisitos de complejidad). - Proveedores de OAuth (GitHub, Google). - Autenticación de dos factores (TOTP). - Se requiere validación por correo electrónico. - Gestión de sesiones con caducidad. - Bloqueo permanente tras intentos fallidos.",[30,35,37,38,42,43,42,46,49],{"id":36},"capa-2-derechos-de-administrador-permisivos-lo-que-puede-modificar-concesiones-de-permisos-explícitos-crearactualizareliminar-permisos-por-modelo-superderechos-appsettingschemasmodify-adminrightsmodify-viewdeleted-limitado-a-acciones-se-puede-crear-pero-no-eliminar-predeterminado-acceso-de-solo-lectura","Capa 2: Derechos de administrador (permisivos) Lo que PUEDE modificar - Concesiones de permisos explícitos. - Crear/actualizar/eliminar permisos por modelo - Superderechos: ",[39,40,41],"code",{},"appSettingSchemasModify",", ",[39,44,45],{},"adminRightsModify",[39,47,48],{},"viewDeleted"," - Limitado a acciones (se puede crear, pero no eliminar) - Predeterminado: acceso de solo lectura",[30,51,53],{"id":52},"capa-3-restricciones-de-roles-restrictivas-lo-que-no-se-puede-ver-filtros-de-datos-a-nivel-de-campo-filtros-de-modelo-campo-comparación-valor-se-aplican-en-el-lado-del-servidor-antes-de-la-consulta-a-la-base-de-datos-no-se-pueden-eludir-mediante-llamadas-a-la-api-exportaciones-o-capturas-de-pantalla-se-combinan-múltiples-restricciones-lógica-and","Capa 3: Restricciones de roles (restrictivas) Lo que NO se puede ver - Filtros de datos a nivel de campo. - Filtros de modelo + campo + comparación + valor - Se aplican en el lado del servidor antes de la consulta a la base de datos - No se pueden eludir mediante llamadas a la API, exportaciones o capturas de pantalla - Se combinan múltiples restricciones (lógica AND)",[30,55,57],{"id":56},"capa-4-aplicación-del-renderizado-del-lado-del-servidor-ssr-a-nivel-de-api-los-datos-realmente-no-existen-para-los-usuarios-no-autorizados-todas-las-consultas-se-filtran-del-lado-del-servidor-api-del-servidor-nuxt-se-aplican-restricciones-de-roles-antes-de-la-búsqueda-en-mongodb-no-hay-filtrado-del-lado-del-cliente-no-se-puede-eludir-la-api-devuelve-un-error-404-para-los-registros-no-autorizados-incluso-si-el-atacante-conoce-el-id","Capa 4: Aplicación del renderizado del lado del servidor (SSR) a nivel de API - Los datos realmente no existen para los usuarios no autorizados. - Todas las consultas se filtran del lado del servidor (API del servidor Nuxt). - Se aplican restricciones de roles antes de la búsqueda en MongoDB. - No hay filtrado del lado del cliente (no se puede eludir). - La API devuelve un error 404 para los registros no autorizados (incluso si el atacante conoce el ID).",[10,59,60,64,65,68,69,72],{},[61,62,63],"strong",{},"Por qué es importante el SSR:"," - ",[61,66,67],{},"Filtrado del lado del cliente:"," datos enviados al navegador, ocultos con JavaScript (se pueden eludir mediante herramientas de desarrollo). - ",[61,70,71],{},"Filtrado del lado del servidor:"," los datos nunca se envían a usuarios no autorizados (seguro).",[10,74,75],{},"Aptli utiliza SSR: los datos no autorizados nunca llegan al cliente.",[22,77,79],{"id":78},"configuración-de-la-aplicación","Configuración de la aplicación",[10,81,82,87,88],{},[83,84],"img",{"alt":85,"src":86},"Descripción general de la configuración de la aplicación","/guide/system-settings/app-settings-overview.png"," ",[89,90,91],"em",{},"Página de configuración de la aplicación que muestra las opciones de configuración y los parámetros de seguridad",[10,93,94,97,98],{},[61,95,96],{},"Acceso requerido:"," derecho de administrador ",[39,99,41],{},[10,101,102],{},"Navega a: Admin → Configuración de la aplicación",[30,104,106],{"id":105},"configuración-de-autenticación","Configuración de autenticación",[10,108,109,112,113,116],{},[61,110,111],{},"Dominios permitidos:"," - Lista de dominios de correo electrónico que pueden registrar cuentas - Ejemplo: ",[39,114,115],{},"[\"company.com\", \"contractor.com\"]"," - Solo los correos electrónicos de estos dominios pueden registrarse - Predeterminado: su dominio de implementación",[10,118,119,64,122,125,126,129,130,132],{},[61,120,121],{},"Permitir registro:",[39,123,124],{},"true",": los usuarios pueden registrarse por sí mismos si el dominio coincide. - ",[39,127,128],{},"false",": el administrador debe crear las cuentas manualmente. - Predeterminado: ",[39,131,128],{}," (acceso controlado).",[10,134,135,138],{},[61,136,137],{},"Métodos de inicio de sesión activos:"," - Nombre de usuario/Contraseña (casilla de verificación) - GitHub OAuth (casilla de verificación) - Google OAuth (casilla de verificación) - Se debe habilitar al menos un método - Predeterminado: solo nombre de usuario/contraseña",[10,140,141,64,144,146,147,149,150,152],{},[61,142,143],{},"Requerir autenticación de dos factores:",[39,145,124],{},": todos los usuarios deben habilitar la autenticación de dos factores (2FA) (período de gracia configurable). - ",[39,148,128],{},": 2FA opcional. - Predeterminado: ",[39,151,128],{},".",[30,154,156],{"id":155},"seguridad-de-la-sesión","Seguridad de la sesión",[10,158,159,162,163],{},[61,160,161],{},"Número máximo de intentos de inicio de sesión:"," - Número de intentos fallidos antes del bloqueo definitivo - Rango válido: 3-10 intentos - Valor predeterminado: ",[39,164,165],{},"5",[10,167,168,171,172,175],{},[61,169,170],{},"Tiempo de cierre de sesión automático:"," - Tiempo de inactividad en segundos - La lectura/escritura de datos reinicia la cuenta atrás - Rango válido: 1 hora - 7 días - Valor predeterminado: ",[39,173,174],{},"86400"," (1 día)",[10,177,178,181,182,185],{},[61,179,180],{},"Caducidad del token CSRF:"," - Tiempo de espera de la sesión del servidor en minutos - Obliga a volver a iniciar sesión independientemente de la actividad - Intervalo válido: 1 hora - 4 semanas - Valor predeterminado: ",[39,183,184],{},"10080"," (1 semana)",[10,187,188,191,192,194],{},[61,189,190],{},"Caducidad de la sesión:"," - Duración máxima absoluta de la sesión - Se alinea con el token CSRF para usuarios de un solo dispositivo - Los usuarios de varios dispositivos pueden tener diferentes caducidades - Por defecto: ",[39,193,184],{}," minutos (1 semana)",[30,196,198],{"id":197},"retención-de-datos","Retención de datos",[10,200,201,204,205,208],{},[61,202,203],{},"Retención de eliminación temporal:"," - Cuánto tiempo permanecen los registros eliminados temporalmente en la base de datos - Opciones: 30 días, 90 días, 1 año, indefinido - Predeterminado: ",[39,206,207],{},"90 días"," - Se aplica a asignaciones, informes, usuarios, funciones (cuando se establece deletedAt)",[10,210,211,214,215,218],{},[61,212,213],{},"Programa de compresión de versiones:"," - Frecuencia con la que se comprimen las versiones antiguas de las funciones - Opciones: semanal, mensual, trimestral - Predeterminado: ",[39,216,217],{},"mensual"," - Las versiones comprimidas siguen siendo reconstruibles (compresión sin pérdida).",[10,220,221,224],{},[61,222,223],{},"Historial de transacciones:"," - Las transacciones de inventario nunca se eliminan (registro de auditoría inmutable). - Se pueden archivar en una base de datos independiente (configuración avanzada).",[30,226,228],{"id":227},"valores-predeterminados-para-nuevos-usuarios","Valores predeterminados para nuevos usuarios",[10,230,231,234,235,238],{},[61,232,233],{},"Roles para nuevos usuarios:"," - Matriz de ID de roles asignados automáticamente - Matriz vacía = sin restricciones automáticas - Predeterminado: ",[39,236,237],{},"[]"," (el administrador los asigna manualmente)",[10,240,241,244,245,248],{},[61,242,243],{},"Derechos de administrador para nuevos usuarios:"," - Objeto con concesión de permisos - Objeto vacío = acceso solo para lectura - Predeterminado: ",[39,246,247],{},"{}"," (sin permisos de escritura)",[10,250,251],{},[61,252,253],{},"Ejemplos de configuraciones:",[10,255,256,257],{},"Valores predeterminados del trabajador de campo: ",[39,258,259],{},"json { \"roles\": [\"field_worker_role_id\"], \"adminRights\": { \"reportsCreate\": true } } ",[10,261,262,263],{},"Valores predeterminados del coordinador de oficina: ",[39,264,265],{},"json { \"roles\": [], \"adminRights\": { \"assignmentsCreate\": true, \"ordersCreate\": true, \"stockItemsView\": true } } ",[22,267,269],{"id":268},"implementación-autohospedada","Implementación autohospedada",[10,271,272],{},"Aptli admite la implementación autohospedada (requiere licencia en modo autohospedado).",[30,274,276],{"id":275},"modos-de-implementación","Modos de implementación",[10,278,279,87,282,285],{},[61,280,281],{},"Modo SaaS (predeterminado):",[39,283,284],{},"bash NUXT_REQUIRE_LICENSE=false "," - Sin validación de licencia - Aptli gestiona la infraestructura - Actualizaciones automáticas - Asistencia profesional incluida",[10,287,288,87,291,294,295,298],{},[61,289,290],{},"Modo autohospedado:",[39,292,293],{},"bash NUXT_REQUIRE_LICENSE=true NUXT_LICENSE_PUBLIC_KEY=\"-----BEGIN PUBLIC KEY-----...\" "," - Se requiere validación de la licencia - El cliente gestiona la infraestructura - Actualizaciones manuales (se sustituye la carpeta ",[39,296,297],{},".output",") - Se requiere la clave de licencia de Aptli",[30,300,302],{"id":301},"sistema-de-licencias","Sistema de licencias",[10,304,305,308,309,312,313,318,319,322,323,152],{},[61,306,307],{},"Cómo funciona:"," 1. Implemente la carpeta ",[39,310,311],{},".output/"," en su servidor. 2. El servidor genera un ID de implementación único (huella digital del hardware + nombre de host). 3. El periodo de prueba de 30 días comienza automáticamente. 4. Envíe el ID de implementación por correo electrónico a ",[314,315,317],"a",{"href":316},"mailto:license@aptli.com","license@aptli.com",".\n5. Aptli genera una licencia JWT con los ID de implementación autorizados. 6. Actívela a través de la página ",[39,320,321],{},"/admin/license"," o la variable de entorno ",[39,324,325],{},"NUXT_LICENSE_KEY",[10,327,328,331],{},[61,329,330],{},"Implementación múltiple:"," - Cada servidor tiene un ID de implementación único - La licencia incluye una lista de todos los ID de implementación autorizados - No se puede clonar el servidor sin una nueva licencia - Impide la distribución no autorizada",[10,333,334,337],{},[61,335,336],{},"Validación de la licencia:"," - Se comprueba al iniciar el servidor. - Si la licencia no es válida, la aplicación no se iniciará. - Si la versión de prueba caduca, se mostrará una advertencia durante 7 días y, a continuación, se bloqueará. - Renovación de la licencia por correo electrónico.",[30,339,341],{"id":340},"variables-de-entorno-autoalojadas","Variables de entorno (autoalojadas)",[10,343,344,87,347],{},[61,345,346],{},"Requisitos:",[39,348,349],{},"bash NUXT_MONGODB_URI=mongodb://localhost:27017/aptli NUXT_SESSION_PASSWORD=min-32-char-random-string ",[10,351,352,355],{},[61,353,354],{},"Opcional - OAuth:",[39,356,357],{},"bash NUXT_OAUTH_GITHUB_CLIENT_ID=... NUXT_OAUTH_GITHUB_CLIENT_SECRET=... NUXT_OAUTH_GOOGLE_CLIENT_ID=... NUXT_OAUTH_GOOGLE_CLIENT_SECRET=... ",[10,359,360,87,363],{},[61,361,362],{},"Opcional - Correo electrónico:",[39,364,365],{},"bash NUXT_RESEND_API_KEY=... NUXT_EMAIL_FROM=noreply@your-domain.com ",[10,367,368,87,371],{},[61,369,370],{},"Opcional - Escaneo de archivos:",[39,372,373],{},"bash NUXT_ENABLE_FILE_SCAN=true NUXT_CLAMAV_HOST=localhost NUXT_CLAMAV_PORT=3310 ",[10,375,376,87,379],{},[61,377,378],{},"Opcional - Licencia:",[39,380,381],{},"bash NUXT_REQUIRE_LICENSE=true NUXT_LICENSE_PUBLIC_KEY=\"-----BEGIN PUBLIC KEY-----...\" NUXT_LICENSE_KEY=eyJhbGc... (auto-activate) ",[30,383,385],{"id":384},"requisitos-de-infraestructura","Requisitos de infraestructura",[10,387,388,391],{},[61,389,390],{},"Mínimo:"," - 2 núcleos de CPU - 4 GB de RAM - 20 GB de almacenamiento (aumenta con los datos) - MongoDB 5.0+ - Node.js 20+",[10,393,394,397],{},[61,395,396],{},"Recomendado:"," - 4 núcleos de CPU - 8 GB de RAM - 100 GB de almacenamiento SSD - Conjunto de réplicas MongoDB (alta disponibilidad) - Equilibrador de carga (escalado horizontal)",[10,399,400,403],{},[61,401,402],{},"Servicios opcionales:"," - Daemon ClamAV (escaneo de archivos) - Redis (almacenamiento en caché de sesiones - mejora del rendimiento) - Servidor SMTP (notificaciones por correo electrónico)",[30,405,407],{"id":406},"pasos-de-implementación","Pasos de implementación",[409,410,411,420,428,438,446,459,465],"ol",{},[412,413,414,87,417],"li",{},[61,415,416],{},"Compilar la aplicación:",[39,418,419],{},"bash npm run build ",[412,421,422,87,425],{},[61,423,424],{},"Copiar salida:",[39,426,427],{},"bash scp -r .output/ user@server:/aptli/ ",[412,429,430,433,434,437],{},[61,431,432],{},"Establecer variables de entorno:"," Crear ",[39,435,436],{},"/aptli/.env"," con las variables necesarias.",[412,439,440,87,443],{},[61,441,442],{},"Iniciar el servidor:",[39,444,445],{},"bash cd /aptli/.output node server/index.mjs ",[412,447,448,451,452,455,456,458],{},[61,449,450],{},"Activar licencia:"," - Vaya a ",[39,453,454],{},"https://your-domain/admin/license"," - Copie el ID de implementación - Envíe un correo electrónico a ",[314,457,317],{"href":316}," - Pegue la clave de licencia recibida - Haga clic en «Activar»",[412,460,461,464],{},[61,462,463],{},"Configurar el proxy inverso:"," Nginx/Apache para el puerto proxy 3000 → HTTPS",[412,466,467,470],{},[61,468,469],{},"Configurar el gestor de procesos:"," PM2 o systemd para mantener el servidor en funcionamiento.",[30,472,474],{"id":473},"actualizaciones-autohospedadas","Actualizaciones (autohospedadas)",[10,476,477,478,481,482,485,486,488,489,492,493,495,496,498,499,502,503],{},"Proceso de actualización manual: 1. Copia de seguridad de la base de datos: ",[39,479,480],{},"mongodump","\n2. Copia de seguridad del archivo ",[39,483,484],{},".env"," 3. Descarga de la nueva carpeta ",[39,487,311],{}," desde Aptli 4. Detener el servidor: ",[39,490,491],{},"pm2 stop aptli"," 5. Reemplazar la carpeta ",[39,494,311],{}," 6. Restaurar el archivo ",[39,497,484],{}," 7. Iniciar el servidor: ",[39,500,501],{},"pm2 start aptli"," 8. Verificar: comprobar la versión en ",[39,504,321],{},[10,506,507],{},"Aptli proporciona: - Notas de la versión con cambios importantes - Scripts de migración (si hay cambios en la base de datos) - Instrucciones de reversión - Asistencia profesional durante las actualizaciones",[22,509,511],{"id":510},"mejores-prácticas-de-seguridad","Mejores prácticas de seguridad",[10,513,514,517],{},[61,515,516],{},"SSL/TLS requerido:"," - Utilizar HTTPS en producción (no HTTP) - Certificados gratuitos: Let's Encrypt - Rechazar conexiones HTTP (redirigir a HTTPS)",[10,519,520,523],{},[61,521,522],{},"Configuración del cortafuegos:"," - Permitir: HTTPS (443), SSH (22) - Denegar: puerto MongoDB (27017) desde Internet público - Restringir: páginas de administración a VPN o lista blanca de IP",[10,525,526,64,529,532],{},[61,527,528],{},"Seguridad de la sesión:",[39,530,531],{},"NUXT_SESSION_PASSWORD"," - mínimo 32 caracteres aleatorios - Rotación trimestral de la contraseña de sesión - Caducidad de sesión corta para entornos de alta seguridad",[10,534,535,538],{},[61,536,537],{},"Seguridad de la base de datos:"," - Autenticación MongoDB habilitada - Credenciales de usuario independientes (no root) - Conexiones cifradas (MongoDB TLS) - Copias de seguridad periódicas (automatizadas, restauración probada)",[10,540,541,544],{},[61,542,543],{},"Secretos de OAuth:"," - Almacenarlos en variables de entorno (no en código). - Rotarlos trimestralmente. - Revocar las aplicaciones OAuth que no se utilicen.",[10,546,547,550],{},[61,548,549],{},"Seguridad en la carga de archivos:"," - Escaneo ClamAV habilitado en producción - Límites de tamaño de archivo aplicados - Tipos de archivo permitidos restringidos - Cuarentena de almacenamiento para archivos sospechosos",[10,552,553,556],{},[61,554,555],{},"Supervisión:"," - Intentos fallidos de inicio de sesión (detección de fuerza bruta) - Fallos de autorización (detección de intentos de acceso no autorizado) - Patrones inusuales de uso de la API - Fallos de conexión a la base de datos",[22,558,560],{"id":559},"consideraciones-sobre-el-cumplimiento-normativo","Consideraciones sobre el cumplimiento normativo",[10,562,563,566],{},[61,564,565],{},"Residencia de datos:"," El modo autohospedado permite controlar la ubicación de los datos: - Alojamiento en una región geográfica específica - Cumplimiento de los requisitos normativos (RGPD, HIPAA, etc.) - Control físico del acceso a los datos",[10,568,569,572],{},[61,570,571],{},"Registro de auditoría:"," Aptli mantiene registros de auditoría para: - Intentos de autenticación (éxitos/fracasos) - Uso de derechos de administrador (quién modificó qué) - Cambios en las restricciones de roles - Historial de transacciones (movimientos de inventario) - Historial de versiones (cambios en las funciones) - Eliminaciones temporales (quién eliminó qué y cuándo)",[10,574,575,578],{},[61,576,577],{},"Exportación de datos:"," Todos los datos se pueden exportar para cumplir con la normativa: - Exportación CSV para datos no geográficos - Exportación GeoJSON para características (mediante el botón «Transferencia de datos» de la barra de herramientas del mapa) - Informes de transacciones (auditoría de inventario) - Registros de acceso de usuarios",[10,580,581,584],{},[61,582,583],{},"Retención de datos:"," Políticas de retención configurables: - Período de retención de eliminación temporal - Compresión de versiones (sin pérdida) - Historial de transacciones (inmutable, nunca se elimina) - Registros de auditoría (archivo configurable)",{"title":5,"searchDepth":586,"depth":586,"links":587},2,[588,596,602,610,611],{"id":24,"depth":586,"text":25,"children":589},[590,592,594,595],{"id":32,"depth":591,"text":33},3,{"id":36,"depth":591,"text":593},"Capa 2: Derechos de administrador (permisivos) Lo que PUEDE modificar - Concesiones de permisos explícitos. - Crear/actualizar/eliminar permisos por modelo - Superderechos: appSettingSchemasModify, adminRightsModify, viewDeleted - Limitado a acciones (se puede crear, pero no eliminar) - Predeterminado: acceso de solo lectura",{"id":52,"depth":591,"text":53},{"id":56,"depth":591,"text":57},{"id":78,"depth":586,"text":79,"children":597},[598,599,600,601],{"id":105,"depth":591,"text":106},{"id":155,"depth":591,"text":156},{"id":197,"depth":591,"text":198},{"id":227,"depth":591,"text":228},{"id":268,"depth":586,"text":269,"children":603},[604,605,606,607,608,609],{"id":275,"depth":591,"text":276},{"id":301,"depth":591,"text":302},{"id":340,"depth":591,"text":341},{"id":384,"depth":591,"text":385},{"id":406,"depth":591,"text":407},{"id":473,"depth":591,"text":474},{"id":510,"depth":586,"text":511},{"id":559,"depth":586,"text":560},"md",{},true,"/es/user/system-settings",{"description":12},"es/user/system-settings/index","6vuDsUscvh15oxux6MhcwpI4io2zDHp4ZVe8bpT-KBw",1780539280456]