Saltar a contenido

Configuración

.env.example en la raíz enumera las variables del proyecto. ASP.NET lee variables del proceso y appsettings.json; no carga automáticamente ese archivo .env. En Coolify configura las variables en cada recurso. En Compose, los valores efectivos son los declarados en compose.yaml.

API: conexión y acceso

Variable Uso
ASPNETCORE_ENVIRONMENT Production en servidor; Development en local
DATABASE_URL Conexión PostgreSQL: formato Npgsql o URI postgres:// / postgresql://
ConnectionStrings__Default Alternativa si no existe DATABASE_URL
BC_BEARER_TOKEN Secreto compartido con la integración BC
SWAGGER_ENABLED Activa /swagger y el JSON generado
ENABLE_HTTPS_ONLY Redirección HTTPS; false solo para laboratorio HTTP
ALLOWED_ORIGINS Orígenes del navegador separados por comas, sin ruta
STORAGE_ROOT Raíz de PDFs, habitualmente /app/storage con volumen persistente
MAX_PDF_MB Máximo de bytes PDF decodificados; valor inicial 5

DATABASE_URL tiene prioridad sobre ConnectionStrings__Default. Solo en Development existe una conexión local de fallback. Reemplaza todos los secretos de ejemplo.

El código añade también los orígenes locales localhost/127.0.0.1 en puertos 3000/5173 y https://tabletfirma.jdmarquez.dev a la lista CORS. Por tanto, configurar un único origen en ALLOWED_ORIGINS no elimina esos orígenes adicionales. CORS no sustituye la autenticación.

API: tiempos y retención

Variable Valor inicial Efecto
POLLING_LOCK_SECONDS 30 Reserva manuscrita en displayed
REQUEST_DEFAULT_EXPIRY_MINUTES 30 Caducidad de una solicitud manuscrita sin expiresAt explícito
ACTIVATION_CODE_TTL_MINUTES 15 Vigencia del código de activación
MAINTENANCE_INTERVAL_SECONDS 60 Ciclo de expiración y purga
PADES_PREPARATION_TTL_MINUTES 10 Ventana para completar; rango efectivo 1–60 minutos
PADES_COMPLETION_LEASE_SECONDS 60 Lease de completado; rango efectivo 15–300 segundos
RETENTION_DAYS_ORIGINAL 30 Originales y preparados de solicitudes terminales
RETENTION_DAYS_SIGNED 30 Resultados firmados desde signedAt
RETENTION_DAYS_AUDIT 90 Eventos de auditoría

La caducidad manuscrita se aplica a pending y displayed, no automáticamente a signing. Un token de tablet no expira por tiempo: revócalo o emite un código nuevo para invalidarlo.

En PAdES, una purga legítima conserva signed, informa resultPurgedAt y devuelve 410 SIGNED_RESULT_PURGED al descargar. En firma manuscrita, una ruta registrada puede seguir figurando disponible aunque el archivo haya sido purgado; la descarga devuelve 404.

API: emisores públicos PAdES

Variable Valor inicial Uso
PADES_ISSUER_CERTIFICATE_DIRECTORY Vacío Catálogo adicional opcional .cer/.crt/.pem/.p7c; rutas relativas respecto al directorio binario de la API
PADES_ISSUER_HTTP_TIMEOUT_SECONDS 10 Timeout por descarga AIA, rango efectivo 1–30 segundos; la resolución total tiene un límite de 30 segundos

La resolución automática funciona sin añadir estas variables: acepta una hoja sola y busca emisores mediante AIA, catálogo incluido y raíces del sistema. UANATACA CA1 2021 y ROOT 2016 vienen en la imagen API desde 0.2.14; basta con actualizar/redesplegar la API, sin cargas adicionales ni cambios BC. El directorio adicional es un respaldo del operador para otras entidades sin AIA accesible, no un requisito por firmante.

Para emisores descargados, permite al backend DNS y salida hacia los endpoints públicos AIA por HTTP(S), puertos 80/443. El transporte no usa proxy ni redirecciones y bloquea direcciones privadas/especiales. El catálogo contiene material público y no instala confianza en lectores; no aporta TSA ni revocación.

OCR opcional

Variable Valor inicial
OCR_LANGUAGE spa+eng
OCR_DPI 200
OCR_QUEUE_CAPACITY 2
OCR_JOB_TTL_MINUTES 30
OCR_TIMEOUT_SECONDS 120
OCR_PDFTOPPM_PATH pdftoppm
OCR_TESSERACT_PATH tesseract

La imagen API instala Poppler, Tesseract y los idiomas español/inglés. Procesa un trabajo cada vez. Su cola y resultados están en memoria; reiniciar pierde los jobs. Consulta Extracción y OCR.

Tablet: configuración pública

Variable Uso
VITE_API_BASE_URL Origen de API accesible desde el navegador de la tablet
VITE_DEFAULT_DEVICE_ID Identificador precargado en activación; opcional
VITE_POLLING_INTERVAL_MS Intervalo en espera, 4000 por defecto

En Docker prevalece la configuración runtime; en desarrollo se usan variables Vite. La sesión activada queda en localStorage, no en estas variables.

Variables de ejemplo sin consumo actual

API_BASE_URL, API_PORT, POLLING_INTERVAL_SECONDS, SIGNED_UPLOAD_TIMEOUT_SECONDS, TOKEN_ROTATION_DAYS y LOG_LEVEL aparecen en .env.example, pero el código actual no las enlaza como opciones operativas. No asumas que modifican escucha, polling, timeouts, rotación o logs.

Para ejecución local fija la escucha con --urls; para polling usa VITE_POLLING_INTERVAL_MS. La rotación del bearer es operativa, no automática. Los logs ASP.NET se configuran mediante Logging:LogLevel (por ejemplo Logging__LogLevel__Default como variable estándar).