# Simulacro de restauración (mensual, obligatorio) Un backup que nunca se probó restaurar no es un backup. Correr esto en un ambiente descartable (nunca contra staging/producción reales). ## Checklist - [ ] Levantar un Postgres nuevo y vacío (contenedor descartable). - [ ] Restaurar el backup más reciente de `panels_platform`: - pgBackRest: `pgbackrest --stanza=panels_platform restore` - o `pg_restore` si es dump lógico. - [ ] Restaurar el backup más reciente de `panels_product` (mismo método). - [ ] Correr [`db/provision/verify-isolation.sh`](../provision/verify-isolation.sh) contra el ambiente restaurado -- confirma que roles/RLS/permisos sobrevivieron el restore intactos, no solo los datos. - [ ] Spot-check de datos: comparar conteos de filas y 2-3 registros conocidos contra lo que se espera (usar el mismo enfoque que `verifyCounts()`/`verifyMoney()` del ETL, ver [`api/scripts/migrate-sqlite-to-postgres.ts`](../../api/scripts/migrate-sqlite-to-postgres.ts) como referencia de qué comparar). - [ ] Si hay WAL archiving: probar un restore a un punto en el tiempo específico (no solo "el último backup"), confirmar que aterriza en el estado esperado para ese instante. - [ ] Archivos (Contabo): confirmar que al menos una descarga de documento cifrado conocido sigue descifrando correctamente después del restore (prueba de que la clave `DOCS_KEY` y el bucket siguen consistentes). - [ ] Documentar cuánto tardó el restore de punta a punta -- es el RTO real, no el teórico. - [ ] Destruir el ambiente descartable al terminar. ## Cuándo escalar Si cualquier paso falla (restore no completa, RLS no aplica, datos no cuadran, documento no descifra), **no esperar al siguiente simulacro** -- es una señal de que el backup en producción probablemente tampoco sirve. Tratarlo como incidente, no como hallazgo de rutina.