以前命名為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