diff --git a/nixos/modules/services/backup/borgbackup.nix b/nixos/modules/services/backup/borgbackup.nix
index 6804055a2940..2c307a701f3e 100644
--- a/nixos/modules/services/backup/borgbackup.nix
+++ b/nixos/modules/services/backup/borgbackup.nix
@@ -99,7 +99,18 @@ let
BORG_REPO = cfg.repo;
inherit (cfg) extraArgs extraInitArgs extraCreateArgs extraPruneArgs;
} // (mkPassEnv cfg) // cfg.environment;
- inherit (cfg) startAt;
+ };
+
+ mkBackupTimers = name: cfg:
+ nameValuePair "borgbackup-job-${name}" {
+ description = "BorgBackup job ${name} timer";
+ wantedBy = [ "timers.target" ];
+ timerConfig = {
+ Persistent = cfg.persistentTimer;
+ OnCalendar = cfg.startAt;
+ };
+ # if remote-backup wait for network
+ after = optional (cfg.persistentTimer && !isLocalPath cfg.repo) "network-online.target";
};
# utility function around makeWrapper
@@ -321,6 +332,19 @@ in {
'';
};
+ persistentTimer = mkOption {
+ default = false;
+ type = types.bool;
+ example = true;
+ description = literalDocBook ''
+ Set the persistentTimer option for the
+ systemd.timer
+ 5
+ which triggers the backup immediately if the last trigger
+ was missed (e.g. if the system was powered down).
+ '';
+ };
+
user = mkOption {
type = types.str;
description = ''
@@ -695,6 +719,10 @@ in {
# A repo named "foo" is mapped to systemd.services.borgbackup-repo-foo
// mapAttrs' mkRepoService repos;
+ # A job named "foo" is mapped to systemd.timers.borgbackup-job-foo
+ # only generate the timer if interval (startAt) is set
+ systemd.timers = mapAttrs' mkBackupTimers (filterAttrs (_: cfg: cfg.startAt != []) jobs);
+
users = mkMerge (mapAttrsToList mkUsersConfig repos);
environment.systemPackages = with pkgs; [ borgbackup ] ++ (mapAttrsToList mkBorgWrapper jobs);