From 746680731e86fc4e69759332456d4f46d6eef981 Mon Sep 17 00:00:00 2001 From: Fabian Date: Sun, 1 Mar 2020 00:26:08 +0000 Subject: [PATCH] Add timed backup --- host/montalin.nix | 5 ++-- role/backup.nix | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 role/backup.nix diff --git a/host/montalin.nix b/host/montalin.nix index bdc354b..262a392 100644 --- a/host/montalin.nix +++ b/host/montalin.nix @@ -11,6 +11,7 @@ ../hardware/nuc.nix ../role/base.nix ../role/dropbear.nix + (import ../role/backup.nix {systemdMount = "var-backup.mount"; borgArchiveFolder = "/var/backup/montalin";}) ]; boot.tmpOnTmpfs = true; @@ -21,8 +22,8 @@ }; fileSystems = { - "/" = { device = "/dev/mapper/root"; fsType = "btrfs"; }; - "/var/backup" = { device = "/dev/mapper/backup"; fsType = "ext4"; }; + "/" = { device = "/dev/mapper/root"; fsType = "btrfs"; options = [ "defaults" "noatime" ]; }; + "/var/backup" = { device = "/dev/mapper/backup"; fsType = "ext4"; options = [ "defaults" "noauto" "noatime" ]; }; "/boot" = { device = "/dev/disk/by-uuid/0065-E4EA"; fsType = "vfat"; options = [ "defaults" "noatime" ]; }; }; diff --git a/role/backup.nix b/role/backup.nix new file mode 100644 index 0000000..e019b7e --- /dev/null +++ b/role/backup.nix @@ -0,0 +1,66 @@ +{ + systemdMount, + borgArchiveFolder, + keepWithin? "14d", + keepWeekly? "4", + keepMonthly? "6", + keepYearly? "-1", +}: + +let pkgs = import{}; +in +{ + + systemd = { + services.backup = { + description = "Backup of all user data and system configuration with BorgBackup"; + serviceConfig.Type = "oneshot"; + path = with pkgs; [ bash borgbackup ]; + script = '' + #!/usr/bin/env bash + set -euo pipefail + IFS=$'\n\t' + + systemctl start ${systemdMount} + + export BORG_REPO=${borgArchiveFolder} \ + BORG_BASE_DIR=${borgArchiveFolder}/borg-base-dir + + echo "Backup started at `date`" + borg create --exclude /var/backup \ + --exclude /var/tmp \ + --exclude /var/cache \ + $BORG_REPO::{hostname}-{now} \ + /etc \ + /home \ + /root \ + /var + + sync + echo "Backup finished at `date`" + + echo "Backup prune started at `date`" + borg prune --prefix '{hostname}-' \ + --keep-within ${keepWithin} \ + --keep-weekly ${keepWeekly} \ + --keep-monthly ${keepMonthly} \ + --keep-yearly ${keepYearly} + sync + echo "Backup prune finished at `date`" + + systemctl stop ${systemdMount} + ''; + }; + + timers.backup = { + description = "Backup Schedule"; + + timerConfig = { + OnCalendar = "13:37"; + Persistent = "true"; + }; + + wantedBy = [ "timers.target" ]; + }; + }; +}