以前命名为Restic-Systemd-automatic-backup
包括这些主要贡献者:
RESTIC是用于正确的备份的命令行工具。检查官方网站以获取功能说明。作为存储后端,我建议Backblaze B2,因为Restic可以很好地与之搭配,并且(在写作时)对业余爱好者黑客来说非常负担得起! (轶事:我每月为全系统备份付费,通常<1美元)。
不幸的是,Restic并未通过每天运行自动备份的方法预先配置。但是,可以使用操作系统和一些包装器中的内置工具自己设置此设置。对于带有SystemD的Linux,使用SystemD计时器很方便。对于MacOS系统,我们可以使用内置发射器。对于Windows,我们可以使用ScheduledTasks。任何具有类似克朗的操作的操作系统也可以工作!
这里是关于如何设置它的分步教程,其中包括我的示例脚本和配置,您可以修改这些脚本以适合您的需求。
请注意,您可以使用任何Restic支持的存储后端。设置应相似,但是您将必须使用其他配置变量来匹配您选择的后端。
更新:此项目已完成(请参见下面的推理)。只有错误修复将被接受。如果您想添加更多功能,请随意叉;成为叉子基础是该项目的最初范围!
这样做的范围不是一个完整的超级解决方案,可以解决所有问题和所有可能的设置。目的是成为可黑客的代码库,让您开始缝制适合您要求的完美备份解决方案!
但是,该项目应开箱即用,很少,但仍打开了用户配置和扩展的门。
要使用与B2不同的存储后端,您只需要在备份配置文件中调整一些设置变量,以及restic_backup.sh中的一些Restic参数。
☝请注意, Linux设置此处将假设安装到/ 。
如今,许多Linux发行版都使用SystemD,该SystemD为运行服务和计划的作业提供了良好的支持。如果您的分发不在SystemD上,请改用CRON设置。
TL; DR设置
make : $ sudo make install-systemd$ yay -S restic-automatic-backup-scheduler/etc/restic中的配置值。restic(1) 。在此之后,所有命令都假定配置文件是在当前外壳中采购的。 # source /etc/restic/default.env.sh
# restic init/usr/lib/systemd/system/[email protected]中编辑OnCalendar 。# systemctl enable --now [email protected]# journalctl -f --lines=50 -u restic-backup@default# restic snapshots# systemctl enable --now [email protected]default.env.sh ,然后使用定义的配置文件代替default值来运行备份或启用计时器。请注意, @之后的值作为参数工作。 # systemctl enable restic-backup@other_profile.timer☝请注意,此处的MACOS设置将在推荐的默认位置假设安装。这是$HOMEBREW_PREFIX ( brew --prefix ),它是Intel Macs上的/usr/local ,在Apple Silicon上是/opt/homebrew 。
LaunchD是MacOS中现代的内置服务调度程序。它支持作为root(守护程序)或普通用户(代理)运行服务的支持。在这里,我们设置了一个发射器,以作为您的普通用户运行,以启动常规备份。
TL; DR设置
$ brew install erikw/tap/restic-automatic-backup-schedulermake : $ make PREFIX=$(brew --prefix) install-launchagent$(brew --prefix)/etc/restic中的配置值。restic(1) 。在此之后,所有命令都假定配置文件是在当前外壳中采购的。 $ source $(brew --prefix)/etc/restic/default.env.sh
$ restic initOnCalendar~/Library/LaunchAgents/homebrew.mxcl.restic-automatic-backup-scheduler.plist 。make安装: ~/Library/LaunchAgents/com.github.erikw.restic-backup.plist 。$ brew services start restic-automatic-backup-schedulermake安装: $ 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安装: $ 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 。然后用“自制者”控制服务:
$ brew services start restic-automatic-backup-scheduler
$ brew services restart restic-automatic-backup-scheduler
$ brew services stop restic-automatic-backup-scheduler如果services start失败,则可能是由于已安装了以前的版本。在这种情况下,请删除现有版本,然后重试:
$ launchctl bootout gui/ $UID /com.github.erikw.restic-backup
$ brew services start restic-automatic-backup-scheduler使用disable命令暂时暂停代理,或bootout以卸载它。
$ launchctl disable gui/$UID/com.github.erikw.restic-backup
$ launchctl bootout gui/$UID/com.github.erikw.restic-backup
如果您更新了.plist文件,则需要发出bootout启动,然后是bootrstrap并enable launchctl的子命令。这将确保文件正确重新加载。
Windows带有一个名为ScheduleDtask的内置任务调度程序。前端应用程序是“任务调度程序”( taskschd.msc ),我们可以使用PowerShell命令安装新的计划任务。
我在这里描述了您可以获得RESTIC和此备份脚本在Windows上使用的一种方法。在这里,我选择与scoop和git-bash一起工作。
TL; DR设置
pwsh ,以便能够在Shebang脚本中运行PowerShell。 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中 export RESTIC_BACKUP_PATHS= ' /c/Users/<username>/My Documents 'restic(1) 。在此之后,所有命令都假定配置文件是在当前外壳中采购的。 git-bash$ source /etc/restic/default.env.sh
git-bash$ restic init git-bash$ restic_backup.sh git-bash$ restic snapshotstaskschd.msc )restic_backup ,然后单击“运行”。make install-schedtask之前将其打开:刚关闭并重新启动以刷新。restic_backup.sh ,下次配置的时间表命中!使用taskschd.msc ,您可以轻松启动,停止,删除和配置计划的任务:
☝请注意,那里有许多不同的CRON实现,它们的工作略有不同。
任何具有CRON样系统的系统也都可以轻松设置Restic备份。但是,如果系统支持以前的任何设置,则建议使用这些设置,因为它们为您的备份提供了更多功能和可靠性。
TL; DR设置
$ sudo make install-cron/etc/cron.d/ 。如果不是这种情况,只需复制已安装的/etc/cron.d/restic的相关内容中的/etc/crontab即可。 # grep " ^@.*restic_ " /etc/cron.d/restic >> /etc/crontab/etc/restic中的配置值。restic(1) 。在此之后,所有命令都假定配置文件是在当前外壳中采购的。 # source /etc/restic/default.env.sh
# restic init # restic_backup.sh# restic snapshots/etc/cron.d/restic )进行备份/etc/crontab频率。
这是一个比上面的TL; DR; DR;在设置中更加了解的解释。本节更一般,但使用Linux + SystemD作为示例设置。
$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $( basename " $_ " .git )在源文件中快速进行搜索和重新定位:
$ find bin etc usr Library ScheduledTask -type f -exec sed -i.bak -e ' s|{{ INSTALL_PREFIX }}||g ' {} ; -exec rm {}.bak ;现在您应该看到所有文件都已更改,例如
- export RESTIC_PASSWORD_FILE="{{ INSTALL_PREFIX }}/etc/restic/pw.txt"
+ export RESTIC_PASSWORD_FILE="/etc/restic/pw.txt"为什么? OS特定的TL; DR设置上面使用MakeFile或软件包管理器来安装这些文件。出于可移植性原因,占位符字符串{{ INSTALL_PREFIX }}位于源文件中,因此MakeFile可以支持所有不同的操作系统。 make用户可以在安装PREFIX=/usr/local make install-systemd时设置不同的$PREFIX 。
在此详细的手册设置中,我们将手动将所有文件复制到/etc和/bin 。因此,我们需要在源文件中删除占位符字符串{{ INSTALL_PREFIX }}作为第一步。
简而言之:
首先,请参阅有关Restic的官方Backblaze教程,并遵循有关如何创建新的B2存储桶的说明(“使用B2启用B2启用”)。通常,您需要一个没有B2加密的私有存储桶(RESTIC为我们提供加密客户端),并且没有对象锁定功能。
为了使Restic能够连接到您的存储桶,您希望在B2设置中创建一对KeyID和ApplicationKey。为每个存储桶创建一个单独的ID和键是一个好主意,只有对该存储桶的读取和写入访问有限。
将这些文件放入/etc/restic/ :
_global.env.sh :将此文件填写在您的全局设置中,包括B2 KeyID和ApplicationKey。default.env.sh :这是默认配置文件。用存储牌名称,备份路径和保留政策填写。该文件来源_global.env.sh ,因此是独立的,当您想发出一些手动rettic命令时,可以在外壳中采购。例如: $ 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 :此文件应包含用于加密存储库的RESTIC密码(单行)。这是一个新密码,初始化新存储库时将很快使用。它应该是此Restic备份存储库的独特之处,并且需要从中恢复它。不要重复使用您的B2登录密码,这应该有所不同。例如,您可以使用: $ openssl rand -base64 128 | tr -d ' n ' > /etc/restic/pw.txtbackup_exclude.txt :要忽略的文件模式列表。正确完成后,这将使您的备份尺寸和备份速度经常缩小! 现在,我们必须在远程端初始化存储库:
$ sudo -i
# source /etc/restic/default.env.sh
# restic init 将此文件放入/bin :
restic_backup.sh :一个定义如何运行备份的脚本。目的是您不需要自己编辑此脚本,而是能够控制*.env.sh配置文件中的所有内容。 RESTIC支持排除文件。他们列出了文件模式路径,以排除您的备份,仅占据存储空间,备份时间,网络和金钱的文件。 restic_backup.sh允许一些不同的排除文件。
/etc/restic/backup_exclude.txt全局排除列表。如果您的设置很容易,则只能使用此功能。这是在_global.env.sh中设置的。如果您需要另一个配置文件的其他文件,则可以在此配置文件中覆盖Envvar RESTIC_BACKUP_EXCLUDE_FILE 。.backup_exclude.txt按备份路径。如果您具有安装在/mnt/媒体的USB磁盘,并且此路径包含在$RESTIC_BACKUP_PATHS中,则可以放置一个file /mnt/media/.backup_exclude.txt .backup_exclude.txt,并且它将自动拾取。这样做的好处是,备用路径是自言自语的,因为它们排除在外! 现在查看备份本身是否有效,通过作为root运行
# source /etc/restic/default.env.sh
# /bin/restic_backup.sh 由于default.env.sh已经在您的根壳中采购,因此您现在只需列出SnapShost
# restic snapshots或者,您可以将Restic快照将目录集安装到/mnt/restic
# restic mount /mnt/restic
# ls /mnt/restic 所有操作系统设置都在使用哪种任务调度程序方面有所不同。作为演示,让我们看一下在此处的Linux下如何使用SystemD来完成此操作。
将这些文件放入/etc/systemd/system (请注意,makefile以包装安装到/usr/lib/systemd/system )
[email protected] :一种带有指定配置文件的备份脚本的服务。该配置文件在运行时@之后的值指定(请参见下文)。[email protected] :每天启动以前备份的计时器(有关个人资料的相同内容)。OnCalendar密钥。现在只需使用以下方式启用计时器:
# systemctl enable --now [email protected]您可以查看下一个备份计划运行的时间
# systemctl list-timers | grep restic并查看当前运行备份的状态:
# systemctl status restic-backup或手动启动备份:
$ systemctl start restic-backup@default您可以在备份运行时遵循备份stdout输出实时直播:
$ journalctl -f -u [email protected] (跳过-f查看所有已运行的备份)
偶尔对远程存储库进行健康检查,以确保它不会损坏。这可以通过$ restic check来完成。
有伴随脚本,服务和计时器( *check* )到Restic-backup.sh,检查了RESTIC备份是否错误查看usr/lib/systemd/system/和bin/中的回购中,然后将您需要的内容复制到相应的位置。
# systemctl enable --now [email protected] 
要拥有具有不同存储桶的不同备份作业,请备份时间表的备份路径,只需在上一步中使用default default.env.sh的副本。
要创建不同的备份并使用您可以做:
# 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启用后,它将写入每个备份后统计数据的CSV日志文件。可以通过在全局环境文件上删除其Env变量( RESTIC_BACKUP_STATS_DIR )或在特定配置文件上定义其来启用。
统计日志(以及)桌面通知在额外的restic snapshots和restic diff中产生。此执行与通知共享(无额外运行)。

