Sebelumnya bernama restic-systemd-otomatis-backup
termasuk kontributor teratas ini:
Restic adalah alat baris perintah untuk membuat cadangan, cara yang benar. Periksa situs web resmi untuk penjelasan fitur. Sebagai backend penyimpanan, saya merekomendasikan Backblaze B2 karena Restic bekerja dengan baik dengannya, dan itu (pada saat penulisan) sangat terjangkau untuk hacker hobi! (Anekdotal: Saya membayar cadangan sistem lengkap saya setiap bulan biasanya <1 USD).
Sayangnya Restic tidak dikonfigurasi dengan cara untuk menjalankan cadangan otomatis, katakanlah setiap hari. Namun, dimungkinkan untuk mengatur ini sendiri menggunakan alat bawaan di OS Anda dan beberapa pembungkus. Untuk Linux dengan SystemD, lebih mudah menggunakan timer SystemD. Untuk sistem macOS, kami dapat menggunakan launchagents bawaan. Untuk Windows, kami dapat menggunakan jadwal. OS apa pun yang memiliki sesuatu seperti cron juga akan berhasil!
Berikut ini adalah tutorial langkah demi langkah tentang cara mengaturnya, dengan skrip sampel dan konfigurasi yang dapat Anda modifikasi sesuai dengan kebutuhan Anda.
Catatan, Anda dapat menggunakan backend penyimpanan yang didukung Restic. Pengaturan harus serupa, tetapi Anda harus menggunakan variabel konfigurasi lain untuk mencocokkan backend pilihan Anda.
UPDATE: Proyek ini adalah fitur lengkap (lihat alasan di bawah). Hanya perbaikan bug yang akan diterima. Jangan ragu untuk membayar jika Anda ingin menambahkan lebih banyak fitur; Menjadi basis forking adalah ruang lingkup awal dari proyek ini!
Ruang lingkup untuk ini bukan untuk menjadi solusi super penuh yang memecahkan semua masalah dan semua pengaturan yang mungkin. Tujuannya adalah menjadi basis kode yang dapat diretas bagi Anda untuk mulai menjahit solusi cadangan yang sempurna yang sesuai dengan kebutuhan Anda!
Namun demikian, proyek harus bekerja di luar kotak, minim tetapi masih membuka pintu untuk konfigurasi dan ekstensi oleh pengguna.
Untuk menggunakan backend penyimpanan yang berbeda dari B2, Anda hanya perlu mengubah beberapa variabel pengaturan di profil cadangan serta beberapa argumen restic di dalam restic_backup.sh .
☝ Perhatikan pengaturan Linux di sini akan mengambil instalasi ke / .
Banyak distribusi Linux saat ini menggunakan SystemD, yang menampilkan dukungan yang baik untuk menjalankan layanan dan pekerjaan yang dijadwalkan. Jika distribusi Anda tidak ada di SystemD, lihat pengaturan Cron sebagai gantinya.
Tl; dr setup
make : $ sudo make install-systemd$ yay -S restic-automatic-backup-scheduler/etc/restic .restic(1) . Semua perintah setelah ini mengasumsikan profil bersumber di shell saat ini. # source /etc/restic/default.env.sh
# restic initOnCalendar di /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 dan gunakan nama profil yang ditentukan sebagai pengganti default untuk menjalankan cadangan atau mengaktifkan timer. Perhatikan bahwa nilai setelah @ berfungsi sebagai parameter. # systemctl enable restic-backup@other_profile.timer ☝ Perhatikan pengaturan macOS di sini akan mengasumsikan instalasi homebrew ke lokasi default yang disarankan. Ini adalah $HOMEBREW_PREFIX ( brew --prefix ), yang /usr/local di intel mac dan /opt/homebrew on apple silicon.
Launchd adalah penjadwal layanan bawaan modern di MacOS. Ini memiliki dukungan untuk menjalankan layanan sebagai root (daemon) atau sebagai pengguna normal (agen). Di sini kami menyiapkan LaunchAgent untuk dijalankan sebagai pengguna normal Anda untuk memulai cadangan reguler.
Tl; dr setup
$ brew install erikw/tap/restic-automatic-backup-schedulermake : $ make PREFIX=$(brew --prefix) install-launchagent$(brew --prefix)/etc/restic .restic(1) . Semua perintah setelah ini mengasumsikan profil bersumber di shell saat ini. $ source $(brew --prefix)/etc/restic/default.env.sh
$ restic initOnCalendar di~/Library/LaunchAgents/homebrew.mxcl.restic-automatic-backup-scheduler.plist .make instal: ~/Library/LaunchAgents/com.github.erikw.restic-backup.plist .$ brew services start restic-automatic-backup-schedulermake instal: $ 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 instal: $ 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 .Kemudian mengontrol layanan dengan homebrew:
$ brew services start restic-automatic-backup-scheduler
$ brew services restart restic-automatic-backup-scheduler
$ brew services stop restic-automatic-backup-scheduler Jika services start gagal, itu mungkin karena versi sebelumnya diinstal. Dalam hal ini hapus versi yang ada dan coba lagi:
$ launchctl bootout gui/ $UID /com.github.erikw.restic-backup
$ brew services start restic-automatic-backup-scheduler Gunakan perintah disable untuk sementara waktu menjeda agen, atau bootout untuk menghapus instalannya.
$ launchctl disable gui/$UID/com.github.erikw.restic-backup
$ launchctl bootout gui/$UID/com.github.erikw.restic-backup
Jika Anda memperbarui file .plist , Anda perlu mengeluarkan bootout diikuti oleh bootrstrap dan enable sub-komando launchctl . Ini akan menjamin bahwa file tersebut dimuat ulang dengan benar.
Windows hadir dengan penjadwal tugas bawaan yang disebut StorduledTask. Aplikasi Frontend adalah "Penjadwal Tugas" ( taskschd.msc ) dan kami dapat menggunakan perintah PowerShell untuk menginstal tugas yang dijadwalkan baru.
Saya jelaskan di sini salah satu cara Anda bisa mendapatkan restic dan skrip cadangan ini bekerja pada windows. Di sini saya memilih untuk bekerja dengan scoop dan git-bash .
Tl; dr setup
pwsh harus diinstal untuk dapat menjalankan PowerShell dalam skrip 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 yang bisa Anda miliki export RESTIC_BACKUP_PATHS= ' /c/Users/<username>/My Documents 'restic(1) . Semua perintah setelah ini mengasumsikan profil bersumber di shell saat ini. git-bash$ source /etc/restic/default.env.sh
git-bash$ restic init git-bash$ restic_backup.sh git-bash$ restic snapshotstaskschd.msc )restic_backup dan klik "Jalankan".make install-schedtask : Tutup saja dan mulai lagi untuk menyegarkan.restic_backup.sh , dan lain kali jadwal yang dikonfigurasi melanda! Dengan taskschd.msc Anda dapat dengan mudah memulai, berhenti, menghapus, dan mengkonfigurasi tugas yang dijadwalkan sesuai dengan keinginan Anda:
☝ Perhatikan ada banyak implementasi cron yang berbeda di luar sana dan semuanya bekerja sedikit berbeda.
Sistem apa pun yang memiliki sistem seperti cron dapat dengan mudah mengatur cadangan restic juga. Namun jika sistem Anda mendukung salah satu dari pengaturan sebelumnya, itu direkomendasikan melalui cron karena mereka memberikan lebih banyak fitur dan keandalan untuk cadangan Anda.
Tl; dr setup
$ sudo make install-cron/etc/cron.d/ . Jika bukan itu masalahnya, cukup salin konten yang relevan dari /etc/cron.d/restic in ke /etc/crontab Anda. # grep " ^@.*restic_ " /etc/cron.d/restic >> /etc/crontab/etc/restic .restic(1) . Semua perintah setelah ini mengasumsikan profil bersumber di shell saat ini. # source /etc/restic/default.env.sh
# restic init # restic_backup.sh# restic snapshots/etc/cron.d/restic (atau /etc/crontab ).
Ini adalah penjelasan yang lebih rinci daripada bagian TL; DR di atas yang akan memberi Anda lebih banyak pemahaman dalam pengaturan. Bagian ini lebih umum, tetapi menggunakan Linux + SystemD sebagai pengaturan contoh.
$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $( basename " $_ " .git )Buat pencarian dan ganti cepat di file sumber:
$ find bin etc usr Library ScheduledTask -type f -exec sed -i.bak -e ' s|{{ INSTALL_PREFIX }}||g ' {} ; -exec rm {}.bak ;dan sekarang Anda harus melihat bahwa semua file telah diubah seperti misalnya
- export RESTIC_PASSWORD_FILE="{{ INSTALL_PREFIX }}/etc/restic/pw.txt"
+ export RESTIC_PASSWORD_FILE="/etc/restic/pw.txt" Mengapa? Pengaturan OS spesifik TL; DR di atas semua menggunakan Makefile atau Manajer Paket untuk menginstal file -file ini. String placeholder {{ INSTALL_PREFIX }} ada di file sumber untuk alasan portabilitas, sehingga makefile dapat mendukung semua sistem operasi yang berbeda. make Pengguna Dapat Menyetel $PREFIX yang Berbeda Saat Menginstal Like PREFIX=/usr/local make install-systemd .
Dalam pengaturan manual terperinci ini, kami akan menyalin semua file secara manual ke /etc dan /bin . Dengan demikian, kita perlu menghapus string placeholder {{ INSTALL_PREFIX }} dalam file sumber sebagai langkah pertama.
Pendeknya:
Pertama, lihat tutorial backblaze resmi ini di Restic, dan ikuti instruksi ("Buat akun Backblaze dengan B2 diaktifkan") di sana tentang cara membuat ember B2 baru. Secara umum, Anda ingin ember pribadi, tanpa enkripsi B2 (restic melakukan sisi klien enkripsi untuk kami) dan tanpa fitur kunci objek.
Agar restic dapat terhubung ke ember Anda, Anda ingin di pengaturan B2 membuat sepasang KeyID dan ApplicationKey. Merupakan ide bagus untuk membuat sepasang ID dan kunci terpisah dengan untuk setiap ember yang akan Anda gunakan, dengan akses baca & tulis hanya ke hanya ember itu.
Masukkan file -file ini di /etc/restic/ :
_global.env.sh : Isi file ini dengan pengaturan global Anda termasuk B2 KeyID & ApplicationKey.default.env.sh : Ini adalah profil default. Isi ini dengan nama ember, jalur cadangan, dan kebijakan retensi. Sumber file ini _global.env.sh dan dengan demikian mandiri dan dapat bersumber di shell ketika Anda ingin mengeluarkan beberapa perintah restic manual. Misalnya: $ 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 : File ini harus berisi kata sandi restic (baris tunggal) yang digunakan untuk mengenkripsi repositori. Ini adalah kata sandi baru yang akan segera digunakan saat menginisialisasi repositori baru. Itu harus unik untuk repositori Backup Restic ini dan diperlukan untuk memulihkannya. Jangan gunakan kembali kata sandi login B2 Anda, ini harus berbeda. Misalnya Anda dapat menghasilkan kata sandi 128 karakter (semua harus ada di satu baris) dengan: $ openssl rand -base64 128 | tr -d ' n ' > /etc/restic/pw.txtbackup_exclude.txt : Daftar pola file yang harus diabaikan. Ini akan memangkas ukuran cadangan Anda dan kecepatan cadangan banyak saat dilakukan dengan benar! Sekarang kita harus menginisialisasi repositori di ujung jarak jauh:
$ sudo -i
# source /etc/restic/default.env.sh
# restic init Masukkan file ini di /bin :
restic_backup.sh : skrip yang mendefinisikan cara menjalankan cadangan. Tujuannya adalah bahwa Anda tidak perlu mengedit skrip ini sendiri, tetapi dapat mengendalikan semuanya dari profil *.env.sh . Dukungan restic mengecualikan file. Mereka mencantumkan jalur pola file untuk mengecualikan dari cadangan Anda, file yang hanya menempati ruang penyimpanan, waktu cadangan, jaringan, dan uang. restic_backup.sh memungkinkan untuk beberapa file mengecualikan berbeda.
/etc/restic/backup_exclude.txt - Daftar Global Exclude. Anda hanya dapat menggunakan yang satu ini jika pengaturan Anda mudah. Ini diatur dalam _global.env.sh . Jika Anda memerlukan file yang berbeda untuk profil lain, Anda dapat mengganti Envvar RESTIC_BACKUP_EXCLUDE_FILE di profil ini..backup_exclude.txt per jalur cadangan. Jika Anda memiliki Disk USB yang dipasang di/mnt/media dan jalur ini termasuk dalam $RESTIC_BACKUP_PATHS , Anda dapat menempatkan file /mnt/media/.backup_exclude.txt dan secara otomatis akan diambil. Hal yang menyenangkan tentang ini adalah bahwa jalur cadangan mandiri dalam hal apa yang mereka akan dikecualikan! Sekarang lihat apakah cadangan itu sendiri berfungsi, dengan berjalan sebagai root
# source /etc/restic/default.env.sh
# /bin/restic_backup.sh Karena default.env.sh sudah bersumber di root shell Anda, sekarang Anda dapat mencantumkan snapshost
# restic snapshots Atau Anda dapat memasang snapshot restic ke set direktori /mnt/restic
# restic mount /mnt/restic
# ls /mnt/restic Semua pengaturan OS berbeda dalam penjadwal tugas apa yang mereka gunakan. Sebagai demonstrasi, mari kita lihat bagaimana kita bisa melakukan ini dengan SystemD di bawah Linux di sini.
Masukkan file -file ini di /etc/systemd/system (perhatikan bahwa Makefile menginstal sebagai paket ke /usr/lib/systemd/system )
[email protected] : Layanan yang memanggil skrip cadangan dengan profil yang ditentukan. Profil ditentukan oleh nilai setelah @ saat menjalankannya (lihat di bawah).[email protected] : timer yang memulai cadangan sebelumnya setiap hari (hal yang sama tentang profil di sini).OnCalendar di file.Sekarang cukup aktifkan timer dengan:
# systemctl enable --now [email protected]Anda dapat melihat kapan cadangan Anda berikutnya dijadwalkan
# systemctl list-timers | grep resticdan lihat status cadangan yang sedang berjalan dengan:
# systemctl status restic-backupAtau mulai cadangan secara manual:
$ systemctl start restic-backup@defaultAnda dapat mengikuti output stdout cadangan langsung saat cadangan berjalan dengan:
$ journalctl -f -u [email protected] (lewati -f untuk melihat semua cadangan yang telah berjalan)
Sesekali bisa baik untuk melakukan pemeriksaan kesehatan dari repositori jarak jauh, untuk memastikan itu tidak menjadi korup. Ini bisa dilakukan dengan $ restic check .
Ada skrip pendamping, layanan, dan timer ( *check* ) ke restic-backup.sh yang memeriksa cadangan restic untuk kesalahan; Lihatlah di repo di usr/lib/systemd/system/ dan bin/ dan salin apa yang Anda butuhkan ke lokasi yang sesuai.
# systemctl enable --now [email protected] 
Untuk memiliki pekerjaan cadangan yang berbeda dengan misalnya ember yang berbeda, jalur cadangan jadwal, cukup buat salinan default.env.sh dan gunakan nama profil yang ditentukan sebagai pengganti default pada langkah -langkah sebelumnya.
Untuk membuat cadangan yang berbeda dan menggunakan Anda dapat melakukannya:
# 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 Saat diaktifkan, itu akan menulis ke file log CSV statistik setelah setiap cadangan. Dapat diaktifkan dengan Uncommenting Variabel Envnya ( RESTIC_BACKUP_STATS_DIR ) pada file lingkungan global atau mendefinisikannya pada profil tertentu.
Log statistik (serta) pemberitahuan desktop dikeluarkan dalam menjalankan tambahan restic snapshots dan restic diff . Eksekusi ini dibagikan dengan pemberitahuan (tidak ada jalan tambahan).

