Ir al contenido

Configuración del Backend (appsettings.json)

El Servicio EZY WMS se configura mediante appsettings.json, ubicado en el directorio ezy-wms-backend/Service/. Este archivo controla CORS, registros, conexiones a bases de datos, autenticación JWT, gestión de sesiones, licencias, servicios en segundo plano, correo electrónico y verificaciones de salud. Todos los parámetros son obligatorios a menos que se indique lo contrario.

Define qué orígenes pueden realizar solicitudes entre orígenes a la API.

CampoTipoPredeterminadoDescripción
AllowedOriginsArray de strings["http://localhost:5001"]Lista de URLs de origen permitidas (ej. frontend del Portal). El comodín * no se recomienda para producción.

Nota: Asegúrate de incluir el Portal y otros clientes frontend. Las solicitudes de orígenes no listados serán rechazadas.

Configuración de registros estructurados. Los registros se escriben en consola y archivos rotatorios.

CampoTipoPredeterminadoDescripción
UsingArray["Serilog.Sinks.Console", "Serilog.Sinks.File"]Receptores de registro habilitados.
MinimumLevel.DefaultStringWarningNivel mínimo de registro para todos los registradores (ej. Debug, Information, Warning, Error).
MinimumLevel.OverrideObjectVer ejemploAnulaciones por espacio de nombres (ej. Microsoft.Hosting.Lifetime: Information).
WriteTo[0].NameStringConsoleSalida de registro a consola.
WriteTo[1].NameStringFileSalida de registro a archivo rotatorio.
WriteTo[1].Args.pathString./logs/log-.txtRuta del archivo de registro con marcador de posición {Date} para rotación diaria.
WriteTo[1].Args.rollingIntervalStringDayRotar registros diariamente. Opciones: Day, Hour, Month.
WriteTo[1].Args.retainedFileCountLimitInteger7Retener este número de archivos de registro. Los archivos más antiguos se eliminan.
WriteTo[1].Args.fileSizeLimitBytesInteger10485760 (10 MB)Tamaño máximo por archivo de registro antes de la rotación.
WriteTo[1].Args.rollOnFileSizeLimitBooleantrueRotar archivos de registro cuando se alcanza el límite de tamaño.
EnrichArray["FromLogContext", "WithMachineName", "WithThreadId"]Agregar información de contexto a los registros (nombre de máquina, ID de hilo).

Notas:

  • Los registros se almacenan en ./logs/ (relativo al ejecutable del servicio).
  • Las implementaciones de producción deben usar al menos nivel Warning para reducir el ruido.
  • Los registros de Entity Framework Core están configurados en Warning por defecto para reducir verbosidad.

Configuración heredada de registro de .NET. Serilog es preferido pero ambos coexisten.

CampoTipoPredeterminadoDescripción
LogLevel.DefaultStringErrorNivel predeterminado para todos los registradores.
LogLevel.MicrosoftStringErrorNivel para registros del marco de Microsoft.
LogLevel.Microsoft.Hosting.LifetimeStringErrorNivel para registros de inicio/parada de servicio.

Ajuste de seguridad para restringir qué encabezados Host aceptará el servicio.

CampoTipoPredeterminadoDescripción
AllowedHostsString*Valores del encabezado Host permitidos. Usa * para permitir todos, o lista nombres de host específicos (separados por comas).

Nota: En producción, reemplaza * con nombres de host o direcciones IP reales para prevenir ataques basados en host.

Configuración del servidor HTTP.

CampoTipoPredeterminadoDescripción
Kestrel.Endpoints.Http.UrlStringhttp://localhost:5000URL del punto de conexión HTTP. Usa http://0.0.0.0:5000 para escuchar en todas las interfaces.

Nota: Cambia el puerto o dirección de enlace para que coincida con tu red de implementación. El localhost predeterminado solo acepta conexiones locales.

Cadenas de conexión de base de datos para el servicio y adaptadores externos.

CampoTipoPredeterminadoDescripción
DefaultConnectionStringCadena de conexión SQL ServerBase de datos WMS principal. Incluye servidor, nombre de base de datos, usuario, contraseña y configuración de confianza de certificado.
ExternalAdapterConnectionStringCadena de conexión SQL ServerBase de datos opcional para adaptadores de sistemas externos. Puede apuntar al mismo o diferente SQL Server.

Nota: Ambas utilizan formato de cadena de conexión SQL Server. Para SQL en la nube (Azure, etc.), ajusta Server, User Id y Password. TrustServerCertificate=true es para desarrollo; para producción, usa certificados adecuados.

Configuración de autenticación JWT para tokens Bearer.

