Restic: Backups bien hechos

Después de trabajar con rnsaphot y Duplicati, encontré restic, teniendo como principal ventaja respecto a los anteriores el uso de la deduplicacion de ficheros, por lo tanto no distingue entre backups incrementales o totales, usa la función inteligente de deduplicación para los datos, por lo que todos los backups son siempre incrementales, solo los archivos nuevos o con cambios serán subidos al repositorio.

También y no menos importante es que el repositorio se cifra, por lo que nuestros datos se mantienen a salvo de miradas indiscretas.

La deduplicación es un proceso que elimina copias redundantes de datos y reduce la sobrecarga de almacenamiento

Las técnicas de deduplicación aseguran que solo una instancia única de datos se retiene en los medios de almacenamiento, lo que aumenta considerablemente la eficiencia del almacenamiento y flexibilidad.

Repositorios

restic debe de crear un repositorio donde almacenar snapshots, estado actual de los ficheros que forman parte de la copia de seguridad (instantáneas).

Estos repositorios pueden estar en un sistema de archivos local, un servidores SFTP, Webdav, REST, Amazon S3, Minio, OpenStack Swift, Backblaze B2, Microsoft Azure Blob Storage, Google Cloud Storage u otros servicios vía Rclone

Si utilizas Git, puede que esto que te estoy contando te suene, y es que al igual que en Git, el repositorio se ha de inicializar antes de poder ser utilizado, por ejemplo para un repositorio local seria mediante el comando init, de todas formas restic, está muy bien documentado

Para crear el repositorio se nos pedirá crear una contraseña que se usará para cifrar el repositorio, siempre que vayamos a realizar una acción en el repositorio si nos pedirá esta contraseña.

restic -r /mnt/backup/restic-repo/ init
enter password for new repository:
enter password again:
created restic repository 63aa0a7da1 at /mnt/backup/rock64pro/

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

Snapshots

Una vez inicializado el repositorio podemos empezar a realizar backups de nuestros datos, llamados snapshots en restic, con el comando backup

restic -r /servidor/nombre-repo --verbose backup ~/directorioH

Para facilitarnos las cosas podemos crearnos un fichero de texto e incluir los ficheros o carpetas que queremos salvaguardar

cat files_to_backup.txt

/mnt/datos/Docker
/mnt/datos/Media/
/home/carlos/.config/rclone/
/home/carlos/
/mnt/Datos

De igual forma también podemos crear otro fichero de texto para excluir carpetas o ficheros.

cat restic_exclude.txt

Cine
Descargas
Series
snap
.var
.cache*
.config
.java
.local
.mozilla
.npm
.texlive*
.pki

Y pasarle ambos ficheros restic --exclude-file y --files-from respectivamente

Para hacer un snapshots en un sistema de ficheros local, por ejemplo:

restic -r /mnt/backup/restic-repo backup -v --exclude-file=/home/carlos/bin/restic_exclude.txt --files-from=/home/carlos/bin/files_to_backu
p.txt

open repository
enter password for repository:
repository 7de6b43c opened successfully, password is correct
created new cache in /home/carlos/.cache/restic
lock repository
load index files
start scan on [/mnt/datos/Media/ /mnt/datos/Docker /home/carlos/.config/rclone/ /home/carlos/ /mnt/Datos]
start backup on [/mnt/datos/Media/ /home/carlos/.config/rclone/ /home/carlos/ /mnt/Datos]
scan finished in 2.602s: 13951 files, 116.108 GiB
uploaded intermediate index 22ef84c1
uploaded intermediate index 0577a3fc
uploaded intermediate index 62137f3c
uploaded intermediate index 9879e123
uploaded intermediate index 8c1d949d
uploaded intermediate index 5d0998ca
uploaded intermediate index ce2d979f
uploaded intermediate index 687dc618
uploaded intermediate index 3ee65924
uploaded intermediate index b2cf68d2
uploaded intermediate index e4c8ce08
uploaded intermediate index cd7d3cc7
uploaded intermediate index 573cab23
uploaded intermediate index 4510e38d
uploaded intermediate index cdc57cc2

Files:       13951 new,     0 changed,     0 unmodified
Dirs:            5 new,     0 changed,     0 unmodified
Data Blobs:  90498 new
Tree Blobs:      5 new
Added to the repo: 105.900 GiB

processed 13951 files, 116.108 GiB in 38:43
snapshot e7361c36 saved

Y para un snapshots en un servidor SFTP sería tan fácil como:

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo backup -v --exclude-file=/home/carlos/bin/restic/restic_exclude.txt --files-from=/home/carlos/bin/restic/files_to_backup.txt

open repository
enter password for repository:
repository 7de6b43c opened successfully, password is correct
created new cache in /home/carlos/.cache/restic
lock repository
load index files
start scan on [/home/carlos /etc/fstab]
start backup on [/home/carlos /etc/fstab]
scan finished in 0.987s: 15511 files, 4.326 GiB
uploaded intermediate index afed672a
uploaded intermediate index 84bf78d8
uploaded intermediate index 7fee166e

Files:       15511 new,     0 changed,     0 unmodified
Dirs:            2 new,     0 changed,     0 unmodified
Data Blobs:   8506 new
Tree Blobs:      3 new
Added to the repo: 3.215 GiB

processed 15511 files, 4.326 GiB in 9:59
snapshot 9863a3d6 saved

Podemos utilizar el repositorio para el backup desde varios ordenadores con restic, en el ejemplo, ves dos snapshots, realizadas desde diferentes hosts.

restic -r /mnt/backup/restic-repo/ snapshots

enter password for repository:
repository 7de6b43c opened successfully, password is correct
ID        Time                 Host        Tags        Paths
----------------------------------------------------------------------------------
9863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
                                                       /etc/fstab

e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
                                                       /home/carlos/.config/rclone
                                                       /home/carlos
                                                       /mnt/Datos
----------------------------------------------------------------------------------
2 snapshots

Comparación entre snapshots

Para ver las diferencias entre snapshots utilizamos el comando diff, para el ejemplo he creado un nuevo snapshots añadiendo la ruta /mnt/datos/Docker/ a mi fichero --files-from

restic -r /mnt/backup/restic-repo/ snapshots

enter password for repository:
repository 7de6b43c opened successfully, password is correct
ID        Time                 Host        Tags        Paths
----------------------------------------------------------------------------------
9863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
                                                       /etc/fstab

e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
                                                       /home/carlos/.config/rclone
                                                       /home/carlos
                                                       /mnt/Datos

d3e8a462  2019-11-11 13:52:27  rockpro64               /mnt/datos/Docker
                                                       /mnt/datos/Media
                                                       /home/carlos/.config/rclone
                                                       /home/carlos
                                                       /mnt/Datos
----------------------------------------------------------------------------------

Vamos a comparar los snapshots e7361c36 y d3e8a462

restic -r /mnt/backup/restic-repo/ diff e7361c36 d3e8a462
.............
.............
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMNotation.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMProcessingInstruction.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMText.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/NodeTrait.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/NodeUtility.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/ParseException.php
+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Readability.php
+    /mnt/datos/Docker/mnt/
+    /mnt/datos/Docker/mnt/Datos/
+    /mnt/datos/Docker/mnt/Datos/Config/
+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/
+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/etc/
+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/etc/letsencrypt/

Files:       54646 new,     0 removed,     3 changed
Dirs:        18248 new,     0 removed
Others:          9 new,     0 removed
Data Blobs:  40347 new,     3 removed
Tree Blobs:  18128 new,     6 removed
  Added:   9.757 GiB
  Removed: 79.628 KiB

Integridad de datos

Podemos chequear la integridad de los snapshots

restic -r /mnt/backup/restic-repo check

using temporary cache in /tmp/restic-check-cache-095442303
enter password for repository:
repository 7de6b43c opened successfully, password is correct
created new cache in /tmp/restic-check-cache-095442303
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
no errors were found

Recuperación

Para la recuperación de datos restic nos ofrece dos posibilidades:

Montando snapshots

Mediante el comando mount podemos montar el snapshot en una carpeta vacia y recuperar el archivo

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo mount /home/carlos/restic/

Mediante comando

Con el comando restore vamos a poder recuperar todo el snapshot, o un fichero o carpeta en particular si sabemos la ubicación.

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo restore 9863a3d6 --target ~/home/carlos/restore

Recuperará todos los datos del snapshot 9863a3d6 en la carpeta /home/carlos/restore

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo restore 9863a3d6 --target ~/home/carlos/restore fstab

Recupera fstab en la carpeta /home/carlos/restore

Borrado de snapshots

Como no disponemos de un tamaño ilimitado en nuestros discos, debemos de ir borrando las versiones mas viejas de nuestros snapshots.

Lo podemos hacer manualmente (especificando el ID del snaphot a eliminar) o mediante una política que defina qué snapshots borrar..

Borrando un snapshot

Se deben invocar dos comandos, forget para eliminar una instantánea y prune para eliminar realmente los datos.

La ejecución de prune tardan casi tanto como las copias de seguridad. Durante este proceso el índice se bloquea y no se pueden completar las copias de seguridad.

Es aconsejable ejecutar un check después de cada prune

Partimos de los siguientes snapshots

restic -r /mnt/backup/restic-repo/ snapshots

enter password for repository:
repository 7de6b43c opened successfully, password is correct
ID        Time                 Host        Tags        Paths
----------------------------------------------------------------------------------
9863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
                                                       /etc/fstab

e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
                                                       /home/carlos/.config/rclone
                                                       /home/carlos
                                                       /mnt/Datos

