Skip to content

Instantly share code, notes, and snippets.

@Asmilex
Created December 27, 2022 11:33
Show Gist options
  • Save Asmilex/37db3e71eea6ebddb034068a1e5cb335 to your computer and use it in GitHub Desktop.
Save Asmilex/37db3e71eea6ebddb034068a1e5cb335 to your computer and use it in GitHub Desktop.
Automatización de backups con Restic

Estrategia de backups

Programa clave: Restic - backups done right!.

TL:DR

  1. Inicializa el repositorio. No pierdas la contraseña.
restic init --repo repositorio
  1. Genera una contraseña segura para las copias automatizadas:
    1. Crea una contraseña con openssl rand -base64 128. Guarda el resultado en un archivo (safe-password.restic lo he llamado yo). Usaremos este archivo para las copias automatizadas.
    2. Añade la nueva clave al repositorio: restic -r repositorio key add.
  2. Indica las carpetas a copiar, y las que quieras excluir. Modifica los archivos included-files.txt y excluded-files.txt. Admite wildcards.
  3. Haz el backup. Usa --dry-run para comprobar que de verdad hace lo que quieres:
restic -r repositorio backup --files-from ./included-files.txt --exclude-file ./excluded-files.txt --dry-run
  1. Automatiza el proceso de backups. Utiliza cron o algo similar para lograrlo.

Lo más normal es crear un script parecido al siguiente, pero con los parámetros correctos:

#!/bin/sh

restic -r repositorio backup --files-from ./included-files.txt --exclude-file ./excluded-files.txt --password-file ./safe-password.restic

En mi caso, dado que estoy usando Rocky Linux (RHEL modificado), he optado por usar anacron, ya que lo trae por defecto. He colocado en la carpeta /etc/cron.weekly el script anterior con las rutas modificadas. Puedes forzar la ejecución de las tareas con anacron -f o run-parts /etc/cron.weekly.

  1. Automatiza la limpieza de snapshots. Análogo al anterior.

Creación de un repositorio

Primero, tenemos que inicializar la carpeta de destino. En Restic se denominan repositorios. Para operarlos, es necesario proporcionar una contraseña, la cual fijaremos al crear el repositorio.

No pierdas la contraseña.

O estás jodido. Es tu única forma de recuperar la información.

Para crear un repositorio en local, haz lo siguiente:

restic init --repo /path/al/repositorio

Hay bastantes tipos de repositorios diferentes disponibles; no solo tiene que ser en local. Mira la documentación que está de escándalo. En las siguiente secciones, pondré repositorio para indicar que no solo tiene que ser una carpeta local.

Respaldo de archivos

La sintaxis más básica es la siguiente:

restic -r repositorio backup /carpeta/a/respaldar

Se puede incluir una lista de directorios también, si no me equivoco.

Me gusta particularmente una opción denominada --files-from, que incluye cualquier patrón presente en dicho archivo, estilo gitignore. Vamos a usarlo en combinación con --exclude-file, el cual es un análogo para exclusión.

restic -r repositorio backup --files-from ./incluye-estos-archivos --exclude-file ./y-excluye-estos

# repository 1a14d1f9 opened successfully, password is correct
# created new cache in /home/asmilex/.cache/restic
# no parent snapshot found, will read all files
#
# Files:           2 new,     0 changed,     0 unmodified
# Dirs:            2 new,     0 changed,     0 unmodified
# Added to the repo: 1.982 KiB
#
# processed 2 files, 15 B in 0:00
# snapshot 5cbfa729 saved

El comando --dry-run viene que no veas. Es una "falsa" ejecución de la orden. Sirve para comprobar que una operación hace lo que queremos que haga. Cáscale un --verbose --dry-run antes de hacer copias gordas.

Comprueba que un repositorio es correcto con check:

restic -r repositorio check

# repository 1a14d1f9 opened successfully, password is correct
# created new cache in /tmp/restic-check-cache-1101843502
# create exclusive lock for repository
# load indexes
# check all packs
# check snapshots, trees and blobs
# [0:00] 100.00%  2 / 2 snapshots...
# no errors were found

Transferencia de snapshots entre repositorios

Una estrategia recomendada es mantener copias de seguridad en diferentes localizaciones. Restic te permite transferir snapshots entre dos repositorios diferentes.

restic -r repositorio_secundario copy --from-repo repositorio_original

Recuperar un backup

Ah, sí. El momento oh fuck que pierdo mis mierdas.

No pasa nada, lo solucionamos. Siempre que tengas la contraseña. Porque no la has perdido, ¿verdad?

restic -r repositorio restore latest --target /carpeta/de/destino

Facilito.

Quizás te convenga explorar un backup como si un sistema de ficheros se tratara. Puedes hacerlo con mount:

restic -r repositorio mount /path/donde/montarlo

Puedes recuperar alguna snapshot en particular, o incluso especificar las carpetas que quieras restaurar. Comprueba la documentación, porque cubre la mayoría de casos.

Quitar snapshots viejas

Un par de opciones: prune y forget. Se combinan con forget --prune. Échale un vistazo a la primera sección de la documentación, al menos.

Mi estrategia ahora mismo es la siguiente:

  • Conservar las n snapshots más recientes.
  • De los últimos m meses, nos quedamos con la más reciente de cada uno.
  • Quedarse con una por cada año.

Supongamos que n = 3, m = 3. Entonces, para cargarnos todas las que no cumplan lo anterior, ejecutamos

restic -r repositorio forget --prune --keep-last 3 --keep-monthly 3 --keep-yearly 1 --dry-run --verbose

(Le he metido --dry-run porque sé que has copiado y pegado, pequeño cebollerete).

Claves de un repositorio

Un repositorio puede tener más de una clave. Para ver las claves de un repositorio:

restic -r repositorio key list

# repository 0265f8e6 opened successfully, password is correct
#  ID        User     Host        Created
# ---------------------------------------------------
# *790c050d  asmilex  asmiserver  2022-12-27 10:49:02
#  315707a9  asmilex  asmiserver  2022-12-27 11:27:54
# ---------------------------------------------------

Para evitar poner nuestra contraseña habitual en los scripts, podemos crear una clave segura y dejarla en un archivo. Usa openssl para generar una nueva contraseñá:

openssl rand -base64 128

Guarda en un archivo dicha contraseña. Por ejemplo, safe-password.restic. Añade esta nueva clave al repo con el siguiente comando:

restic -r repositorio key add

Ahora solo necesitas indicarle la clave en los comandos con --password-file para evitar tener que introducir la contraseña:

restic -r repositorio key list --password-file ./safe-password.restic

# repository 0265f8e6 opened successfully, password is correct
#  ID        User     Host        Created
# ---------------------------------------------------
#  790c050d  asmilex  asmiserver  2022-12-27 10:49:02
# *315707a9  asmilex  asmiserver  2022-12-27 11:27:54
# ---------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment