Restic: Backups bien hechos

12 minutos de lectura

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.

1restic -r /mnt/backup/restic-repo/ init
2enter password for new repository:
3enter password again:
4created restic repository 63aa0a7da1 at /mnt/backup/rock64pro/
5
6Please note that knowledge of your password is required to access
7the repository. Losing your password means that your data is
8irrecoverably lost.

Snapshots

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

1restic -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

1cat files_to_backup.txt
2
3/mnt/datos/Docker
4/mnt/datos/Media/
5/home/carlos/.config/rclone/
6/home/carlos/
7/mnt/Datos

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

 1cat restic_exclude.txt
 2
 3Cine
 4Descargas
 5Series
 6snap
 7.var
 8.cache*
 9.config
10.java
11.local
12.mozilla
13.npm
14.texlive*
15.pki

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

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

 1restic -r /mnt/backup/restic-repo backup -v --exclude-file=/home/carlos/bin/restic_exclude.txt --files-from=/home/carlos/bin/files_to_backu
 2p.txt
 3
 4open repository
 5enter password for repository:
 6repository 7de6b43c opened successfully, password is correct
 7created new cache in /home/carlos/.cache/restic
 8lock repository
 9load index files
10start scan on [/mnt/datos/Media/ /mnt/datos/Docker /home/carlos/.config/rclone/ /home/carlos/ /mnt/Datos]
11start backup on [/mnt/datos/Media/ /home/carlos/.config/rclone/ /home/carlos/ /mnt/Datos]
12scan finished in 2.602s: 13951 files, 116.108 GiB
13uploaded intermediate index 22ef84c1
14uploaded intermediate index 0577a3fc
15uploaded intermediate index 62137f3c
16uploaded intermediate index 9879e123
17uploaded intermediate index 8c1d949d
18uploaded intermediate index 5d0998ca
19uploaded intermediate index ce2d979f
20uploaded intermediate index 687dc618
21uploaded intermediate index 3ee65924
22uploaded intermediate index b2cf68d2
23uploaded intermediate index e4c8ce08
24uploaded intermediate index cd7d3cc7
25uploaded intermediate index 573cab23
26uploaded intermediate index 4510e38d
27uploaded intermediate index cdc57cc2
28
29Files:       13951 new,     0 changed,     0 unmodified
30Dirs:            5 new,     0 changed,     0 unmodified
31Data Blobs:  90498 new
32Tree Blobs:      5 new
33Added to the repo: 105.900 GiB
34
35processed 13951 files, 116.108 GiB in 38:43
36snapshot e7361c36 saved

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

 1restic -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
 2
 3open repository
 4enter password for repository:
 5repository 7de6b43c opened successfully, password is correct
 6created new cache in /home/carlos/.cache/restic
 7lock repository
 8load index files
 9start scan on [/home/carlos /etc/fstab]
10start backup on [/home/carlos /etc/fstab]
11scan finished in 0.987s: 15511 files, 4.326 GiB
12uploaded intermediate index afed672a
13uploaded intermediate index 84bf78d8
14uploaded intermediate index 7fee166e
15
16Files:       15511 new,     0 changed,     0 unmodified
17Dirs:            2 new,     0 changed,     0 unmodified
18Data Blobs:   8506 new
19Tree Blobs:      3 new
20Added to the repo: 3.215 GiB
21
22processed 15511 files, 4.326 GiB in 9:59
23snapshot 9863a3d6 saved

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

 1restic -r /mnt/backup/restic-repo/ snapshots
 2
 3enter password for repository:
 4repository 7de6b43c opened successfully, password is correct
 5ID        Time                 Host        Tags        Paths
 6----------------------------------------------------------------------------------
 79863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
 8                                                       /etc/fstab
 9
10e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
11                                                       /home/carlos/.config/rclone
12                                                       /home/carlos
13                                                       /mnt/Datos
14----------------------------------------------------------------------------------
152 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

 1restic -r /mnt/backup/restic-repo/ snapshots
 2
 3enter password for repository:
 4repository 7de6b43c opened successfully, password is correct
 5ID        Time                 Host        Tags        Paths
 6----------------------------------------------------------------------------------
 79863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
 8                                                       /etc/fstab
 9
10e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
11                                                       /home/carlos/.config/rclone
12                                                       /home/carlos
13                                                       /mnt/Datos
14
15d3e8a462  2019-11-11 13:52:27  rockpro64               /mnt/datos/Docker
16                                                       /mnt/datos/Media
17                                                       /home/carlos/.config/rclone
18                                                       /home/carlos
19                                                       /mnt/Datos
20----------------------------------------------------------------------------------

