9 inherit (config.users) users;
10 backupTarget = "off4";
15 "${hostName}/root-to-${targetHost}" = lib.recursiveUpdate {
16 source = "${hostName}/root";
17 target = "backup@${targetHost}:${backupTarget}/julm/backup/${hostName}";
23 "--no-privilege-elevation"
24 "--preserve-properties"
25 "--preserve-recordsize"
30 "${hostName}/root/nix"
32 "${hostName}/root/var/cache"
34 "${hostName}/root/var/log"
36 "${hostName}/root/home/julm/.cache"
38 "${hostName}/root/home/julm/Downloads"
40 "${pkgs.writeText "ssh-config" ''
42 Ciphers aes128-gcm@openssh.com
44 StrictHostKeyChecking yes
50 "aubergine.local" = { };
51 "blackberry.local" = { };
52 "nan2gua1.local" = { };
69 users.users.backup = {
71 shell = users.root.shell;
72 group = config.users.groups.disk.name;
73 openssh.authorizedKeys.keys = [
74 (lib.readFile ../pumpkin/syncoid/ssh.key.pub)
75 (lib.readFile ../nan2gua1/syncoid/ssh.key.pub)
78 systemd.services."zfs-import@".serviceConfig.ExecStartPost =
79 pkgs.writeShellScript "zfs-allow" ''
83 (off2) zfs allow -u ${users.backup.name} change-key,compression,create,destroy,mount,mountpoint,receive,rollback,userprop "$pool"/julm/backup;;
84 (off4) zfs allow -u ${users.backup.name} change-key,compression,create,destroy,mount,mountpoint,receive,rollback,userprop "$pool"/julm/backup;;
88 networking.nftables.ruleset = lib.mkAfter ''
91 tcp dport 22 counter accept comment "syncoid: SSH"
94 skuid @nixos_syncoid_uids \
97 comment "syncoid: SSH"
101 systemd.tmpfiles.rules = [
102 "z /dev/zfs 0660 - ${config.users.groups."disk".name} -"
104 systemd.services."syncoid-${hostName}-root".serviceConfig = {
105 # Explanation: give access to /var/run/avahi-daemon/socket
106 # Using /var/run is not working due to RootDirectoryStartOnly=true
107 BindReadOnlyPaths = [ "/var/run" ];
108 RootDirectoryStartOnly = lib.mkForce false;
110 ExecStartPost = pkgs.writeShellScript "zfs-fix-bookmarks" ''
112 for s in $(zfs list -Hrpt snapshot -o name ${hostName}/root); do
113 zfs bookmark "$s" "''${s//@/#}" || true
119 interval = "*-*-* *:05:00";
121 sshKey = "ssh.key:${syncoid/ssh.key.cred}";
126 #"--no-privilege-elevation"
128 #"--preserve-recordsize"
129 #"--preserve-properties"
132 serviceConfig.Group = config.users.groups."disk".name;
134 commands = { } // backupConf { };
136 programs.bash.interactiveShellInit = ''
141 if ! zpool list ${backupTarget}
142 then dst=aubergine.sp:
144 sudo syncoid --sshkey ~julm/.ssh/id_ed25519 \
145 --create-bookmark --no-sync-snap --no-privilege-elevation \
146 --preserve-properties --preserve-recordsize \
147 --recursive --sendoptions=w --recvoptions=u \
148 --exclude-datasets ${hostName}/root/nix \
149 --exclude-datasets ${hostName}/root/var/cache \
150 --exclude-datasets ${hostName}/root/var/log \
151 --exclude-datasets ${hostName}/root/home/julm/.cache \
152 --exclude-datasets ${hostName}/root/home/julm/Downloads \
154 ''${dst}${backupTarget}/julm/backup/${hostName}
155 zfs-fix-bookmarks ${hostName}/root 2>/dev/null