CampoTipoPredeterminadoDescripción
KeyStringJwtToken (ejemplo)Clave secreta para firmar tokens JWT. Debe ser una cadena larga y aleatoria (al menos 32 bytes).
IssuerStringYourIssuer (ejemplo)Reclamación del emisor del token (ej. EzyWMS).
AudienceStringYourAudience (ejemplo)Reclamación de audiencia del token (ej. EzyWMS-Client).
ExpiresInMinutesInteger60Tiempo de expiración del token en minutos. Después de esto, los tokens no son válidos.

Crítico: Reemplaza Key con una cadena aleatoria criptográficamente segura. El valor de ejemplo JwtToken es solo para demostración y no debe usarse en producción.

Configura el backend de almacenamiento de sesiones (en memoria o Redis).

CampoTipoPredeterminadoDescripción
TypeStringRedis (ejemplo) o InMemoryTipo de almacenamiento de sesión. Opciones: InMemory (solo instancia única), Redis (distribuido).
Redis.HostStringlocalhostNombre de host o IP del servidor Redis. Obligatorio si Type: Redis.
Redis.PortInteger6379Puerto del servidor Redis. El predeterminado es 6379.
Cookie.DomainString o nullnullDominio de la cookie (ej. .example.com). Deja null para solo el dominio actual.
Cookie.SecureBooleanfalseEnviar cookie solo sobre HTTPS. Configura true en producción.
Cookie.SameSiteStringLaxModo de protección CSRF. Opciones: Strict, Lax, None. Usa Lax para implementaciones típicas.
Cookie.HttpOnlyBooleantruePrevenir acceso JavaScript a la cookie de sesión. Mantén true por seguridad.

Notas Críticas:

  • Si Type: Redis, un servidor Redis debe estar ejecutándose y accesible en el host y puerto especificados. Sin Redis, las operaciones de sesión fallarán.
  • Para implementaciones de instancia única sin Redis, usa InMemory, pero las sesiones se pierden al reiniciar.
  • En producción, siempre configura Cookie.Secure: true y usa HTTPS.

Configuración de validación y almacenamiento en caché de licencias.

CampoTipoPredeterminadoDescripción
EncryptionKeyString (base64)Ver ejemploClave de 32 bytes codificada en base64 para cifrar datos de licencia. Debe coincidir con la clave utilizada por la nube de licencias.
CloudEndpointString (URL)http://localhost:3001URL del servicio en la nube de licencias.
BearerTokenStringVer ejemploToken Bearer para autenticar solicitudes al servicio en la nube de licencias.
CacheExpirationHoursInteger24Cuánto tiempo cachear licencias válidas localmente antes de verificar con la nube.
GracePeriodDaysInteger7Días que el servicio puede operar con una licencia expirada o inválida antes de bloquear operaciones.
DemoExpirationDaysInteger30Período de validez para licencias de demostración.
WarningThresholdDaysInteger3Días restantes hasta que expire la licencia cuando comiencen las advertencias.

Notas Críticas:

  • EncryptionKey debe ser exactamente un valor base64 codificado de 32 bytes. El formato incorrecto causará fallos de descifrado de licencia.
  • CloudEndpoint y BearerToken deben apuntar al servicio de licencias. Los valores inválidos evitan la validación de licencias.
  • Durante el período de gracia, el servicio continúa operando con una advertencia, pero después de que expire el período de gracia, las características se bloquean.

Tareas de larga duración ejecutadas en segundo plano.

Sincroniza operaciones de lista de picking con el inventario.

CampoTipoPredeterminadoDescripción
IntervalSecondsInteger60Frecuencia de comprobación de actualizaciones de lista de picking (en segundos).
EnabledBooleantrueHabilita o deshabilita el servicio de sincronización de listas de picking.
CheckClosedPickListsBooleantrueMonitorear listas de picking cerradas para verificar finalización.
ProcessPackageMovementsBooleantrueActualizar inventario cuando se mueven paquetes.

Sincroniza datos con la nube de licencias/gestión.

CampoTipoPredeterminadoDescripción
SyncIntervalMinutesInteger10Frecuencia de sincronización con la nube (en minutos).
ValidationIntervalHoursInteger24Frecuencia de validación completa contra la nube (en horas).
EnabledBooleantrueHabilita o deshabilita la sincronización con la nube.

Nota: CloudSync requiere conectividad de red al punto de conexión en la nube. Si la nube es inaccesible, el servicio continúa con datos en caché pero registrará advertencias.

Configuración de correo electrónico para enviar notificaciones (opcional).

