Programa clave: Restic - backups done right!.
- Inicializa el repositorio. No pierdas la contraseña.
restic init --repo repositorio
- Genera una contraseña segura para las copias automatizadas:
- 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. - Añade la nueva clave al repositorio:
restic -r repositorio key add
.
- Crea una contraseña con
- Indica las carpetas a copiar, y las que quieras excluir. Modifica los archivos
included-files.txt
yexcluded-files.txt
. Admite wildcards. - 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
- 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
.
- Automatiza la limpieza de snapshots. Análogo al anterior.
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.
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
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
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.
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).
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
# ---------------------------------------------------