Autrefois nommé Resttic-Systemd-Automatic-Backup
y compris ces principaux contributeurs:
Resttic est un outil de ligne de commande pour fabriquer des sauvegardes, la bonne façon. Consultez le site officiel pour une explication de fonctionnalité. En tant que backend de stockage, je recommande Backblaze B2 car Resttic fonctionne bien avec lui, et c'est (au moment de la rédaction) très abordable pour le hacker amateur! (ANECDOTAL: Je paie mes sauvegardes à système complet chaque mois généralement <1 USD).
Malheureusement, Resttic n'est pas préconfiguré avec un moyen d'exécuter des sauvegardes automatisées, par exemple tous les jours. Cependant, il est possible de configurer cela vous-même en utilisant des outils intégrés dans votre système d'exploitation et certains emballages. Pour Linux avec SystemD, il est pratique d'utiliser SystemD Timers. Pour les systèmes MacOS, nous pouvons utiliser des lanceurs intégrés. Pour Windows, nous pouvons utiliser des tâches planifiées. Tout système d'exploitation ayant quelque chose de cron fonctionnera également!
Ici suit un tutoriel étape par étape sur la façon de le configurer, avec mon exemple de script et de configurations que vous pouvez modifier en fonction de vos besoins.
Remarque, vous pouvez utiliser les backends de stockage pris en charge de tous les Resttic. La configuration doit être similaire, mais vous devrez utiliser d'autres variables de configuration pour correspondre à votre backend de choix.
Mise à jour: ce projet est complet (voir le raisonnement ci-dessous). Seules les correctifs de bogue seront acceptés. N'hésitez pas à fourrer si vous souhaitez ajouter plus de fonctionnalités; Être une base de suppression était la portée initiale de ce projet!
La portée pour cela ne consiste pas à être une super solution à part entière qui résout tous les problèmes et toutes les configurations possibles. L'objectif est d'être une base de code piratable pour que vous commencez à coudre la solution de sauvegarde parfaite qui correspond à vos besoins!
Néanmoins, le projet devrait être hors de la boîte, être minime mais toujours ouvert les portes pour la configuration et les extensions par les utilisateurs.
Pour utiliser un backend de stockage différent de B2, vous devez seulement modifier quelques variables de paramètres dans le profil de sauvegarde ainsi que certains arguments de restauration à l'intérieur restic_backup.sh .
☝ Remarque La configuration Linux ici supposera une installation vers / .
De nombreuses distributions Linux utilisent de nos jours SystemD, qui présente une bonne prise en charge pour l'exécution des services et des travaux planifiés. Si votre distribution n'est pas sur Systemd, consultez la configuration Cron à la place.
TL; DR SETUP
make : $ sudo make install-systemd$ yay -S restic-automatic-backup-scheduler/etc/restic .restic(1) . Toutes les commandes après que cela suppose que le profil provient dans le shell actuel. # source /etc/restic/default.env.sh
# restic initOnCalendar dans /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 et d'utiliser le nom de profil défini à la place de default pour exécuter les sauvegardes ou activer les minuteries. Notez que la valeur après @ fonctionne comme un paramètre. # systemctl enable restic-backup@other_profile.timer ☝ Remarque La configuration macOS ici supposera une installation de homebrew à l'emplacement par défaut recommandé. Il s'agit de $HOMEBREW_PREFIX ( brew --prefix ), qui est /usr/local sur Intel Macs et /opt/homebrew sur le silicium Apple.
Launchd est le planificateur de services intégré moderne dans MacOS. Il prend en charge les services d'exécution en tant que racine (démon) ou en tant qu'utilisateur normal (agent). Ici, nous avons configuré un laurier pour être exécuté en tant qu'utilisateur normal pour démarrer des sauvegardes régulières.
TL; DR SETUP
$ brew install erikw/tap/restic-automatic-backup-schedulermake : $ make PREFIX=$(brew --prefix) install-launchagent$(brew --prefix)/etc/restic .restic(1) . Toutes les commandes après que cela suppose que le profil provient dans le shell actuel. $ source $(brew --prefix)/etc/restic/default.env.sh
$ restic initOnCalendar dans~/Library/LaunchAgents/homebrew.mxcl.restic-automatic-backup-scheduler.plist .make l'installation: ~/Library/LaunchAgents/com.github.erikw.restic-backup.plist .$ brew services start restic-automatic-backup-schedulermake l'installation: $ 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 l'installation: $ 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 .Contrôlez ensuite le service avec 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 échoue, cela peut être dû à l'installation de la version précédente. Dans ce cas, supprimez la version existante et réessayez:
$ launchctl bootout gui/ $UID /com.github.erikw.restic-backup
$ brew services start restic-automatic-backup-scheduler Utilisez la commande disable pour suspendre temporairement l'agent ou bootout pour le désinstaller.
$ launchctl disable gui/$UID/com.github.erikw.restic-backup
$ launchctl bootout gui/$UID/com.github.erikw.restic-backup
Si vous avez mis à jour le fichier .plist , vous devez émettre le bootout suivi de bootrstrap et enable les sous-communs de launchctl . Cela garantira que le fichier est correctement rechargé.
Windows est livré avec un planificateur de tâches intégré appelé ScheduledTask. L'application Frontend est "Task Scheduler" ( taskschd.msc ) et nous pouvons utiliser des commandes PowerShell pour installer une nouvelle tâche planifiée.
Je décris ici l'une des façons de pouvoir obtenir Resttic et ce script de sauvegarde fonctionne sur Windows. Ici, j'ai choisi de travailler avec scoop et git-bash .
TL; DR SETUP
pwsh doit être installé pour pouvoir exécuter PowerShell dans les scripts 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 vous pourriez avoir export RESTIC_BACKUP_PATHS= ' /c/Users/<username>/My Documents 'restic(1) . Toutes les commandes après que cela suppose que le profil provient dans le shell actuel. git-bash$ source /etc/restic/default.env.sh
git-bash$ restic init git-bash$ restic_backup.sh git-bash$ restic snapshotstaskschd.msc )restic_backup et cliquez sur "Exécuter".make install-schedtask : fermez-le et recommencez pour actualiser.restic_backup.sh , et la prochaine fois que le calendrier configuré arrive! Avec taskschd.msc vous pouvez facilement démarrer, arrêter, supprimer et configurer les tâches planifiées à votre goût:
☝ Notez qu'il existe de nombreuses implémentations CRON différentes et elles fonctionnent toutes légèrement différentes.
Tout système qui a un système de type cron peut également configurer les sauvegardes Resttic également. Cependant, si votre système prend en charge l'une des configurations précédentes, celles-ci sont recommandées sur Cron car ils fournissent plus de fonctionnalités et de fiabilité pour vos sauvegardes.
TL; DR SETUP
$ sudo make install-cron/etc/cron.d/ . Si ce n'est pas le cas, copiez simplement le contenu pertinent de l'installation /etc/cron.d/restic dans votre /etc/crontab . # grep " ^@.*restic_ " /etc/cron.d/restic >> /etc/crontab/etc/restic .restic(1) . Toutes les commandes après que cela suppose que le profil provient dans le shell actuel. # source /etc/restic/default.env.sh
# restic init # restic_backup.sh# restic snapshots/etc/cron.d/restic (ou /etc/crontab ).
Il s'agit d'une explication plus détaillée que les sections TL; DR ci-dessus qui vous donneront plus de compréhension dans la configuration. Cette section est plus générale, mais utilise Linux + Systemd comme configuration d'exemple.
$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $( basename " $_ " .git )Faire une recherche rapide et revu dans les fichiers source:
$ find bin etc usr Library ScheduledTask -type f -exec sed -i.bak -e ' s|{{ INSTALL_PREFIX }}||g ' {} ; -exec rm {}.bak ;Et vous devriez maintenant voir que tous les fichiers ont été modifiés comme par exemple
- export RESTIC_PASSWORD_FILE="{{ INSTALL_PREFIX }}/etc/restic/pw.txt"
+ export RESTIC_PASSWORD_FILE="/etc/restic/pw.txt" Pourquoi? Les configurations TL; DR spécifiques au système d'exploitation utilisent parmi toutes le File ou un gestionnaire de package pour installer ces fichiers. La chaîne de placeholder {{ INSTALL_PREFIX }} est dans les fichiers source pour des raisons de portabilité, afin que le makefile puisse prendre en charge tous les différents systèmes d'exploitation. make des utilisateurs peut définir un $PREFIX différent lors de l'installation comme PREFIX=/usr/local make install-systemd .
Dans cette configuration manuelle détaillée, nous copierons tous les fichiers manuellement vers /etc et /bin . Ainsi, nous devons supprimer la chaîne de placement {{ INSTALL_PREFIX }} dans les fichiers source en première étape.
En bref:
Tout d'abord, consultez ce didacticiel officiel Backblaze sur Resttic et suivez les instructions ("Créer un compte Backblaze avec B2 activé") sur la façon de créer un nouveau seau B2. En général, vous voudriez un seau privé, sans cryptage B2 (Resttic fait le côté client de cryptage pour nous) et sans la fonction de verrouillage de l'objet.
Pour que RESTIC puisse se connecter à votre seau, vous souhaitez que les paramètres B2 créent une paire de KeyId et ApplicationKey. C'est une bonne idée de créer une paire d'identification et une clé séparées avec pour chaque seau que vous utiliserez, avec un accès limité en lecture et en écriture uniquement à ce seau.
Mettez ces fichiers dans /etc/restic/ :
_global.env.sh : remplissez ce fichier avec vos paramètres globaux, y compris B2 KeyId & ApplicationKey.default.env.sh : Il s'agit du profil par défaut. Remplissez cela avec le nom du seau, les chemins de sauvegarde et la politique de rétention. Ce fichier s'approvisionne _global.env.sh et est donc autonome et peut être provenant de la coquille lorsque vous souhaitez émettre des commandes de re-RESTIC manuelles. Par exemple: $ 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 : Ce fichier doit contenir le mot de passe Resttic (ligne unique) utilisé pour crypter le référentiel. Il s'agit d'un nouveau mot de passe ce qui sera bientôt utilisé lors de l'initialisation du nouveau référentiel. Il doit être unique à ce référentiel de sauvegarde Resttic et est nécessaire pour le restaurer. Ne réutilisez pas votre mot de passe de connexion B2, cela devrait être différent. Par exemple, vous pouvez générer un mot de passe de 128 caractères (doit tous être sur une seule ligne) avec: $ openssl rand -base64 128 | tr -d ' n ' > /etc/restic/pw.txtbackup_exclude.txt : liste des modèles de fichiers à ignorer. Cela réduira beaucoup la taille de votre sauvegarde et la vitesse de la sauvegarde lorsqu'elle est terminée correctement! Nous devons maintenant initialiser le référentiel à l'extrémité distante:
$ sudo -i
# source /etc/restic/default.env.sh
# restic init Mettez ce fichier dans /bin :
restic_backup.sh : un script qui définit comment exécuter la sauvegarde. L'intention est que vous ne deviez pas avoir besoin de modifier ce script vous-même, mais pouvoir tout contrôler à partir des profils *.env.sh . Prise en charge de Resttic exclut les fichiers. Ils répertorient les chemins de modèle de fichiers pour exclure de vos sauvegardes, des fichiers qui occupent simplement l'espace de stockage, le temps de sauvegarde, le réseau et l'argent. restic_backup.sh permet à quelques fichiers excluants différents.
/etc/restic/backup_exclude.txt - Liste d'exclude globale. Vous ne pouvez utiliser que celui-ci si votre configuration est facile. Ceci est défini dans _global.env.sh . Si vous avez besoin d'un fichier différent pour un autre profil, vous pouvez remplacer l'envvar RESTIC_BACKUP_EXCLUDE_FILE dans ce profil..backup_exclude.txt par chemin de sauvegarde. Si vous avez par exemple un disque USB monté sur / mnt / média et que ce chemin est inclus dans les $RESTIC_BACKUP_PATHS , vous pouvez placer un fichier /mnt/media/.backup_exclude.txt et il sera automatiquement ramassé. La bonne chose à ce sujet est que les chemins de sauvegarde sont autonomes en termes de ce qu'ils excluent! Maintenant, voyez si la sauvegarde elle-même fonctionne, en fonctionnant comme racine
# source /etc/restic/default.env.sh
# /bin/restic_backup.sh Comme le default.env.sh provient déjà dans votre coquille racine, vous pouvez maintenant lister simplement l'instantané
# restic snapshots Alternativement, vous pouvez monter les instantanés Resttic sur un ensemble de répertoires /mnt/restic
# restic mount /mnt/restic
# ls /mnt/restic Toutes les configurations de système d'exploitation diffèrent dans quel planificateur de tâches ils utilisent. En démonstration, regardons comment nous pouvons le faire avec Systemd sous Linux ici.
Mettez ces fichiers dans /etc/systemd/system (notez que le makefile s'installe en tant que package sur /usr/lib/systemd/system )
[email protected] : un service qui appelle le script de sauvegarde avec le profil spécifié. Le profil est spécifié par la valeur après @ lors de l'exécution (voir ci-dessous).[email protected] : une minuterie qui démarre l'ancienne sauvegarde tous les jours (même chose à propos du profil ici).OnCalendar dans le fichier.Maintenant, activez simplement la minuterie avec:
# systemctl enable --now [email protected]Vous pouvez voir quand votre prochaine sauvegarde est prévue pour fonctionner avec
# systemctl list-timers | grep resticet voir l'état d'une sauvegarde en cours d'exécution avec:
# systemctl status restic-backupOu démarrez une sauvegarde manuellement:
$ systemctl start restic-backup@defaultVous pouvez suivre la sortie de sauvegarde STDOUT en direct au fur et à mesure que la sauvegarde fonctionne avec:
$ journalctl -f -u [email protected] (sauter -f pour voir toutes les sauvegardes qui ont fonctionné)
De temps en temps, il peut être bon de faire un contrôle de santé du référentiel distant, pour s'assurer qu'il ne devient pas corrompu. Cela peut être fait avec $ restic check .
Il y a des scripts compagnons, du service et de la minuterie ( *check* ) à Resttic-Backup.sh qui vérifie la sauvegarde Resttic pour les erreurs; Regardez dans le repo dans usr/lib/systemd/system/ et bin/ et copiez ce dont vous avez besoin dans leurs emplacements correspondants.
# systemctl enable --now [email protected] 
Pour avoir des travaux de sauvegarde différents ayant une par exemple de seaux différents, un chemin de sauvegarde du calendrier, faites simplement une copie de la default.env.sh et utilisez le nom de profil défini à la place de default dans les étapes précédentes.
Pour créer une sauvegarde et une utilisation différentes, vous pouvez faire:
# 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 Lorsqu'il est activé, il écrira dans un fichier journal CSV les statistiques après chaque sauvegarde. Peut être activé en décalmentant sa variable Env ( RESTIC_BACKUP_STATS_DIR ) sur le fichier d'environnement global ou en le définissant sur un profil spécifique.
Le journal des statistiques (ainsi que) les notifications de bureau se présentent dans une série supplémentaire de restic snapshots et restic diff . Cette exécution est partagée avec les notifications (pas de course supplémentaire).

C'est une bonne idée d'être au-dessus de vos sauvegardes pour vous assurer qu'elles n'augmentent pas beaucoup de taille et engagent des coûts élevés. Cependant, il est notoirement difficile de rendre correctement les notifications GUI à partir d'un processus non utilisateur (par exemple, racine).
Par conséquent, ce projet fournit une solution légère pour les notifications de bureau qui fonctionne comme celle-ci: essentiellement restic_backup.sh ajoutera une ligne de résumé de la dernière sauvegarde dans un fichier appartenant à l'utilisateur (l'utilisateur exécutant l'environnement de bureau de votre système d'exploitation) à la manière du feu. Ensuite, l'utilisateur a un processus qui lit ceci et transmet chaque ligne en tant que nouveau message dans l'environnement de bureau utilisé.
Pour définir les notifications de bureau:
$ mkfifo /home/user/.cache/notification-queue/etc/restic/default.sh , set: RESTIC_BACKUP_NOTIFICATION_FILE=/home/user/.cache/notification-queueNous voulons savoir quand la sauvegarde automatique échoue, afin que nous puissions le réparer. Étant donné que mon ordinateur portable n'exécute pas de serveur de messagerie, je suis allé pour une solution pour configurer mon ordinateur portable pour pouvoir envoyer des e-mails avec Postfix via mon Gmail. Suivez les instructions là-bas.
Mettez ce fichier dans /bin :
systemd-email : envoie un e-mail à l'aide de Sendmail (1). Ce script propose également un temps mort pour ne pas spammer les serveurs Gmail et faire bloquer mon compte. Mettez ce fichier dans /etc/systemd/system/ :
[email protected] : un service qui peut vous informer par e-mail lorsqu'un service SystemD échoue. Modifiez l'adresse e-mail cible dans ce fichier et remplacez ou supprimez {{ INSTALL_PREFIX }} en fonction de votre installation. Maintenant, modifiez /usr/lib/systemd/system/[email protected] et /usr/lib/systemd/system/[email protected] pour appeler cette panne de service.
OnFailure=status-email-user@%n.service
Utilisez bin/cron_mail : un wrapper pour exécuter des travaux CRON, qui envoie la sortie du travail comme e-mail à l'aide de la commande Mail (1). Cela suppose que le programme mail est correctement configuré sur le système pour envoyer des e-mails.
Pour l'utiliser, enveloppez la commande de script Resttic avec dans votre fichier cron comme:
- @midnight root . /etc/restic/default.sh && restic_backup.sh
+ @midnight root . /etc/restic/default.sh && cron_mail restic_backup.shPour un ordinateur portable, il peut être judicieux de ne pas faire de sauvegardes lourdes lorsque vous êtes sur une connexion compteur comme une connexion partagée à partir de votre téléphone mobile. Pour résoudre ce problème, nous pouvons configurer un service SystemD qui est en état de réussite uniquement lorsqu'une connexion n'est pas mise en scène. Ensuite, nous pouvons dire à notre service de sauvegarde de dépendre simplement de ce service! Lorsque le service non métamorphe détecte une connexion non métamètre, elle ira à un état défaillant. Ensuite, notre service de sauvegarde ne s'exécutera pas car il nécessite que cet autre service soit en état de réussite.
[email protected] et [email protected] pour exiger que le nouveau service soit en état de réussite: Requires=nm-unmetered-connection.service
After=nm-unmetered-connection.service
/etc/systemd/system/ :nm-unmetered-connection.service : Un service qui est en état de réussite uniquement si la connexion n'est pas mise en scène./bin :nm-unmetered-connection.sh : détecte les connexions mestées et renvoie un code d'erreur si l'on est détecté. Ces scripts nécessitent l'installation du GNOME NetworkManager (modifiez ce script si votre système a un gestionnaire de réseau différent).# systemctl daemon-reload Astuce : toutes les étapes, mais la première peut être effectuée en une seule fois si vous utilisez le makefile. Définissez $PREFIX au besoin ou laissez vide pour installer vers / .
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
' Pour plus de commodité, il y a un script de wrapper restic qui rend les profils de chargement et exécute la restauration directe (il doit fonctionner avec Sudo pour lire l'environnement). Il suffit de courir:
sudo resticw WHATEVER (par exemple sudo resticw snapshots ) pour utiliser le profil par défaut.resticw -p anotherprofile snapshots .restic comme --diff-latest .Commandes utiles:
| Commande | Description |
|---|---|
resticw snapshots | Liste des instantanés de sauvegarde |
resticw diff <snapshotId-1> <snapshotId-2> | Montrer les changements entre les instantanés de sauvegarde |
resticw stats / resticw stats snapshotId ... | Afficher les statistiques pour l'ensemble du dépôt ou les instantanés spécifiés |
resticw mount /mnt/restic | Montez votre référentiel distant |
resticw --diff-latest | Afficher les derniers modifications d'instantané: exécute restic diff après avoir trouvé les 2 derniers instantanés |
Il y a une cible à supprimer tous les fichiers (scripts et configurations) qui ont été installés par sudo make install-* . Il suffit de courir:
$ sudo make uninstall La meilleure façon de déboguer ce qui se passe est d'exécuter le script restic_backup.sh avec la fonction de trace de Bash. Vous pouvez l'activer en exécutant le script avec bash -x :
$ source /etc/restic/default.env.sh
$ bash -x /bin/restic_backup.sh
Pour déboguer les plus petites parties du script de sauvegarde, insérez ces lignes en haut et en bas des parties de code pertinentes, par exemple:
set -x
exec 2> /tmp/restic-automatic-backup-scheduler.log
< code to debug >
set +xpuis inspecter les sorties comme
$ less /tmp/restic-automatic-backup-scheduler.log
$ tail -f /tmp/restic-automatic-backup-scheduler.log # or follow output like this.Makefile , installez-vous simplement sur un $PREFIX comme $ PREFIX=/tmp/restic-test make install-systemdresticw : Si jamais vous mettez à jour le DOC usage, vous devrez actualiser l'analyseur généré automatiquement: $ pip install doctopt.sh
$ doctopt.sh usr/local/bin/resticwPour faire une nouvelle version:
$ vi CHANGELOG.md && git commit -am " Update CHANGELOG.md "
$ git tag vX.Y.Z
$ git push && git push --tags