CampoTipoPredeterminadoDescripción
EnabledBooleanfalseHabilita o deshabilita la funcionalidad de correo electrónico.
HostStringVacíoNombre de host del servidor SMTP (ej. smtp.gmail.com). Obligatorio si Enabled: true.
PortInteger587Puerto SMTP (típicamente 587 para TLS o 25 para no encriptado).
EnableSslBooleantrueUsa TLS/SSL para la conexión SMTP.
UsernameStringVacíoNombre de usuario de autenticación SMTP.
PasswordStringVacíoContraseña de autenticación SMTP.
FromEmailStringVacíoDirección de correo del remitente (ej. [email protected]).
FromNameStringEzyWMSNombre visible del remitente.
TimeoutSecondsInteger30Tiempo de espera para operaciones SMTP (en segundos).
TimeZoneIdStringAmerica/PanamaZona horaria para marcas de tiempo de correo electrónico y programación.

Notas:

  • El correo electrónico es opcional. Configura Enabled: false para deshabilitarlo (no se envían correos electrónicos).
  • Si está habilitado, todos los campos SMTP deben completarse. Las credenciales inválidas causarán fallos de envío de correo electrónico y errores en registros.

Integración de verificación de salud con el servicio de monitoreo UptimeKuma (opcional).

CampoTipoPredeterminadoDescripción
EnabledBooleanfalseHabilita o deshabilita los latidos de UptimeKuma.
PushUrlStringVer ejemploURL del punto de conexión del monitor de inserción de UptimeKuma. Formato: https://uptime.example.com/api/push/YOUR_PUSH_KEY.
HeartbeatIntervalSecondsInteger60Frecuencia de envío de latidos a UptimeKuma (en segundos).
SendOnStartupBooleantrueEnviar un latido cuando se inicia el servicio.
SendOnShutdownBooleantrueEnviar un latido cuando se apaga el servicio.

Notas:

  • El monitoreo de UptimeKuma es opcional. Configura Enabled: false para deshabilitarlo.
  • Si está habilitado, la PushUrl debe ser válida y accesible. Las URLs inaccesibles causarán tiempos de espera de conexión en registros pero no bloquearán el inicio del servicio.

A continuación se muestra un archivo appsettings.json completamente anotado adecuado para una implementación de producción. Reemplaza todos los valores de marcador de posición con los valores reales del entorno.

{
"Cors": {
"AllowedOrigins": [
"https://portal.example.com",
"https://admin.example.com"
]
},
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "./logs/log-.txt",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"fileSizeLimitBytes": 10485760,
"rollOnFileSizeLimit": true
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
},
"Logging": {
"LogLevel": {
"Default": "Error",
"Microsoft": "Error",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "portal.example.com,admin.example.com,your-db-server",
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://0.0.0.0:5000"
}
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=your-db-server;Database=EZY_WMS;User Id=sa;Password=YOUR_DB_PASSWORD;TrustServerCertificate=false;Encrypt=true;",
"ExternalAdapterConnection": "Server=your-db-server;Database=EZY_ADAPTERS;User Id=sa;Password=YOUR_DB_PASSWORD;TrustServerCertificate=false;Encrypt=true;"
},
"Jwt": {
"Key": "REPLACE_WITH_RANDOM_SECRET_AT_LEAST_32_BYTES_LONG_AND_CRYPTOGRAPHICALLY_SECURE",
"Issuer": "EzyWMS",
"Audience": "EzyWMS-Client",
"ExpiresInMinutes": 60
},
"SessionManagement": {
"Type": "Redis",
"Redis": {
"Host": "your-redis-server",
"Port": 6379
},
"Cookie": {
"Domain": null,
"Secure": true,
"SameSite": "Lax",
"HttpOnly": true
}
},
"PresenceTracking": {
"Type": "Redis"
},
"Licensing": {
"EncryptionKey": "REPLACE_WITH_BASE64_ENCODED_32_BYTE_KEY",
"CloudEndpoint": "https://licensing.example.com:3453",
"BearerToken": "REPLACE_WITH_BEARER_TOKEN",
"CacheExpirationHours": 24,
"GracePeriodDays": 7,
"DemoExpirationDays": 30,
"WarningThresholdDays": 3
},
"BackgroundServices": {
"PickListSync": {
"IntervalSeconds": 60,
"Enabled": true,
"CheckClosedPickLists": true,
"ProcessPackageMovements": true
},
"CloudSync": {
"SyncIntervalMinutes": 10,
"ValidationIntervalHours": 24,
"Enabled": true
}
},
"Smtp": {
"Enabled": true,
"Host": "smtp.example.com",
"Port": 587,
"EnableSsl": true,
"Username": "[email protected]",
"Password": "YOUR_SMTP_PASSWORD",
"FromEmail": "[email protected]",
"FromName": "EZY WMS",
"TimeoutSeconds": 30,
"TimeZoneId": "America/Panama"
},
"UptimeKuma": {
"Enabled": true,
"PushUrl": "https://uptime.example.com/api/push/REPLACE_ME",
"HeartbeatIntervalSeconds": 60,
"SendOnStartup": true,
"SendOnShutdown": true
}
}