Cliente: Centrica Soluciones
Proyecto: Nebula ERP - Componente DataVault
Version: 1.0
Fecha: 16 de marzo, 2026
Autor: Carlos Torres (Arquitecto de Software)
Estado: VIGENTE
DataVault implementa un sistema de preservacion digital basado en el estandar OAIS (ISO 14721) con tres pilares fundamentales:
INGESTA PRESERVACION ACCESO
| | |
v v v
[SIP creado] --> [AIP almacenado] --> [DIP generado]
| | |
v v v
[Checksums] [Verificacion] [Consulta temporal]
[Metadata] [Semaforo] [24h/48h acceso]
[METS manifest] [Cloud backup] [Link expirado]
| Algoritmo | Uso | Bits de Seguridad | Rendimiento |
|---|---|---|---|
| SHA-256 | Principal (preservacion) | 128 | ~250 MB/s |
| MD5 | Secundario (compatibilidad) | <64 (colisiones conocidas) | ~600 MB/s |
Nota: MD5 no es seguro criptograficamente y tiene colisiones conocidas. Se mantiene unicamente por compatibilidad con sistemas legacy. Para preservacion a largo plazo, solo se debe confiar en SHA-256.
Los checksums se calculan en multiples puntos del ciclo de vida:
1. INGESTA (IngestService)
+-- Checksum por archivo individual (data/)
+-- Checksum del SIP completo
+-- Almacenado en technical_metadata.json
2. ARCHIVADO (Creacion AIP)
+-- Checksum del ZIP completo
+-- Almacenado en .checksum.json
3. VERIFICACION (IntegrityChecker)
+-- Recalculo y comparacion
+-- Resultado en preservation_status.json
4. SINCRONIZACION (Cloud Sync)
+-- Checksum antes de upload
+-- Comparacion post-upload (eventual)
El IntegrityChecker busca checksums en tres fuentes, en orden de prioridad:
Fuente 1: .checksum.json (preferida)
{
"algorithm": "sha256",
"checksum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"calculated_at": "2026-03-15T14:30:00",
"file_size_bytes": 1048576
}
Fuente 2: manifest.txt (AIPs)
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 data/archivo1.pdf
a1b2c3d4e5f6... data/archivo2.xlsx
Fuente 3: metadata.json (fallback)
{
"integrity": {
"checksum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"algorithm": "SHA-256"
}
}
El PreservationService clasifica cada archivo en cuatro niveles usando un sistema de semaforo:
+----------+--------+--------------------------------------------------+
| Estado | Color | Criterios |
+----------+--------+--------------------------------------------------+
| OPTIMAL | GREEN | Archivo existe |
| | | Checksum SHA-256 valido |
| | | Metadata descriptiva completa |
| | | Metadata tecnica completa |
| | | Metadata de preservacion completa |
| | | Politica de retencion activa |
| | | Ultima verificacion < 30 dias |
+----------+--------+--------------------------------------------------+
| ATTENTION| YELLOW | Metadata incompleta (parcial) |
| | | O ultima verificacion > 30 dias |
| | | O retencion proxima a expirar (< 90 dias) |
+----------+--------+--------------------------------------------------+
| CRITICAL | RED | Archivo no encontrado en filesystem |
| | | O checksum no coincide (corrupcion) |
| | | O retencion expirada |
| | | O legal hold violado |
+----------+--------+--------------------------------------------------+
| UNVERIF. | GRAY | Nunca se ha ejecutado verificacion |
| | | Paquete nuevo sin primer chequeo |
+----------+--------+--------------------------------------------------+
{
"file_id": "lote_01_20260315_a7b2c1d4",
"status": "GREEN",
"details": {
"file_exists": true,
"checksum_valid": true,
"checksum_algorithm": "SHA-256",
"checksum_expected": "e3b0c44...",
"checksum_actual": "e3b0c44...",
"metadata_complete": true,
"retention_active": true,
"retention_expires": "2036-03-15",
"legal_hold": false,
"last_verified": "2026-03-15T15:00:00"
}
}
Cada SIP genera tres archivos de metadata:
Informacion bibliografica sobre el contenido:
| Campo | Estandar | Ejemplo |
|---|---|---|
dc:title |
Dublin Core | "Lote Documentos Contables Q1 2026" |
dc:creator |
Dublin Core | "Juan Perez (Departamento Contabilidad)" |
dc:date |
ISO 8601 | "2026-03-15T14:30:22" |
dc:format |
MIME Types | "application/pdf" |
dc:identifier |
UUID | "lote_01_20260315_a7b2c1d4" |
dc:source |
Proyecto | "DIGITALIZACION" |
dc:description |
Texto libre | "Facturas del primer trimestre" |
Informacion sobre los archivos fisicos:
| Campo | Tipo | Descripcion |
|---|---|---|
files[] |
Array | Lista de archivos con hash individual |
files[].filename |
String | Nombre del archivo |
files[].size_bytes |
Integer | Tamano en bytes |
files[].md5 |
String | Hash MD5 (compatibilidad) |
files[].sha256 |
String | Hash SHA-256 (integridad) |
files[].mime_type |
String | Tipo MIME detectado |
total_files |
Integer | Conteo total |
total_size_bytes |
Integer | Tamano total del paquete |
Informacion sobre la politica de conservacion:
| Campo | Tipo | Descripcion |
|---|---|---|
retention_policy.retention_days |
Integer | Dias de retencion obligatoria |
retention_policy.legal_hold |
Boolean | Retencion legal (indefinida) |
retention_policy.classification |
String | standard, confidential, restricted |
integrity.algorithm |
String | Algoritmo de checksum usado |
integrity.package_checksum |
String | Checksum del paquete completo |
integrity.verified_at |
DateTime | Ultima verificacion |
provenance.ingest_method |
String | automatic_watcher, manual_upload, api |
provenance.source_system |
String | Identificacion del sistema origen |
provenance.operator |
String | Usuario que realizo la ingesta |
El manifiesto sigue el estandar METS (Metadata Encoding and Transmission Standard):
<?xml version="1.0" encoding="UTF-8"?>
<mets xmlns="http://www.loc.gov/METS/">
<metsHdr CREATEDATE="2026-03-15T14:30:22">
<agent ROLE="CREATOR">
<name>DataVault OAIS Server</name>
</agent>
</metsHdr>
<fileSec>
<fileGrp USE="original">
<file ID="file-001" MIMETYPE="application/pdf"
CHECKSUM="e3b0c44..." CHECKSUMTYPE="SHA-256">
<FLocat LOCTYPE="URL" xlink:href="data/archivo1.pdf"/>
</file>
</fileGrp>
</fileSec>
<structMap TYPE="physical">
<div LABEL="lote_01_20260315_a7b2c1d4" TYPE="SIP">
<fptr FILEID="file-001"/>
</div>
</structMap>
</mets>
[Documento original] --> [SIP con metadata + checksums] --> [AIP archivado] --> [DIP disponible]
Estado: GREEN (verificacion inicial)
Verificaciones periodicas (recomendado: diario)
|
+-- Checksum validation
+-- File existence check
+-- Metadata completeness
+-- Cloud sync status
|
Estado: GREEN | YELLOW | RED
[Solicitud de consulta] --> [ConsultaService crea registro]
|
+-- Estado: pendiente --> en_progreso --> respondido
+-- DIP disponible via link temporal (24h/48h)
+-- Expiracion automatica
[Politica de retencion expira]
|
+-- Si legal_hold=false:
| Estado: RED (retencion expirada)
| Accion requerida: Revisar y decidir eliminacion o extension
|
+-- Si legal_hold=true:
Estado: GREEN (retencion indefinida)
No expira hasta levantamiento manual del hold
DataVault implementa parcialmente la regla 3-2-1 de backup:
| Regla | Requerimiento | Estado | Detalle |
|---|---|---|---|
| 3 copias | Al menos 3 copias del dato | Parcial | SIP en disco + AIP en disco + Azure (solo sync daemons) |
| 2 medios | En al menos 2 medios diferentes | OK | Disco local (ext4) + Azure Blob Storage (cloud) |
| 1 offsite | Al menos 1 copia fuera del sitio | OK | Azure Blob Storage (datacenter remoto) |
| Gap | Detalle | Recomendacion |
|---|---|---|
| Sin backup de BD | PostgreSQL no tiene backup automatizado | Implementar pg_dump diario + upload a Azure |
| Sin backup de metadata JSON | oais_status.json y preservation_status.json solo existen en disco |
Replicar a BD o Azure |
| Sin verificacion post-sync | No se verifica que el archivo en Azure sea identico al local | Implementar checksum post-upload |
| Sin disaster recovery plan | No hay procedimiento documentado para restaurar desde Azure | Documentar RTO/RPO y procedimiento |
| Entidad OAIS | Implementada | Componente | Completitud |
|---|---|---|---|
| Ingest | Si | IngestService + Watcher | 85% |
| Archival Storage | Si | Filesystem + Azure | 70% |
| Data Management | Parcial | PostgreSQL + JSON files | 50% |
| Administration | Parcial | ProjectService + Scripts | 40% |
| Preservation Planning | Parcial | PreservationService | 30% |
| Access | Si | ConsultaService + DIP | 60% |
| Requisito OAIS | Estado | Gap |
|---|---|---|
| Informacion de Descripcion (DI) | Implementado | Metadata Dublin Core presente |
| Informacion de Empaquetado (PI) | Implementado | Estructura SIP/AIP/DIP correcta |
| Informacion de Contexto | Parcial | Falta vinculacion entre paquetes relacionados |
| Informacion de Referencia | Parcial | IDs unicos pero sin URN/DOI persistente |
| Informacion de Procedencia | Implementado | Campo provenance en preservation_metadata |
| Informacion de Fijacion | Implementado | Checksums SHA-256 en multiples puntos |
| Plan de Preservacion | No implementado | Sin politica de migracion de formatos |
| Normalizacion de Formatos | No implementado | Sin conversion a formatos de preservacion (PDF/A) |
| Metrica | Formula | Objetivo | Frecuencia |
|---|---|---|---|
| Tasa de integridad | AIPs validos / Total AIPs | > 99.99% | Diario |
| Cobertura de verificacion | AIPs verificados ultimo mes / Total | > 95% | Mensual |
| Tasa de sync cloud | Archivos en Azure / Archivos en disco | > 99% | Diario |
| Tiempo medio de ingesta | Promedio(fin_ingesta - inicio_ingesta) | < 60s (100MB) | Semanal |
| Consultas respondidas | respondido / total_consultas | > 90% en 48h | Mensual |
| Archivos criticos (RED) | Conteo de archivos en estado RED | 0 | Diario |
Departamento de Arquitectura — Centrica Soluciones