# Respaldos y recuperación Qué hay que respaldar, y qué se pierde si no está. ## Las tres cosas a respaldar ``` ┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ BASE DE DATOS │ │ ARCHIVOS SUBIDOS │ │ CÓDIGO │ │ │ │ │ │ │ │ 91 tablas │ │ uploads/terms/ │ │ repositorio git │ │ pacientes, turnos, │ │ uploads/turnero/ │ │ │ │ formularios, │ │ │ │ ya respaldado por │ │ firmas │ │ NO están en git │ │ estar en el remoto │ └────────────────────┘ └────────────────────┘ └────────────────────┘ crítico crítico cubierto ``` El código está a salvo por estar versionado. Los otros dos **no tienen respaldo automático por el solo hecho de existir**. ## Base de datos Es lo único irreemplazable. Contiene historia clínica, consentimientos firmados y facturación — información con valor legal y sin forma de reconstruirse. ```bash mysqldump -h -u -p \ --single-transaction --routines --triggers \ | gzip > respaldo_$(date +%F).sql.gz ``` `--single-transaction` evita bloquear las tablas mientras corre, así se puede hacer con el sistema en uso. ### Qué contiene lo crítico | Tabla | Por qué importa | |---|---| | `lab_pacientes` | Fichas clínicas | | `turnero_consentimientos`, `lab_form_envios` | **Formularios firmados** — valor legal | | `turnero_turnos`, `turnero_solicitudes` | Historial de atención y facturación | | `terms_acceptance` | Aceptación de términos, ~5.000 registros | | `admin_users`, `roles`, `role_modules` | Acceso al sistema | Las firmas se guardan como imagen **dentro** de las tablas, no como archivos sueltos. Un respaldo de la base las incluye. ## Archivos subidos ``` uploads/terms/ documentos de términos y condiciones uploads/turnero/tv_media/ videos e imágenes de la pantalla de TV ``` **No están en el repositorio.** Al mover el sistema de servidor hay que copiarlos aparte, o los enlaces quedan apuntando a archivos que ya no existen. Es exactamente lo que pasó con el documento de términos cuando cambió el dominio: la base seguía apuntando a una URL que ya no respondía. ## Antes de un cambio riesgoso Si va a tocar datos en producción, respalde **solo lo que va a tocar**: ```bash mysqldump -h -u -p role_modules admin_users \ > antes_del_cambio.sql ``` Es rápido y suele alcanzar. Un respaldo completo para cambiar una columna es desproporcionado; no tener ninguno es imprudente. ## Verificar que el respaldo sirve Un respaldo que nunca se restauró no es un respaldo, es un archivo: ```bash gunzip -t respaldo_2026-08-03.sql.gz # ¿está íntegro? zcat respaldo_2026-08-03.sql.gz | head -40 # ¿tiene lo que espera? ``` Lo ideal es restaurarlo de vez en cuando en una base de prueba y comprobar que el sistema arranca contra ella. ## Qué NO es recuperable Aunque tengas respaldos, hay datos que nunca se guardaron y no hay de dónde sacarlos: | Dato | Desde cuándo existe | |---|---| | Quién creó cada consentimiento del turnero | 3 de agosto de 2026 | | Quién firmó cada toma de F-LAB-28 | 3 de agosto de 2026 | | Cédula del personal no enfermero | 3 de agosto de 2026 | Los registros anteriores tienen esos campos vacíos, y **no hay traza de auditoría** que permita reconstruirlos. Vale como advertencia: cuando se agrega una columna para registrar quién hizo algo, lo anterior se pierde.