Modulo de Backup, Sincronizacion y Recuperacion
Identificador: MTS-BCK-001
Version: 2.0.0
Fecha de ultima actualizacion: 2025-12-05
Estado: Aprobado
Autor: SpecQueen
Revisores: Director del Proyecto
1. Historial de Versiones
| Version |
Fecha |
Autor |
Cambios |
| 2.0.0 |
2025-12-05 |
SpecQueen |
OBS-059: 4 roles con permisos diferenciados, backup incremental tiempo real Pro/Perfect, diferenciacion clara de mecanismos |
| 1.1.0 |
2025-12-05 |
SpecQueen |
Iteracion 13: RPO/RTO definidos, estrategias de merge |
| 1.0.0 |
2025-12-01 |
SpecQueen |
Version inicial con ACL6-003/004/005 |
2. Proposito
Este modulo especifica los mecanismos de respaldo, sincronizacion y recuperacion de datos para MedTime V1.0. Define cuatro conceptos distintos que no deben confundirse:
| Concepto |
Descripcion |
Disponibilidad |
| Backup Manual |
Exportacion a archivo .medtime para almacenamiento externo |
Todos los tiers |
| Sync Cloud |
Sincronizacion automatica en tiempo real con Firebase |
Pro/Perfect |
| Backup Servidor |
Estrategia de respaldos en infraestructura Firebase |
Automatico (transparente) |
| Retencion |
Politica de versiones y tiempo de conservacion |
Por tier |
2.1. Arquitectura V1.0: Firebase como Backend
ARQUITECTURA DE DATOS V1.0:
+------------------+ +------------------+ +------------------+
| DISPOSITIVO | | FIREBASE | | BACKUP EXTERNO |
| (Local) | | (Cloud) | | (Usuario) |
+------------------+ +------------------+ +------------------+
| | | | | |
| SQLite local |<--->| Firestore | | .medtime file |
| (datos cifrados) | | (blobs cifrados) | | (iCloud, Drive) |
| Keychain/Store | | Cloud Storage | | USB, email |
| | | (imagenes) | | |
+------------------+ +------------------+ +------------------+
| | ^
| Sync en tiempo real | |
+------------------------+ Export manual --+
Pro/Perfect
NOTA: Todos los datos en Firebase estan cifrados E2E.
Firebase almacena "blobs opacos" que no puede descifrar.
3. Actores y Roles
3.1. Los 4 Roles y sus Permisos de Backup
| Rol |
Codigo |
Puede Exportar |
Puede Sincronizar |
Datos que Respalda |
| Paciente Independiente |
PI |
Si (propios) |
Segun tier |
Sus propios datos |
| Paciente Dependiente |
PD |
No |
N/A |
Gestionado por CR |
| Cuidador Solidario |
CS |
No |
No |
No tiene datos propios de pacientes |
| Cuidador Responsable |
CR |
Si (propios + PD) |
Segun tier |
Sus datos + todos sus PD |
3.2. Permisos Detallados por Rol
| Funcion |
PI |
PD |
CS |
CR |
| Crear backup manual propio |
Si |
No |
No |
Si |
| Exportar datos de dependientes |
N/A |
N/A |
No |
Si |
| Restaurar backup propio |
Si |
N/A |
No |
Si |
| Ver historial de backups |
Si |
No |
No |
Si |
| Configurar sync cloud |
Si (Pro/Perfect) |
N/A |
N/A |
Si (Pro/Perfect) |
3.3. Reglas de Negocio de Backup por Rol
| Regla |
Descripcion |
| RN-BCK-001 |
Un CSno puede exportar ni respaldar datos de los PI a los que esta vinculado |
| RN-BCK-002 |
Un CR puede exportar un backup que incluye sus datos Y los de todos sus PD |
| RN-BCK-003 |
Un PD no tiene acceso a funciones de backup; todo es gestionado por su CR |
| RN-BCK-004 |
Al restaurar backup de CR, se restauran automaticamente los perfiles de todos los PD incluidos |
4. Backup Manual (Exportacion .medtime)
4.1. Disponibilidad por Tier
| Aspecto |
Free |
Pro |
Perfect |
| Exportar backup manual |
Si |
Si |
Si |
| Frecuencia maxima |
Sin limite |
Sin limite |
Sin limite |
| Cifrado |
AES-256 + password usuario |
AES-256 + Master Key |
AES-256 + Master Key |
| Incluye imagenes |
Si (comprimidas) |
Si |
Si (calidad original) |
| Tamano maximo |
Depende del dispositivo |
Depende del dispositivo |
Depende del dispositivo |
4.2. Flujo de Backup Manual
sequenceDiagram
participant U as Usuario (PI o CR)
participant A as App MedTime
participant FS as File System
U->>A: Ir a Configuracion > Backup
A->>U: Mostrar opciones de backup
U->>A: Seleccionar "Crear Backup Manual"
A->>U: Mostrar resumen de datos a incluir
alt Tier Free
A->>U: Solicitar password de cifrado
U->>A: Ingresar y confirmar password
else Tier Pro/Perfect
A->>A: Usar Master Key automaticamente
A->>U: Opcion de agregar password adicional
end
A->>A: Recopilar datos locales
A->>A: Comprimir con gzip
A->>A: Cifrar con AES-256-GCM
A->>A: Generar checksum SHA-256
A->>U: Seleccionar destino
U->>A: Elegir destino (Files, iCloud, Share)
A->>FS: Guardar archivo .medtime
A->>U: Confirmar backup completado
Nombre: medtime_backup_[YYYYMMDD]_[HHmm]_[hash8].medtime
Ejemplo: medtime_backup_20251205_1430_a7f2b9c3.medtime
Estructura interna (ZIP cifrado):
medtime_backup.medtime
├── manifest.json # Metadatos del backup (NO cifrado)
├── profile.enc # Perfil del usuario (cifrado)
├── medications.enc # Lista de medicamentos (cifrado)
├── doses_history.enc # Historial de tomas (cifrado)
├── prescriptions.enc # Recetas digitalizadas (cifrado)
├── health_events.enc # Eventos de salud (cifrado)
├── appointments.enc # Citas medicas (cifrado)
├── settings.enc # Configuracion (cifrado)
├── dependents/ # Solo para CR
│ ├── dependent_1.enc # Perfil PD 1 (cifrado)
│ ├── dependent_2.enc # Perfil PD 2 (cifrado)
│ └── ...
├── images/ # Imagenes cifradas
│ ├── rx_001.enc.jpg
│ ├── treatment_001.enc.jpg
│ └── ...
└── checksum.sha256 # Hash de verificacion
4.4. Contenido de manifest.json
{
"format_version": "2.0",
"app_version": "1.0.0",
"created_at": "2025-12-05T14:30:00Z",
"created_by_role": "CR",
"tier_at_creation": "Pro",
"encryption": {
"algorithm": "AES-256-GCM",
"key_derivation": "Argon2id",
"has_user_password": true
},
"contents": {
"profile": true,
"medications": true,
"doses_history": true,
"prescriptions": true,
"health_events": true,
"appointments": true,
"settings": true,
"dependents_count": 2
},
"statistics": {
"medications_active": 5,
"medications_historical": 12,
"doses_count": 1847,
"prescriptions_count": 8,
"health_events_count": 156,
"appointments_count": 23,
"images_count": 15,
"total_size_bytes": 15728640
},
"checksum": "sha256:a7f2b9c3d4e5f6..."
}
5. Sincronizacion Cloud (Pro/Perfect)
5.1. Diferencia entre Sync y Backup
| Aspecto |
Sync Cloud |
Backup Manual |
| Proposito |
Mantener datos actualizados entre dispositivos |
Respaldo externo para emergencias |
| Frecuencia |
Tiempo real / continuo |
Bajo demanda |
| Destino |
Firebase (controlado por MedTime) |
Usuario elige (iCloud, Drive, USB) |
| Cifrado |
E2E con Master Key |
E2E con password usuario |
| Restauracion |
Automatica al iniciar sesion |
Manual, requiere archivo |
5.2. Mecanismo de Sync por Tier
| Tier |
Sync Cloud |
Frecuencia |
Incrementalidad |
| Free |
No disponible |
N/A |
N/A |
| Pro |
Si |
Cada cambio + batch cada 5 min |
Incremental |
| Perfect |
Si |
Tiempo real (< 1 segundo) |
Incremental en tiempo real |
5.3. Sync Incremental en Tiempo Real (Perfect)
OBS-059: Los usuarios Perfect tienen sincronizacion incremental en tiempo real.
sequenceDiagram
participant D1 as Dispositivo 1
participant FS as Firestore
participant D2 as Dispositivo 2
Note over D1,D2: Sync Incremental en Tiempo Real (Perfect)
D1->>D1: Usuario registra toma
D1->>D1: Cifrar cambio localmente
D1->>FS: Enviar delta cifrado
FS-->>D2: Push notification
D2->>FS: Solicitar delta
FS->>D2: Enviar delta cifrado
D2->>D2: Descifrar y aplicar cambio
Note over D1,D2: Latencia tipica: < 2 segundos
5.4. Sync por Lotes (Pro)
sequenceDiagram
participant D as Dispositivo
participant Q as Cola Local
participant FS as Firestore
Note over D,FS: Sync por Lotes (Pro)
D->>Q: Cambio 1 (registrar toma)
D->>Q: Cambio 2 (editar medicamento)
D->>Q: Cambio 3 (nueva medicion)
Note over Q: Esperar 5 minutos o 10 cambios
Q->>Q: Consolidar cambios
Q->>Q: Cifrar batch
Q->>FS: Enviar batch cifrado
FS->>FS: Almacenar
FS-->>D: Confirmar sync
5.5. Recovery Objectives
| Metrica |
Free |
Pro |
Perfect |
| RPO (Recovery Point Objective) |
N/A (solo local) |
5 minutos |
< 1 minuto |
| RTO (Recovery Time Objective) |
N/A |
4 horas |
1 hora |
| Maxima perdida de datos |
Todo si pierde dispositivo |
5 min de cambios |
Casi nada |
6. Estrategia de Respaldos en Servidor
6.1. Backups Automaticos de Firebase (Transparente)
Esta seccion describe los backups que MedTime realiza de la infraestructura Firebase, no backups visibles al usuario.
| Aspecto |
Configuracion |
| Backup de Firestore |
Diario automatico via Firebase |
| Backup de Cloud Storage |
Replicacion geografica activa |
| Retencion |
30 dias (estandar Firebase) |
| Ubicacion |
Multi-region Americas |
| Cifrado en reposo |
AES-256 (gestionado por Google) |
6.2. Nota sobre Zero-Knowledge
IMPORTANTE: Aunque Firebase realiza backups, los datos estan cifrados E2E. Un backup de Firebase contiene "blobs opacos" que no pueden descifrarse sin la Master Key del usuario.
7. Politica de Retencion
7.1. Retencion de Versiones en Cloud
| Aspecto |
Free |
Pro |
Perfect |
| Sync cloud |
N/A |
Si |
Si |
| Versiones almacenadas |
N/A |
7 versiones |
14 versiones |
| Tiempo de retencion |
N/A |
30 dias |
90 dias |
| Recuperacion selectiva |
N/A |
Si |
Si |
| Point-in-time recovery |
N/A |
No |
Si (ultimos 7 dias) |
7.2. Historial de Cambios (Versionado)
Para Pro/Perfect, cada entidad mantiene historial de versiones:
{
"medication_id": "med_abc123",
"current_version": 5,
"versions": [
{
"version": 5,
"timestamp": "2025-12-05T14:30:00Z",
"action": "UPDATE",
"changes": ["dosage", "schedule"],
"blob_encrypted": "base64..."
},
{
"version": 4,
"timestamp": "2025-12-04T10:15:00Z",
"action": "UPDATE",
"changes": ["name"],
"blob_encrypted": "base64..."
}
]
}
8. Restauracion de Datos
8.1. Metodos de Restauracion por Tier
| Metodo |
Free |
Pro |
Perfect |
| Desde archivo .medtime |
Si |
Si |
Si |
| Desde cloud (nuevo dispositivo) |
No |
Si |
Si |
| Version anterior especifica |
No |
Si |
Si |
| Point-in-time |
No |
No |
Si |
8.2. Flujo de Restauracion desde Archivo
sequenceDiagram
participant U as Usuario
participant A as App MedTime
participant FS as File System
U->>A: Ir a Configuracion > Backup > Restaurar
A->>U: Seleccionar origen del backup
U->>FS: Seleccionar archivo .medtime
FS->>A: Cargar archivo
A->>A: Verificar checksum
alt Checksum invalido
A->>U: Error: Archivo corrupto
else Checksum valido
A->>A: Leer manifest.json
A->>U: Mostrar resumen del backup
A->>U: Solicitar password de descifrado
U->>A: Ingresar password
A->>A: Derivar clave con Argon2id
A->>A: Intentar descifrar
alt Descifrado fallido
A->>U: Error: Password incorrecta
else Descifrado exitoso
A->>U: Seleccionar estrategia de merge
U->>A: Elegir estrategia
A->>A: Aplicar restauracion
A->>U: Restauracion completada
end
end
8.3. Estrategias de Merge
| Estrategia |
Descripcion |
Caso de Uso |
| Reemplazar todo |
Borra datos actuales, usa solo backup |
Nuevo dispositivo, datos locales corruptos |
| Combinar (preferir backup) |
Merge, en conflicto usa backup |
Restaurar desde backup mas reciente |
| Combinar (preferir local) |
Merge, en conflicto usa local |
Recuperar items especificos de backup viejo |
| Solo agregar |
Agrega items que no existen localmente |
Recuperar medicamentos eliminados |
8.4. Resolucion de Conflictos
flowchart TD
A[Item en backup y local] --> B{Mismo ID?}
B -->|No| C[Agregar como nuevo]
B -->|Si| D{Cual es mas reciente?}
D -->|Backup| E{Estrategia?}
D -->|Local| F{Estrategia?}
D -->|Igual| G[Sin conflicto]
E -->|Preferir backup| H[Usar backup]
E -->|Preferir local| I[Usar local]
F -->|Preferir backup| H
F -->|Preferir local| I
H --> J[Registrar en log de merge]
I --> J
C --> J
G --> J
9. Migracion entre Dispositivos
9.1. Metodos de Migracion por Tier
| Metodo |
Free |
Pro |
Perfect |
| Via archivo .medtime |
Si |
Si |
Si |
| Via login cloud |
No |
Si |
Si |
| Via QR local (futuro v1.5) |
No |
No |
No |
9.2. Migracion Free (Via Archivo)
sequenceDiagram
participant D1 as Dispositivo Antiguo
participant E as Almacenamiento Externo
participant D2 as Dispositivo Nuevo
Note over D1: Dispositivo a reemplazar
D1->>D1: Crear backup manual
D1->>E: Exportar .medtime a iCloud/Drive/USB
Note over D2: Nuevo dispositivo
D2->>D2: Instalar MedTime
D2->>D2: Seleccionar "Restaurar backup"
D2->>E: Seleccionar archivo .medtime
E->>D2: Cargar archivo
D2->>D2: Ingresar password
D2->>D2: Restaurar datos
D2->>D2: Configurar nuevo PIN
9.3. Migracion Pro/Perfect (Via Cloud)
sequenceDiagram
participant D1 as Dispositivo Antiguo
participant F as Firebase
participant D2 as Dispositivo Nuevo
Note over D1: Dispositivo a reemplazar (opcional)
D2->>D2: Instalar MedTime
D2->>D2: Seleccionar tier Pro/Perfect
D2->>F: Login con Google/Apple
F->>D2: Autenticar
alt Tier Perfect
D2->>D2: Verificar MFA
end
D2->>F: Solicitar datos
F->>D2: Enviar blobs cifrados
D2->>D2: Descifrar con Master Key
D2->>D2: Datos restaurados
Note over D2: Listo para usar
10. Recuperacion de Cuenta
10.1. Escenarios de Recuperacion por Tier
| Escenario |
Free |
Pro |
Perfect |
| Olvido de PIN |
Reinicio (pierde datos) |
Reset via Firebase |
Reset + MFA |
| Perdida de dispositivo |
Datos perdidos* |
Restaurar de cloud |
Restaurar de cloud |
| Olvido de password (backup) |
Datos de backup perdidos |
N/A |
N/A |
*Si tiene archivo .medtime guardado externamente, puede restaurar
10.2. Niveles de Recuperacion (Pro/Perfect)
| Nivel |
Metodo |
Tiempo |
Disponibilidad |
| 1 |
Email de verificacion |
Inmediato |
Pro/Perfect |
| 2 |
SMS de verificacion |
Inmediato |
Pro/Perfect |
| 3 |
Recovery Key (24 palabras) |
Inmediato |
Perfect |
| 4 |
Soporte manual |
24-72 horas |
Pro/Perfect |
10.3. Flujo de Recuperacion con Recovery Key (Perfect)
sequenceDiagram
participant U as Usuario
participant A as App MedTime
participant F as Firebase
U->>A: Seleccionar "Recuperar cuenta"
A->>U: Mostrar opciones de recuperacion
U->>A: Seleccionar "Recovery Key"
A->>U: Solicitar las 24 palabras
U->>A: Ingresar palabras BIP-39
A->>A: Derivar Master Key de palabras
A->>F: Verificar contra hash almacenado
alt Verificacion exitosa
F->>A: Confirmar identidad
A->>U: Configurar nuevo password
A->>U: Configurar nuevo MFA
A->>A: Re-derivar Master Key
A->>U: Cuenta recuperada
else Verificacion fallida
A->>U: Error: Recovery Key incorrecta
end
11. Reglas de Negocio
| Regla |
Descripcion |
| RN-BCK-010 |
Backup manual no puede exceder 500MB por archivo |
| RN-BCK-011 |
Sync cloud requiere al menos 10% de bateria |
| RN-BCK-012 |
Sync Pro espera WiFi si archivo > 50MB |
| RN-BCK-013 |
Sync Perfect usa cualquier conexion (datos o WiFi) |
| RN-BCK-014 |
Restauracion siempre pide confirmacion antes de modificar datos |
| RN-BCK-015 |
Un CR que restaura backup restaura todos sus PD automaticamente |
| RN-BCK-016 |
Password de backup tiene minimo 8 caracteres |
| RN-BCK-017 |
Despues de 5 intentos fallidos de password, esperar 15 minutos |
12. Consideraciones de Seguridad
12.1. Cifrado
| Capa |
Algoritmo |
Notas |
| Archivo .medtime |
AES-256-GCM |
Password derivada con Argon2id |
| Transporte |
TLS 1.3 |
Conexion a Firebase |
| Datos en Firebase |
AES-256-GCM |
Cifrado E2E con Master Key |
| Imagenes |
AES-256-GCM |
Mismo cifrado que datos |
12.2. Proteccion de Claves
| Componente |
Almacenamiento |
| Master Key |
Keychain (iOS) / Keystore (Android) |
| Recovery Key |
Nunca almacenada digitalmente (usuario guarda en papel) |
| Password de backup |
Nunca almacenada (usuario debe recordar) |
| Salt |
Almacenado con datos cifrados |
12.3. Zero-Knowledge en Backups
PRINCIPIO ZERO-KNOWLEDGE EN BACKUPS:
1. Firebase almacena blobs cifrados
2. Las claves de cifrado NUNCA salen del dispositivo
3. Un backup de Firebase es inutil sin Master Key
4. MedTime (empresa) no puede acceder a datos de usuarios
5. Archivo .medtime es inutil sin password del usuario
13. Integracion con Otros Modulos
| Modulo |
Integracion |
| MTS-AUTH-001 |
Master Key derivada de credenciales |
| MTS-PRI-001 |
Consentimiento para sync cloud |
| MTS-SEC-001 |
Algoritmos de cifrado |
| MTS-ONB-001 |
Configuracion inicial de backup |
14. Criterios de Aceptacion
14.1. Backup Manual
14.2. Sync Cloud
14.3. Restauracion
15. Glosario
| Termino |
Definicion |
| .medtime |
Formato de archivo de backup exportable de MedTime |
| RPO |
Recovery Point Objective - maxima perdida de datos aceptable |
| RTO |
Recovery Time Objective - tiempo maximo para restaurar servicio |
| Sync |
Sincronizacion continua de datos entre dispositivos |
| Backup |
Copia de seguridad en un momento especifico |
| Master Key |
Clave criptografica derivada de credenciales del usuario |
| Recovery Key |
24 palabras BIP-39 para recuperar cuenta Perfect |
| Zero-Knowledge |
Arquitectura donde el servidor no puede ver datos |
Documento generado por SpecQueen - "Tus datos son tu activo mas valioso. Esta especificacion los protege como se merecen."