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).