Escenario
Tenemos una aplicación de tipo SpringBoot desplegada en una instancia ec2 de Amazon, con el sistema operativo Amazon Linux. Para sincronizar los cambios con el código desplegado en producción utilizo rsync en este script de bash:
1 2 3 4 5 6 7 8 |
#!/bin/sh USER=ec2-user HOST=acme.com APPLICATION_DIR=/home/marcos/NetBeansProjects/acme_web DESTINATION_DIR=/var/app/acme/web cd ${APPLICATION_DIR}; rsync -rltvz * --exclude=target --exclude=node_modules/* --exclude=node --exclude=*.log --exclude=src/main/resources/public/ ${USER}@${HOST}:${DESTINATION_DIR} exit 0 |
Problema
Olvidé excluir la carpeta en la que los usuarios suben ficheros en la web con lo que pude presenciar en directo como se iban borrando uno a uno en el servidor de producción
1 2 3 4 5 6 |
deleting src/main/resources/upload/files-repository/aaa.xlsx deleting src/main/resources/upload/files-repository/bbb.csv deleting src/main/resources/upload/files-repository/ccc.xlsx deleting src/main/resources/upload/files-repository/ddd.csv deleting src/main/resources/upload/files-repository/eee.xlsx deleting src/main/resources/upload/files-repository/fff.csv |
Solución
Amazon Linux ustiliza el sistema de ficheros xfs. Buscando en Goolge encontré una herramienta con la que supuestamente se podría recuperar ficheros borrados en ese sistema de ficheros, xfs_undelete. Para recuperar los archivos el disco de origen tiene que estar desmontado. Seguí los pasos siguientes:- Creo un snapshot del disco
- Creo un volumen a partir del snapshot
- Lo engancho (attach) a la intancia. Atención al elegir la zona, debe coincidir con la de la instancia.
- Localizo el dispositivo en /dev, en mi caso aparece como /dev/sdf1
1 |
sudo yum install expect |
1 |
sudo tclsh installer.tcl |
1 |
sudo ./xfs_undelete /dev/sdf |