{ config, lib, ... }: { options = { backup.all.restic.dirs = lib.mkOption { default = []; type = with lib.types; listOf str; }; }; config = let servers = ["porani" "workhorse" "workout"]; dirs = config.backup.all.restic.dirs; setup = server: { passwordFile = toString ; repo = "sftp::backup/remote-${config.networking.hostName}"; requires = []; extraArguments = [ "sftp.command='ssh backup@${server} -i ${toString } -s sftp'" ]; initialize = true; timerConfig = { OnCalendar = "daily"; Persistent = "true"; }; dirs = dirs; }; hostname = config.networking.hostName; infoEntry = server: { restic = { folders = dirs; from = hostname; to = server; }; }; in { backup.services.restic = lib.zipAttrsWith (name: vals: lib.head vals) (map (server: { "on-${server}" = setup "${server}.private"; }) servers); environment.etc."info/restic-${hostname}.json" = { enable = true; text = builtins.toJSON (map infoEntry servers); }; }; }