1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-11-24 20:19:45 +01:00
home-manager/modules/services/borgmatic.nix

86 lines
2.2 KiB
Nix
Raw Normal View History

2022-09-25 19:27:04 +02:00
{ config, lib, pkgs, ... }:
with lib;
let
serviceConfig = config.services.borgmatic;
programConfig = config.programs.borgmatic;
in {
meta.maintainers = [ maintainers.DamienCassou ];
options = {
services.borgmatic = {
enable = mkEnableOption "Borgmatic service";
2022-09-25 19:27:04 +02:00
frequency = mkOption {
type = types.str;
default = "hourly";
description = ''
2022-09-25 19:27:04 +02:00
How often to run borgmatic when
`services.borgmatic.enable = true`.
2022-09-25 19:27:04 +02:00
This value is passed to the systemd timer configuration as
the onCalendar option. See
{manpage}`systemd.time(7)`
2022-09-25 19:27:04 +02:00
for more information about the format.
'';
};
};
};
config = mkIf serviceConfig.enable {
assertions = [
(lib.hm.assertions.assertPlatform "services.borgmatic" pkgs
lib.platforms.linux)
];
systemd.user = {
services.borgmatic = {
Unit = {
Description = "borgmatic backup";
# Prevent borgmatic from running unless the machine is
# plugged into power:
ConditionACPower = true;
};
Service = {
Type = "oneshot";
# Lower CPU and I/O priority:
Nice = 19;
CPUSchedulingPolicy = "batch";
IOSchedulingClass = "best-effort";
IOSchedulingPriority = 7;
IOWeight = 100;
Restart = "no";
LogRateLimitIntervalSec = 0;
# Delay start to prevent backups running during boot:
ExecStartPre = "${pkgs.coreutils}/bin/sleep 3m";
2022-09-25 19:27:04 +02:00
ExecStart = ''
${pkgs.systemd}/bin/systemd-inhibit \
--who="borgmatic" \
--what="sleep:shutdown" \
2022-09-25 19:27:04 +02:00
--why="Prevent interrupting scheduled backup" \
${programConfig.package}/bin/borgmatic \
--stats \
--verbosity -1 \
--list \
--syslog-verbosity 1
'';
};
};
timers.borgmatic = {
Unit.Description = "Run borgmatic backup";
Timer = {
OnCalendar = serviceConfig.frequency;
Persistent = true;
RandomizedDelaySec = "10m";
};
Install.WantedBy = [ "timers.target" ];
};
};
};
}