From adafbeff4ad01e21b9d1b39f072298978c08aa6c Mon Sep 17 00:00:00 2001 From: Alvar Penning Date: Sat, 11 Mar 2023 12:23:24 +0100 Subject: [PATCH] nixos/restic: generalize cache configuration The restic repository cache location defaults to ~/.cache/restic when not overwritten either by the --cache-dir command line parameter or the universal RESTIC_CACHE_DIR environment variable. Currently, the --cache-dir variable is set to only some restic commands, but, e.g., not to the unit's preStart command for the module's initialize option. This results in two distinct cache locations, one at ~/.cache/restic for the initialize commands and one at the configured --cache-dir location for the restic backup command. By explicitly setting RESTIC_CACHE_DIR for the unit, only one cache at the correct location will be used. https://restic.readthedocs.io/en/v0.15.1/manual_rest.html#caching --- nixos/modules/services/backup/restic.nix | 7 ++++--- nixos/tests/restic.nix | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/nixos/modules/services/backup/restic.nix b/nixos/modules/services/backup/restic.nix index bc24e13aa050..ca796cf7797e 100644 --- a/nixos/modules/services/backup/restic.nix +++ b/nixos/modules/services/backup/restic.nix @@ -303,8 +303,8 @@ in then if (backup.paths != null) then concatStringsSep " " backup.paths else "" else "--files-from ${filesFromTmpFile}"; pruneCmd = optionals (builtins.length backup.pruneOpts > 0) [ - (resticCmd + " forget --prune --cache-dir=%C/restic-backups-${name} " + (concatStringsSep " " backup.pruneOpts)) - (resticCmd + " check --cache-dir=%C/restic-backups-${name} " + (concatStringsSep " " backup.checkOpts)) + (resticCmd + " forget --prune " + (concatStringsSep " " backup.pruneOpts)) + (resticCmd + " check " + (concatStringsSep " " backup.checkOpts)) ]; # Helper functions for rclone remotes rcloneRemoteName = builtins.elemAt (splitString ":" backup.repository) 1; @@ -314,6 +314,7 @@ in in nameValuePair "restic-backups-${name}" ({ environment = { + RESTIC_CACHE_DIR = "%C/restic-backups-${name}"; RESTIC_PASSWORD_FILE = backup.passwordFile; RESTIC_REPOSITORY = backup.repository; RESTIC_REPOSITORY_FILE = backup.repositoryFile; @@ -332,7 +333,7 @@ in restartIfChanged = false; serviceConfig = { Type = "oneshot"; - ExecStart = (optionals (backupPaths != "") [ "${resticCmd} backup --cache-dir=%C/restic-backups-${name} ${concatStringsSep " " (backup.extraBackupArgs ++ excludeFlags)} ${backupPaths}" ]) + ExecStart = (optionals (backupPaths != "") [ "${resticCmd} backup ${concatStringsSep " " (backup.extraBackupArgs ++ excludeFlags)} ${backupPaths}" ]) ++ pruneCmd; User = backup.user; RuntimeDirectory = "restic-backups-${name}"; diff --git a/nixos/tests/restic.nix b/nixos/tests/restic.nix index 42af0783863e..1071fbada74f 100644 --- a/nixos/tests/restic.nix +++ b/nixos/tests/restic.nix @@ -100,7 +100,7 @@ import ./make-test-python.nix ( "${pkgs.restic}/bin/restic -r ${remoteRepository} -p ${passwordFile} snapshots", '${pkgs.restic}/bin/restic -r ${remoteFromFileRepository} -p ${passwordFile} snapshots"', "${pkgs.restic}/bin/restic -r ${rcloneRepository} -p ${passwordFile} snapshots", - "grep 'backup .* /opt' /tmp/fake-restic.log", + "grep 'backup.* /opt' /tmp/fake-restic.log", ) server.succeed( # set up @@ -129,8 +129,8 @@ import ./make-test-python.nix ( # test that custompackage runs both `restic backup` and `restic check` with reasonable commandlines "systemctl start restic-backups-custompackage.service", - "grep 'backup .* /opt' /tmp/fake-restic.log", - "grep 'check .* --some-check-option' /tmp/fake-restic.log", + "grep 'backup.* /opt' /tmp/fake-restic.log", + "grep 'check.* --some-check-option' /tmp/fake-restic.log", # test that we can create four snapshots in remotebackup and rclonebackup "timedatectl set-time '2017-12-13 13:45'",