1 { pkgs, lib, config, hostName, ... }:
4 # Take regular snapshots, and prune old ones
7 extraArgs = [ "--verbose" ];
29 # Tigger backups when disks are plugged
30 services.udev.extraRules = ''
31 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ATTRS{size}=="1953525168", ENV{SYSTEMD_WANTS}+="zfs-local-backup-home@WD10JPVT.service"
33 # Force zpool import, even if the disk has not been exported, or has been imported on another computer
34 systemd.services."zfs-force-import@" = {
35 description = "ZFS force import: %I";
38 RemainAfterExit = true;
41 # Scan the zpools, using stable paths
42 "/run/booted-system/sw/bin/zpool import -d /dev/disk/by-id/"
45 /bin/sh -xc '/run/booted-system/sw/bin/zpool import -lFd /dev/disk/by-id/ %I || \
46 /run/booted-system/sw/bin/zpool reopen %I || \
47 /run/booted-system/sw/bin/zpool clear -nFX %I'
52 systemd.services."zfs-local-backup-home@" = {
53 description = "ZFS backup home, on: %I";
54 after = [ "zfs-force-import@%i.service" ];
55 wants = [ "zfs-force-import@%i.service" ];
58 RemainAfterExit = true;
60 CacheDirectory = [ "zfs-usb-backup-%I" ];
61 RuntimeDirectory = [ "zfs-usb-backup-%I" ];
65 "+/run/booted-system/sw/bin/zfs allow ${User} bookmark,hold,mount,send ${hostName}/home"
66 "+/run/booted-system/sw/bin/zfs allow ${User} bookmark,create,destroy,load-key,mount,mountpoint,receive,rollback,snapshot %I/${User}"
68 ExecStart = pkgs.writeShellScript "zfs-local-backup-home" ''
71 install -D -m 400 /dev/stdin /tmp/sanoid/sanoid.conf <<EOF
75 process_children_only=false
77 [$DESTPOOL/${User}/backup/${hostName}/home]
84 ${pkgs.sanoid}/bin/sanoid \
85 --cache-dir /var/cache/zfs-usb-backup-"$DESTPOOL" \
86 --configdir /tmp/sanoid \
88 --run-dir /run/zfs-usb-backup-"$DESTPOOL" \
91 for dataset in ${hostName}/home; do
92 ${pkgs.sanoid}/bin/syncoid \
94 --exclude "home/room" \
96 --no-privilege-elevation \
103 "$DESTPOOL"/${User}/backup/"$dataset"
106 # Scrub the zpool (in the background)
107 ExecStartPost = "+/run/booted-system/sw/bin/zpool scrub %I";