d3e8a462  2019-11-11 13:52:27  rockpro64               /mnt/datos/Docker
                                                       /mnt/datos/Media
                                                       /home/carlos/.config/rclone
                                                       /home/carlos
                                                       /mnt/Datos
----------------------------------------------------------------------------------

Vamos a eliminar e7361c36

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo forget e7361c36

enter password for repository:
repository 7de6b43c opened successfully, password is correct
removed snapshot e7361c36

La instantánea a desaparecido pero los datos permanecen

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo snapshots

enter password for repository:
repository 7de6b43c opened successfully, password is correct
ID        Time                 Host        Tags        Paths
----------------------------------------------------------------------------------
9863a3d6  2019-11-11 00:31:53  asus                    /etc/fstab
                                                       /home/carlos

d3e8a462  2019-11-11 13:52:27  rockpro64               /home/carlos
                                                       /home/carlos/.config/rclone
                                                       /mnt/Datos
                                                       /mnt/datos/Docker
                                                       /mnt/datos/Media
----------------------------------------------------------------------------------
2 snapshots

Debemos de ejecutar prune para borrarlos

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo prune

enter password for repository:
repository 7de6b43c opened successfully, password is correct
counting files in repo
building new index for repo
[4:15] 100.00%  24487 / 24487 packs
repository contains 24487 packs (155585 blobs) with 118.397 GiB
processed 155585 blobs: 0 duplicate blobs, 0 B duplicate
load all snapshots
find data that is still in use for 2 snapshots
[0:02] 100.00%  2 / 2 snapshots
found 155576 of 155585 data blobs still in use, removing 9 blobs
will remove 0 invalid files
will delete 0 packs and rewrite 3 packs, this frees 80.543 KiB
[0:04] 100.00%  3 / 3 packs rewritten
counting files in repo
[1:05] 100.00%  24487 / 24487 packs
finding old index files
saved new indexes as [da1dc7dc 8e2eebbf 4af89e5b d1adebbb 4878f70d 13b325f0 b1c78d18 a784df91 3a05e9ed]
remove 25 old index files
[0:00] 100.00%  3 / 3 packs deleted
done

Borrando snapshots conforme a una política

restic permite especificar qué instantáneas deben eliminarse automáticamente de acuerdo con una política. Podemos especificar cuántas instantáneas por hora, diarias, semanales, mensuales y anuales mantener.

El comando forget acepta los siguientes parámetros:

  • --keep-last n nunca borra las n últimas instantáneas (más recientes)

  • --keep-hourly n durante las últimas n horas en que se realizó una instantánea, conserve solo la última instantánea por cada hora.

  • --keep-daily n para los últimos n días que tienen una o más instantáneas, solo guarde la última para ese día.

  • --keep-weekly n durante las últimas n semanas que tienen una o más instantáneas, solo guarde la última para esa semana.

  • --keep-monthly n para los últimos n meses que tienen una o más instantáneas, solo guarde la última para ese mes.

  • --keep-yearly n durante los últimos n años que tengan una o más instantáneas, solo conserve la última para ese año.

  • --keep-tag mantiene todas las instantáneas que tienen todas las etiquetas especificadas por esta opción (se puede especificar varias veces).

  • --keep-within duración conserva todas las instantáneas que se han realizado dentro de la duración de la última instantánea. duración debe ser varios años, meses, días y horas, por ejemplo, 2y5m7d3h mantendrá todas las instantáneas realizadas en los dos años, cinco meses, siete días y tres horas antes de la última instantánea.

Por ejemplo forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --keep-yearly 3 mantendrá las 7 instantáneas diarias más recientes, luego las 5 del ultimo día de la semana y 12 del ultimo día del mes y finalmente 3 del ultimo día del año

Tips

  • Utiliza ls latest para ver un listado de los ficheros del ultimo snapshot

  • Usa las palabra latest para restaurar desde el ultimo backup. También podemos combinar latest con los filtros --host y --path

  • Usa --exclude e --include para restringir la recuperación de ficheros en el snapshot

  • Usa el parámetro --dry-run antes de eliminar un snapshot, esto le indica a restic que no elimine nada,solo mostrara las instantáneas que se eliminarían.

  • Si no quieres introducir constantemente la contraseña del repositorio puedes almacenarla en un archivo y utilizar la opción --password-file, protege el archivo cambiando los permisos a 0600

Terminando

No quería hacer un articulo tan extenso, pero para ser sinceros, a la vez que he ido redactando el artículo he ido viendo y comprobando el funcionamiento de restic, es más, ya estoy migrando mi sistema de backups desde rnsaphot a restic

Como siempre te remito a la documentación si quieres profundizar más sobre el uso de esta fantástica herramienta.

Espero que te haya gustado, pasa un buen día… 🐧

  • Referencia:
[https://fedoramagazine.org/use-restic-encrypted-backups/](https://fedoramagazine.org/use-restic-encrypted-backups/)