Vamos a comparar los snapshots e7361c36 y d3e8a462

 1restic -r /mnt/backup/restic-repo/ diff e7361c36 d3e8a462
 2.............
 3.............
 4+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMNotation.php
 5+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMProcessingInstruction.php
 6+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/DOM/DOMText.php
 7+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/NodeTrait.php
 8+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Nodes/NodeUtility.php
 9+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/ParseException.php
10+    /mnt/datos/Docker/Config/tt-rss/www/tt-rss/vendor/andreskrey/Readability/Readability.php
11+    /mnt/datos/Docker/mnt/
12+    /mnt/datos/Docker/mnt/Datos/
13+    /mnt/datos/Docker/mnt/Datos/Config/
14+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/
15+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/etc/
16+    /mnt/datos/Docker/mnt/Datos/Config/letsencrypt/etc/letsencrypt/
17
18Files:       54646 new,     0 removed,     3 changed
19Dirs:        18248 new,     0 removed
20Others:          9 new,     0 removed
21Data Blobs:  40347 new,     3 removed
22Tree Blobs:  18128 new,     6 removed
23  Added:   9.757 GiB
24  Removed: 79.628 KiB

Integridad de datos

Podemos chequear la integridad de los snapshots

 1restic -r /mnt/backup/restic-repo check
 2
 3using temporary cache in /tmp/restic-check-cache-095442303
 4enter password for repository:
 5repository 7de6b43c opened successfully, password is correct
 6created new cache in /tmp/restic-check-cache-095442303
 7create exclusive lock for repository
 8load indexes
 9check all packs
10check snapshots, trees and blobs
11no 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

1restic -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.

1restic -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

1restic -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

 1restic -r /mnt/backup/restic-repo/ snapshots
 2
 3enter password for repository:
 4repository 7de6b43c opened successfully, password is correct
 5ID        Time                 Host        Tags        Paths
 6----------------------------------------------------------------------------------
 79863a3d6  2019-11-11 00:31:53  asus                    /home/carlos
 8                                                       /etc/fstab
 9
10e7361c36  2019-11-11 00:43:34  rockpro64               /mnt/datos/Media
11                                                       /home/carlos/.config/rclone
12                                                       /home/carlos
13                                                       /mnt/Datos
14
15d3e8a462  2019-11-11 13:52:27  rockpro64               /mnt/datos/Docker
16                                                       /mnt/datos/Media
17                                                       /home/carlos/.config/rclone
18                                                       /home/carlos
19                                                       /mnt/Datos
20----------------------------------------------------------------------------------

Vamos a eliminar e7361c36

1restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo forget e7361c36
2
3enter password for repository:
4repository 7de6b43c opened successfully, password is correct
5removed snapshot e7361c36

La instantánea a desaparecido pero los datos permanecen

 1restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo snapshots
 2
 3enter password for repository:
 4repository 7de6b43c opened successfully, password is correct
 5ID        Time                 Host        Tags        Paths
 6----------------------------------------------------------------------------------
 79863a3d6  2019-11-11 00:31:53  asus                    /etc/fstab
 8                                                       /home/carlos
 9
10d3e8a462  2019-11-11 13:52:27  rockpro64               /home/carlos
11                                                       /home/carlos/.config/rclone
12                                                       /mnt/Datos
13                                                       /mnt/datos/Docker
14                                                       /mnt/datos/Media
15----------------------------------------------------------------------------------
162 snapshots

Debemos de ejecutar prune para borrarlos

 1restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo prune
 2
 3enter password for repository:
 4repository 7de6b43c opened successfully, password is correct
 5counting files in repo
 6building new index for repo
 7[4:15] 100.00%  24487 / 24487 packs
 8repository contains 24487 packs (155585 blobs) with 118.397 GiB
 9processed 155585 blobs: 0 duplicate blobs, 0 B duplicate
10load all snapshots
11find data that is still in use for 2 snapshots
12[0:02] 100.00%  2 / 2 snapshots
13found 155576 of 155585 data blobs still in use, removing 9 blobs
14will remove 0 invalid files
15will delete 0 packs and rewrite 3 packs, this frees 80.543 KiB
16[0:04] 100.00%  3 / 3 packs rewritten
17counting files in repo
18[1:05] 100.00%  24487 / 24487 packs
19finding old index files
20saved new indexes as [da1dc7dc 8e2eebbf 4af89e5b d1adebbb 4878f70d 13b325f0 b1c78d18 a784df91 3a05e9ed]
21remove 25 old index files
22[0:00] 100.00%  3 / 3 packs deleted
23done

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… :penguin:

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