restic: allow prune without backup

fixes #97820

Changed files
+14 -5
nixos
modules
services
backup
tests
+8 -5
nixos/modules/services/backup/restic.nix
···
};
paths = mkOption {
-
type = types.listOf types.str;
-
default = [];
+
type = types.nullOr (types.listOf types.str);
+
default = null;
description = ''
-
Which paths to backup.
+
Which paths to backup. If null or an empty array, no
+
backup command will be run. This can be used to create a
+
prune-only job.
'';
example = [
"/var/lib/postgresql"
···
resticCmd = "${pkgs.restic}/bin/restic${extraOptions}";
filesFromTmpFile = "/run/restic-backups-${name}/includes";
backupPaths = if (backup.dynamicFilesFrom == null)
-
then concatStringsSep " " backup.paths
+
then if (backup.paths != null) then concatStringsSep " " backup.paths else ""
else "--files-from ${filesFromTmpFile}";
pruneCmd = optionals (builtins.length backup.pruneOpts > 0) [
( resticCmd + " forget --prune " + (concatStringsSep " " backup.pruneOpts) )
···
restartIfChanged = false;
serviceConfig = {
Type = "oneshot";
-
ExecStart = [ "${resticCmd} backup --cache-dir=%C/restic-backups-${name} ${concatStringsSep " " backup.extraBackupArgs} ${backupPaths}" ] ++ pruneCmd;
+
ExecStart = (optionals (backupPaths != "") [ "${resticCmd} backup --cache-dir=%C/restic-backups-${name} ${concatStringsSep " " backup.extraBackupArgs} ${backupPaths}" ])
+
++ pruneCmd;
User = backup.user;
RuntimeDirectory = "restic-backups-${name}";
CacheDirectory = "restic-backups-${name}";
+6
nixos/tests/restic.nix
···
'';
inherit passwordFile initialize paths pruneOpts;
};
+
remoteprune = {
+
inherit repository passwordFile;
+
pruneOpts = [ "--keep-last 1" ];
+
};
};
environment.sessionVariables.RCLONE_CONFIG_LOCAL_TYPE = "local";
···
"systemctl start restic-backups-rclonebackup.service",
'${pkgs.restic}/bin/restic -r ${repository} -p ${passwordFile} snapshots -c | grep -e "^4 snapshot"',
'${pkgs.restic}/bin/restic -r ${rcloneRepository} -p ${passwordFile} snapshots -c | grep -e "^4 snapshot"',
+
"systemctl start restic-backups-remoteprune.service",
+
'${pkgs.restic}/bin/restic -r ${repository} -p ${passwordFile} snapshots -c | grep -e "^1 snapshot"',
)
'';
}