最好是在备份之上,以确保它们的尺寸不会增加并产生高昂的成本。但是,众所周知,从非用户过程(例如root)正确发出GUI通知是很棘手的。
因此,该项目为桌面通知提供了一种轻巧的解决方案:基本上是restic_backup.sh将以火灾和填充方式附加到用户拥有的文件(运行操作系统的桌面环境的用户)的最后一个备份线。然后,用户有一个读取此信息并将每一行的过程作为新消息的过程,以便在使用的桌面环境中。
设置桌面通知:
$ mkfifo /home/user/.cache/notification-queue/etc/restic/default.sh ,设置: RESTIC_BACKUP_NOTIFICATION_FILE=/home/user/.cache/notification-queue我们想知道何时自动备份失败,因此我们可以修复它。由于我的笔记本电脑没有运行邮件服务器,因此我选择了一个解决方案来设置笔记本电脑,以便能够通过我的Gmail通过Postfix发送电子邮件。按照那边的说明进行操作。
将此文件放入/bin :
systemd-email :使用SendMail(1)发送电子邮件。该脚本还具有超时,以免垃圾邮件gmail服务器并阻止我的帐户。将此文件放入/etc/systemd/system/ :
[email protected] :SystemD服务失败时可以通过电子邮件通知您的服务。在此文件中编辑目标电子邮件地址,然后根据您的安装替换或删除{{ INSTALL_PREFIX }} 。现在编辑/usr/lib/systemd/system/[email protected]和/usr/lib/systemd/system/[email protected]称此服务失败。
OnFailure=status-email-user@%n.service
使用bin/cron_mail :用于运行cron作业的包装器,使用邮件(1)命令将作业输出作为电子邮件发送。这假设mail程序已在系统上正确设置以发送电子邮件。
要使用此功能,请将Restic脚本命令与您的cron文件中包装,例如:
- @midnight root . /etc/restic/default.sh && restic_backup.sh
+ @midnight root . /etc/restic/default.sh && cron_mail restic_backup.sh对于笔记本电脑,当您的计量连接(例如手机共享连接)上的计量连接时,不进行重型备份是有意义的。为了解决这个问题,我们可以建立仅在连接未限制的情况下才能在成功状态下处于成功状态的SystemD服务。然后,我们可以告诉我们的备份服务简单地依赖此服务!当未计量服务检测到未分配的连接时,它将进入失败状态。那么我们的备份服务将不会运行,因为它要求其他服务处于成功状态。
[email protected]和[email protected]要求新服务处于成功状态: Requires=nm-unmetered-connection.service
After=nm-unmetered-connection.service
/etc/systemd/system/ :nm-unmetered-connection.service :仅在连接未限制的情况下才能保持成功状态。/bin中安装此文件:nm-unmetered-connection.sh :检测计量连接并在检测到一个错误代码的情况下返回错误代码。此脚本要求安装GNOME NetworkManager(如果您的系统具有不同的网络管理器,则修改此脚本)。# systemctl daemon-reload ☝提示:如果您使用makefile,则所有步骤都可以完成。根据需要设置$PREFIX ,或将空安装到/ 。
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
'为了方便起见,有一个restic包装脚本,可以使加载配置文件并直接运行RESTIC (它需要使用Sudo运行才能读取环境)。只是运行:
sudo resticw WHATEVER (例如sudo resticw snapshots )使用默认配置文件。resticw -p anotherprofile snapshots 。restic之上具有额外的功能--diff-latest选项。有用的命令:
| 命令 | 描述 |
|---|---|
resticw snapshots | 列出备份快照 |
resticw diff <snapshotId-1> <snapshotId-2> | 显示备份快照之间的更改 |
resticw stats / resticw stats snapshotId ... | 显示整个存储库或指定快照的统计信息 |
resticw mount /mnt/restic | 安装您的遥控存储库 |
resticw --diff-latest | 显示最新的快照更改:在找到最新的2个快照后运行restic diff |
有一个目标可以删除由sudo make install-*安装的所有文件(脚本和配置) 。只是运行:
$ sudo make uninstall调试发生的事情的最佳方法是使用Bash的跟踪功能运行restic_backup.sh脚本。您可以通过使用bash -x运行脚本来激活它:
$ source /etc/restic/default.env.sh
$ bash -x /bin/restic_backup.sh
要调试备份脚本的较小部分,请在相关代码部分的顶部和底部插入这些行:例如:
set -x
exec 2> /tmp/restic-automatic-backup-scheduler.log
< code to debug >
set +x然后检查输出
$ less /tmp/restic-automatic-backup-scheduler.log
$ tail -f /tmp/restic-automatic-backup-scheduler.log # or follow output like this.Makefile时,不要弄乱您的实际安装,只需安装到$PREFIX $ PREFIX=/tmp/restic-test make install-systemdresticw Parser:如果您更新使用DOC ,则需要刷新自动生成的解析器: $ pip install doctopt.sh
$ doctopt.sh usr/local/bin/resticw为了制作新版本:
$ vi CHANGELOG.md && git commit -am " Update CHANGELOG.md "
$ git tag vX.Y.Z
$ git push && git push --tags