Ide yang bagus berada di atas cadangan Anda untuk memastikan bahwa mereka tidak menambah banyak ukuran dan dikenakan biaya tinggi. Namun, sangat sulit untuk membuat pemberitahuan GUI dengan benar dari proses non-pengguna (misalnya root).
Oleh karena itu, proyek ini memberikan solusi ringan untuk pemberitahuan desktop yang berfungsi seperti ini: pada dasarnya restic_backup.sh akan menambahkan baris ringkasan cadangan terakhir ke file yang dimiliki pengguna (pengguna yang menjalankan lingkungan desktop OS Anda) dengan cara pemadam kebakaran. Kemudian pengguna memiliki proses yang membaca ini dan meneruskan setiap baris sebagai pesan baru ke lingkungan desktop yang digunakan.
Untuk mengatur pemberitahuan desktop:
$ mkfifo /home/user/.cache/notification-queue/etc/restic/default.sh , set: RESTIC_BACKUP_NOTIFICATION_FILE=/home/user/.cache/notification-queueKami ingin menyadari kapan cadangan otomatis gagal, sehingga kami dapat memperbaikinya. Karena laptop saya tidak menjalankan server email, saya pergi untuk solusi untuk mengatur laptop saya untuk dapat mengirim email dengan postfix melalui gmail saya. Ikuti instruksi di sana.
Masukkan file ini di /bin :
systemd-email : Mengirim email menggunakan SendMail (1). Script ini juga menampilkan waktu luang karena tidak spam server Gmail dan mendapatkan akun saya diblokir. Masukkan file ini di /etc/systemd/system/ :
[email protected] : Layanan yang dapat memberi tahu Anda melalui email ketika layanan SystemD gagal. Edit alamat email target dalam file ini, dan ganti atau hapus {{ INSTALL_PREFIX }} sesuai dengan instalasi Anda. Sekarang edit /usr/lib/systemd/system/[email protected] dan /usr/lib/systemd/system/[email protected] untuk menyebut kegagalan layanan ini.
OnFailure=status-email-user@%n.service
Gunakan bin/cron_mail : Pembungkus untuk menjalankan pekerjaan cron, yang mengirimkan output pekerjaan sebagai email menggunakan perintah Mail (1). Ini mengasumsikan bahwa program mail diatur dengan benar pada sistem untuk mengirim email.
Untuk menggunakan ini, bungkus perintah restic script dengannya di file cron Anda seperti:
- @midnight root . /etc/restic/default.sh && restic_backup.sh
+ @midnight root . /etc/restic/default.sh && cron_mail restic_backup.shUntuk laptop, masuk akal untuk tidak melakukan cadangan berat saat Anda pada koneksi pengukur seperti koneksi bersama dari ponsel Anda. Untuk menyelesaikan ini, kami dapat mengatur layanan SystemD yang dalam keadaan sukses hanya ketika koneksi tidak diukur. Kemudian kami dapat memberi tahu layanan cadangan kami untuk bergantung pada layanan ini! Ketika layanan yang tidak diukur mendeteksi koneksi yang tidak diukur, ia akan pergi ke keadaan gagal. Maka layanan cadangan kami tidak akan berjalan karena mengharuskan layanan lain ini dalam keadaan sukses.
[email protected] dan [email protected] untuk meminta layanan baru dalam keadaan sukses: Requires=nm-unmetered-connection.service
After=nm-unmetered-connection.service
/etc/systemd/system/ :nm-unmetered-connection.service ./bin :nm-unmetered-connection.sh : Mendeteksi koneksi pengukur dan mengembalikan kode kesalahan jika seseorang terdeteksi. Script ini mengharuskan GNOME NetworkManager diinstal (memodifikasi skrip ini jika sistem Anda memiliki manajer jaringan yang berbeda).# systemctl daemon-reload ☝ Tip : Semua langkah tetapi yang pertama dapat dilakukan dalam sekali jalan jika Anda menggunakan Makefile. Setel $PREFIX sesuai kebutuhan atau tinggalkan kosong untuk diinstal ke / .
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
' Untuk kenyamanan ada skrip pembungkus restic yang membuat profil pemuatan dan menjalankan restic langsung (perlu berjalan dengan sudo untuk membaca lingkungan). Jalankan saja:
sudo resticw WHATEVER (misalnya sudo resticw snapshots ) untuk menggunakan profil default.resticw -p anotherprofile snapshots .restic seperti --diff-latest .Perintah yang berguna:
| Memerintah | Keterangan |
|---|---|
resticw snapshots | Sebutkan snapshot cadangan |
resticw diff <snapshotId-1> <snapshotId-2> | Tunjukkan perubahan antara snapshot cadangan |
resticw stats / resticw stats snapshotId ... | Tunjukkan statistik untuk seluruh repo atau snapshot yang ditentukan |
resticw mount /mnt/restic | Pasang repositori jarak jauh Anda |
resticw --diff-latest | Tampilkan perubahan snapshot terbaru: menjalankan restic diff setelah menemukan 2 snapshot terbaru |
Ada target Make untuk menghapus semua file (skrip dan konfigurasi) yang diinstal oleh sudo make install-* . Jalankan saja:
$ sudo make uninstall Cara terbaik untuk men -debug apa yang terjadi adalah dengan menjalankan skrip restic_backup.sh dengan fungsi jejak Bash. Anda dapat mengaktifkannya dengan menjalankan skrip dengan bash -x :
$ source /etc/restic/default.env.sh
$ bash -x /bin/restic_backup.sh
Untuk men -debug bagian yang lebih kecil dari skrip cadangan, masukkan baris -baris ini di bagian atas dan bawah bagian kode yang relevan misalnya:
set -x
exec 2> /tmp/restic-automatic-backup-scheduler.log
< code to debug >
set +xdan kemudian memeriksa output seperti
$ less /tmp/restic-automatic-backup-scheduler.log
$ tail -f /tmp/restic-automatic-backup-scheduler.log # or follow output like this.Makefile cukup instal ke $PREFIX seperti $ PREFIX=/tmp/restic-test make install-systemdresticw : Jika Anda pernah memperbarui DOC penggunaan, Anda perlu menyegarkan parser yang dihasilkan secara otomatis: $ pip install doctopt.sh
$ doctopt.sh usr/local/bin/resticwUntuk membuat rilis baru:
$ vi CHANGELOG.md && git commit -am " Update CHANGELOG.md "
$ git tag vX.Y.Z
$ git push && git push --tags