anteriormente llamado Restic-SystemD-Automatic-Backup
incluyendo a estos principales contribuyentes:
Restic es una herramienta de línea de comandos para hacer copias de seguridad, de la manera correcta. Consulte el sitio web oficial para obtener una explicación de funciones. Como backend de almacenamiento, recomiendo Backblaze B2 ya que Restic funciona bien, y es (al momento de escribir) muy asequible para el hacker aficionado. (Anecdótico: pago mis copias de seguridad de sistemas completos cada mes típicamente <1 USD).
Lamentablemente, Restic no viene preconfigurado con una forma de ejecutar copias de seguridad automatizadas, digamos todos los días. Sin embargo, es posible establecer esto utilizando herramientas incorporadas en su sistema operativo y algunos envoltorios. Para Linux con Systemd, es conveniente usar temporizadores de Systemd. Para los sistemas MACOS, podemos usar el lanzamiento incorporado. Para Windows podemos usar ScheduledTasks. ¡Cualquier sistema operativo que tenga algo como Cron también funcionará!
Aquí sigue un tutorial paso a paso sobre cómo configurarlo, con mi script de muestra y configuraciones que puede modificar para satisfacer sus necesidades.
Tenga en cuenta que puede usar los backends de almacenamiento compatibles con Restic. La configuración debe ser similar, pero tendrá que usar otras variables de configuración para que coincida con su backend de elección.
ACTUALIZACIÓN: Este proyecto se completa (ver razonamiento a continuación). Solo se aceptarán correcciones de errores. Siéntase libre de bifurcarse si desea agregar más funciones; ¡Ser una base de bifurcación fue el alcance inicial de este proyecto!
El alcance de esto no es ser una súper solución completa que resuelva todos los problemas y todas las configuraciones posibles. ¡El objetivo es ser una base de código hackable para que comience a coser la solución de respaldo perfecta que se ajuste a sus requisitos!
Sin embargo, el proyecto debe funcionar fuera de la caja, ser mínimo pero aún así abrir las puertas para la configuración y las extensiones por parte de los usuarios.
Para usar un backend de almacenamiento diferente al de B2, solo debe ajustar algunas variables de configuración en el perfil de respaldo, así como algunos argumentos restantes dentro de restic_backup.sh .
☝ Tenga en cuenta que la configuración de Linux aquí asumirá una instalación a / .
Muchas distribuciones de Linux hoy en día usan Systemd, que presenta un buen soporte para la ejecución de servicios y trabajos programados. Si su distribución no está en Systemd, consulte la configuración de Cron en su lugar.
TL; Configuración DR
make : $ sudo make install-systemd$ yay -S restic-automatic-backup-scheduler/etc/restic .restic(1) . Todos los comandos después de esto suponen que el perfil se obtiene en el shell actual. # source /etc/restic/default.env.sh
# restic initOnCalendar en /usr/lib/systemd/system/[email protected] .# systemctl enable --now [email protected]# journalctl -f --lines=50 -u restic-backup@default# restic snapshots# systemctl enable --now [email protected]default.env.sh y use el nombre de perfil definido en lugar de default para ejecutar copias de seguridad o habilitar temporizadores. Observe que el valor después de @ funciona como parámetro. # systemctl enable restic-backup@other_profile.timer ☝ Tenga en cuenta que la configuración de MacOS aquí asumirá una instalación casera en la ubicación predeterminada recomendada. Este es $HOMEBREW_PREFIX ( brew --prefix ), que es /usr/local en Intel MacS y /opt/homebrew en Apple Silicon.
Launchd es el moderno planificador de servicios incorporado en MacOS. Tiene soporte para ejecutar servicios como root (demonio) o como un usuario normal (agente). Aquí configuramos un lanzamiento de AGENT para ejecutarse como su usuario normal para iniciar copias de seguridad regulares.
TL; Configuración DR
$ brew install erikw/tap/restic-automatic-backup-schedulermake : $ make PREFIX=$(brew --prefix) install-launchagent$(brew --prefix)/etc/restic .restic(1) . Todos los comandos después de esto suponen que el perfil se obtiene en el shell actual. $ source $(brew --prefix)/etc/restic/default.env.sh
$ restic initOnCalendar en~/Library/LaunchAgents/homebrew.mxcl.restic-automatic-backup-scheduler.plist .make instalación: ~/Library/LaunchAgents/com.github.erikw.restic-backup.plist .$ brew services start restic-automatic-backup-schedulermake instalar: $ launchctl bootstrap gui/ $UID ~ /Library/LaunchAgents/com.github.erikw.restic-backup.plist
$ launchctl enable gui/ $UID /com.github.erikw.restic-backup
$ launchctl kickstart -p gui/ $UID /com.github.erikw.restic-backup$ make activate-launchagent-backup .$ tail -f ~ /Library/Logs/restic/backup *$ restic snapshots$ brew services start restic-automatic-backup-scheduler-checkmake instalar: $ launchctl bootstrap gui/ $UID ~ /Library/LaunchAgents/com.github.erikw.restic-check.plist
$ launchctl enable gui/ $UID /com.github.erikw.restic-check
$ launchctl kickstart -p gui/ $UID /com.github.erikw.restic-check$ make activate-launchagent-check .Luego controle el servicio con Homebrew:
$ brew services start restic-automatic-backup-scheduler
$ brew services restart restic-automatic-backup-scheduler
$ brew services stop restic-automatic-backup-scheduler Si services start falla, podría deberse a la versión anterior instalada. En ese caso, elimine la versión existente e intente nuevamente:
$ launchctl bootout gui/ $UID /com.github.erikw.restic-backup
$ brew services start restic-automatic-backup-scheduler Use el comando disable para pausar temporalmente al agente o bootout para desinstalarlo.
$ launchctl disable gui/$UID/com.github.erikw.restic-backup
$ launchctl bootout gui/$UID/com.github.erikw.restic-backup
Si actualizó el archivo .plist , debe emitir el bootout seguido de bootrstrap y enable los subcomtores de launchctl . Esto garantizará que el archivo se vuelva a cargar correctamente.
Windows viene con un programador de tareas incorporado llamado ScheduledTask. La aplicación Frontend es "Scheduler de tareas" ( taskschd.msc ) y podemos usar los comandos de PowerShell para instalar una nueva tarea programada.
Describo aquí una de las formas en que puede recuperarse y este script de copia de seguridad funciona en Windows. Aquí elegí trabajar con scoop y git-bash .
TL; Configuración DR
pwsh para poder ejecutar PowerShell en scripts de Shebang. powershell> scoop install restic make git pwsh powershell> git-bash
git-bash$ mkdir ~/src && cd ~/src/
git-bash$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $(basename "$_" .git) git-bash$ make install-schedtask/etc/restic . git-bash$ vim /etc/restic/*default.env.sh podría tener export RESTIC_BACKUP_PATHS= ' /c/Users/<username>/My Documents 'restic(1) . Todos los comandos después de esto suponen que el perfil se obtiene en el shell actual. git-bash$ source /etc/restic/default.env.sh
git-bash$ restic init git-bash$ restic_backup.sh git-bash$ restic snapshotstaskschd.msc )restic_backup y haga clic en "Ejecutar".make install-schedtask : simplemente cierre y comience nuevamente para actualizar.restic_backup.sh , ¡y la próxima vez que llegue el horario configurado! Con taskschd.msc , puede iniciar, detener, eliminar fácilmente las tareas programadas para su gusto:
☝ Tenga en cuenta que hay muchas implementaciones de Cron diferentes por ahí y todas funcionan ligeramente diferentes.
Cualquier sistema que tenga un sistema similar a Cron también puede configurar fácilmente copias de seguridad RESTIC. Sin embargo, si su sistema admite cualquiera de las configuraciones anteriores, se recomiendan sobre Cron, ya que proporcionan más características y confiabilidad para sus copias de seguridad.
TL; Configuración DR
$ sudo make install-cron/etc/cron.d/ . Si ese no es el caso, simplemente copie los contenidos relevantes del /etc/cron.d/restic en su /etc/crontab . # grep " ^@.*restic_ " /etc/cron.d/restic >> /etc/crontab/etc/restic .restic(1) . Todos los comandos después de esto suponen que el perfil se obtiene en el shell actual. # source /etc/restic/default.env.sh
# restic init # restic_backup.sh# restic snapshots/etc/cron.d/restic (o /etc/crontab ).
Esta es una explicación más detallada que las secciones TL; DR anteriores que le darán más comprensión en la configuración. Esta sección es más general, pero usa Linux + Systemd como configuración de ejemplo.
$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $( basename " $_ " .git )Realice una búsqueda rápida y reemplazada en los archivos de origen:
$ find bin etc usr Library ScheduledTask -type f -exec sed -i.bak -e ' s|{{ INSTALL_PREFIX }}||g ' {} ; -exec rm {}.bak ;y ahora debería ver que todos los archivos se han cambiado como por ejemplo
- export RESTIC_PASSWORD_FILE="{{ INSTALL_PREFIX }}/etc/restic/pw.txt"
+ export RESTIC_PASSWORD_FILE="/etc/restic/pw.txt" ¿Por qué? Las configuraciones de TL; DR específicas del sistema operativo usan sobre todo el Makefile o un Administrador de paquetes para instalar estos archivos. La cadena de marcador de posición {{ INSTALL_PREFIX }} está en los archivos de origen por razones de portabilidad, de modo que el makefile pueda admitir todos los sistemas operativos diferentes. make los usuarios puedan establecer un $PREFIX diferente al instalar como PREFIX=/usr/local make install-systemd .
En esta configuración manual detallada, copiaremos todos los archivos manualmente a /etc y /bin . Por lo tanto, necesitamos eliminar la cadena de marcador de posición {{ INSTALL_PREFIX }} en los archivos de origen como primer paso.
En breve:
Primero, vea este tutorial oficial de Backblaze sobre Restic y siga las instrucciones ("Crear cuenta de Backblaze con B2 habilitado") allí sobre cómo crear un nuevo cubo B2. En general, desea un cubo privado, sin cifrado B2 (Restic hace el lado del cliente de cifrado para nosotros) y sin la función de bloqueo de objeto.
Para que Restic pueda conectarse a su cubo, desea en la configuración de B2 crear un par de KeyID y ApplicationKey. Es una buena idea crear un par de identificación y llave separados para cada cubo que usará, con acceso limitado de lectura y escritura solo a ese cubo.
Coloque estos archivos en /etc/restic/ :
_global.env.sh : complete este archivo con su configuración global, incluidas B2 KeyID y ApplicationKey.default.env.sh : este es el perfil predeterminado. Complete esto con nombre de cubo, rutas de copia de seguridad y política de retención. Este archivo fuga _global.env.sh y, por lo tanto, es autónomo y se puede obtener en el shell cuando desee emitir algunos comandos de RESTIC manuales. Por ejemplo: $ source /etc/restic/default.env.sh
$ restic snapshots # You don't have to supply all parameters like --repo, as they are now in your environment!pw.txt : este archivo debe contener la contraseña Restic (línea única) utilizada para cifrar el repositorio. Esta es una nueva contraseña que pronto se utilizará al inicializar el nuevo repositorio. Debe ser exclusivo de este repositorio de copia de seguridad restante y es necesario para restaurarlo. No reutilice su contraseña de inicio de sesión B2, esto debería ser diferente. Por ejemplo, puede generar una contraseña de 128 caracteres (debe estar en una línea) con: $ openssl rand -base64 128 | tr -d ' n ' > /etc/restic/pw.txtbackup_exclude.txt : lista de patrones de archivos para ignorar. ¡Esto recortará mucho el tamaño de su copia de seguridad y la velocidad de la copia de seguridad cuando se hace correctamente! Ahora debemos inicializar el repositorio en el extremo remoto:
$ sudo -i
# source /etc/restic/default.env.sh
# restic init Pon este archivo en /bin :
restic_backup.sh : Un script que define cómo ejecutar la copia de seguridad. La intención es que no debe necesitar editar este script usted mismo, sino poder controlar todo desde los perfiles *.env.sh . Soporte RESTIC Excluir archivos. Enumeran rutas de patrones de archivos para excluir de sus copias de seguridad, archivos que solo ocupan espacio de almacenamiento, tiempo de copia de seguridad, red y dinero. restic_backup.sh Permite algunos archivos de exclusión diferentes.
/etc/restic/backup_exclude.txt - Lista de exclusión global. Puede usar solo este si su configuración es fácil. Esto se establece en _global.env.sh . Si necesita un archivo diferente para otro perfil, puede anular el envvar RESTIC_BACKUP_EXCLUDE_FILE en este perfil..backup_exclude.txt por ruta de copia de seguridad. Si tiene, por ejemplo, un disco USB montado en/MNT/Media y esta ruta está incluida en el $RESTIC_BACKUP_PATHS , puede colocar un archivo /mnt/media/.backup_exclude.txt y se recogerá automáticamente. ¡Lo bueno de esto es que los caminos de respaldo son autónomos en términos de lo que excluyen! Ahora vea si la copia de seguridad en sí funciona, ejecutándose como root
# source /etc/restic/default.env.sh
# /bin/restic_backup.sh Como el default.env.sh ya se obtiene en su shell raíz, ahora puede enumerar la instantánea
# restic snapshots Alternativamente, puede montar las instantáneas de reestimidad a un directorio establecido /mnt/restic
# restic mount /mnt/restic
# ls /mnt/restic Todas las configuraciones del sistema operativo difieren en qué programador de tareas usan. Como demostración, veamos cómo podemos hacer esto con Systemd en Linux aquí.
Coloque estos archivos en /etc/systemd/system (tenga en cuenta que el makfile se instala como paquete a /usr/lib/systemd/system )
[email protected] : un servicio que llama al script de copia de seguridad con el perfil especificado. El perfil se especifica por el valor después de @ al ejecutarlo (ver más abajo).[email protected] : un temporizador que inicia la copia de seguridad anterior todos los días (lo mismo sobre el perfil aquí).OnCalendar en el archivo.Ahora simplemente habilite el temporizador con:
# systemctl enable --now [email protected]Puede ver cuándo su próxima copia de seguridad está programada para ejecutarse con
# systemctl list-timers | grep resticy vea el estado de una copia de seguridad actualmente de ejecución con:
# systemctl status restic-backupo comenzar una copia de seguridad manualmente:
$ systemctl start restic-backup@defaultPuede seguir la salida de respaldo de la salida en vivo, ya que la copia de seguridad se ejecuta con:
$ journalctl -f -u [email protected] (omita -f para ver todas las copias de seguridad que se han ejecutado)
De vez en cuando puede ser bueno hacer una verificación de salud del repositorio remoto, para asegurarse de que no se está corrupiendo. Esto se puede hacer con $ restic check .
Hay scripts, servicio y temporizador complementarios ( *check* ) a Restic-Backup.sh que verifica la copia de seguridad de RaTic para obtener errores; Mire en el repositorio en usr/lib/systemd/system/ y bin/ y copie lo que necesita en sus ubicaciones correspondientes.
# systemctl enable --now [email protected] 
Para tener diferentes trabajos de copia de seguridad que tengan, por ejemplo, diferentes cubos, ruta de respaldo del horario, solo haga una copia del default.env.sh y use el nombre de perfil definido en lugar de default en los pasos anteriores.
Para crear una copia de seguridad diferente y usar, puede hacer:
# cp /etc/restic/default.env.sh /etc/restic/other.env.sh
# vim /etc/restic/other.env.sh # Set backup path, bucket etc.
# source /etc/restic/other.env.sh
# restic_backup.sh Cuando está habilitado, escribirá en un archivo de registro CSV las estadísticas después de cada copia de seguridad. Se puede habilitar sin comentar su variable Env ( RESTIC_BACKUP_STATS_DIR ) en el archivo de entorno global o definiéndolo en un perfil específico.
El registro de estadísticas (así como) las notificaciones de escritorio incurren en una ejecución adicional de restic snapshots y restic diff . Esta ejecución se comparte con las notificaciones (sin ejecución adicional).

Es una buena idea estar al tanto de sus copias de seguridad para asegurarse de que no aumenten mucho en tamaño e incurran en altos costos. Sin embargo, es notoriamente difícil hacer notificaciones de la GUI correctamente a partir de un proceso que no sea de usuario (por ejemplo, raíz).
Por lo tanto, este proyecto proporciona una solución liviana para notificaciones de escritorio que funcionan como esta: básicamente restic_backup.sh agregará una línea de resumen de la última copia de seguridad a un archivo propiedad del usuario (el usuario que ejecuta el entorno de escritorio de su sistema operativo) de manera que se dispara y olvide. Luego, el usuario tiene un proceso que lee esto y reenvía cada línea como un nuevo mensaje para el entorno de escritorio en uso.
Para establecer notificaciones de escritorio:
$ mkfifo /home/user/.cache/notification-queue/etc/restic/default.sh , establecido: RESTIC_BACKUP_NOTIFICATION_FILE=/home/user/.cache/notification-queueQueremos ser conscientes de cuándo falla la copia de seguridad automática, para que podamos solucionarla. Dado que mi computadora portátil no ejecuta un servidor de correo, fui por una solución para configurar mi computadora portátil para poder enviar correos electrónicos con Postfix a través de mi Gmail. Siga las instrucciones allí.
Pon este archivo en /bin :
systemd-email : Envía correo electrónico con Sendmail (1). Este script también cuenta con tiempo de espera para no enviar spam a los servidores Gmail y bloquear mi cuenta. Coloque este archivo en /etc/systemd/system/ :
[email protected] : un servicio que puede notificarle por correo electrónico cuando falla un servicio Systemd. Edite la dirección de correo electrónico de destino en este archivo y reemplace o elimine {{ INSTALL_PREFIX }} de acuerdo con su instalación. Ahora edite /usr/lib/systemd/system/[email protected] y /usr/lib/systemd/system/[email protected] para llamar a esta falla del servicio.
OnFailure=status-email-user@%n.service
Use bin/cron_mail : un envoltorio para ejecutar trabajos cron, que envía la salida del trabajo como un correo electrónico utilizando el comando Mail (1). Esto supone que el programa mail está configurado correctamente en el sistema para enviar correos electrónicos.
Para usar esto, envuelva el comando de secuencia de comandos Restic con él en su archivo cron como:
- @midnight root . /etc/restic/default.sh && restic_backup.sh
+ @midnight root . /etc/restic/default.sh && cron_mail restic_backup.shPara una computadora portátil, puede tener sentido no hacer copias de seguridad pesadas cuando está en una conexión medida como una conexión compartida de su teléfono móvil. Para resolver esto, podemos configurar un servicio Systemd que esté en estado de éxito solo cuando una conexión no está mediante. ¡Entonces podemos decir que nuestro servicio de copia de seguridad depende de este servicio simplemente! Cuando el servicio no medido detecte una conexión no mediante, irá al estado fallido. Entonces nuestro servicio de copia de seguridad no se ejecutará, ya que requiere que este otro servicio esté en estado de éxito.
[email protected] y [email protected] para exigir que el nuevo servicio esté en estado de éxito: Requires=nm-unmetered-connection.service
After=nm-unmetered-connection.service
/etc/systemd/system/ :nm-unmetered-connection.service : un servicio que está en estado de éxito solo si la conexión no está mediante./bin :nm-unmetered-connection.sh conexión.SH: Detecta conexiones medidas y devuelve un código de error si se detecta uno. Este scripts requiere que se instale el GNOME NetworkManager (modifique este script si su sistema tiene un administrador de red diferente).# systemctl daemon-reload ☝ Consejo : todos los pasos, pero los primeros se pueden hacer de una vez si usa el File MakE. Establezca $PREFIX según sea necesario o deje vacío para instalar a / .
sudo bash -c ' export PREFIX=
make build/usr/lib/systemd/system/nm-unmetered-connection.service
install -m 0644 build/usr/lib/systemd/system/nm-unmetered-connection.service $PREFIX/etc/systemd/system
install -m 0555 bin/nm-unmetered-connection.sh /bin
systemctl daemon-reload
' Por conveniencia hay un script de envoltura de restic que hace que la carga de los perfiles y la ejecución de RaTic directamente (debe funcionar con sudo para leer el entorno). Solo corre:
sudo resticw WHATEVER (por ejemplo, sudo resticw snapshots ) para usar el perfil predeterminado.resticw -p anotherprofile snapshots .restic como --diff-latest .Comandos útiles:
| Dominio | Descripción |
|---|---|
resticw snapshots | Lista de instantáneas de copia de seguridad |
resticw diff <snapshotId-1> <snapshotId-2> | Muestre los cambios entre las instantáneas de copia de seguridad |
resticw stats / resticw stats snapshotId ... | Mostrar las estadísticas para todo el repositorio o las instantáneas especificadas |
resticw mount /mnt/restic | Monte su repositorio remoto |
resticw --diff-latest | Muestre los últimos cambios de instantáneas: ejecuta restic diff después de encontrar las últimas 2 instantáneas |
Hay un objetivo de marca para eliminar todos los archivos (scripts y configuraciones) que fueron instalados por sudo make install-* . Solo corre:
$ sudo make uninstall La mejor manera de depurar lo que está sucediendo es ejecutar el script restic_backup.sh con la función de rastreo de Bash. Puede activarlo ejecutando el script con bash -x :
$ source /etc/restic/default.env.sh
$ bash -x /bin/restic_backup.sh
Para depurar porciones más pequeñas del script de copia de seguridad, inserte estas líneas en la parte superior e inferior de las porciones de código relevantes, por ejemplo:
set -x
exec 2> /tmp/restic-automatic-backup-scheduler.log
< code to debug >
set +xe inspeccionar las salidas como
$ less /tmp/restic-automatic-backup-scheduler.log
$ tail -f /tmp/restic-automatic-backup-scheduler.log # or follow output like this.Makefile , simplemente instale a un $PREFIX como $ PREFIX=/tmp/restic-test make install-systemdresticw : si alguna vez actualiza el DOC de uso, deberá actualizar el analizador generado automático: $ pip install doctopt.sh
$ doctopt.sh usr/local/bin/resticwPara hacer un nuevo lanzamiento:
$ vi CHANGELOG.md && git commit -am " Update CHANGELOG.md "
$ git tag vX.Y.Z
$ git push && git push --tags