AquaticOS/modules/services/backup.nix
2026-05-31 19:29:02 -04:00

162 lines
No EOL
5.3 KiB
Nix

{ ... }:
{
flake.modules.nixos.backup =
{ pkgs, config, lib, ... }:
let
aqback-create = pkgs.writeShellScriptBin "aqback-create" ''
${pkgs.borgbackup}/bin/borg create --stats \
${lib.concatStringsSep " " config.aquaticConfig.backup.extra} \
${config.aquaticConfig.backup.repo}::{hostname}-{now} \
${lib.concatStringsSep " " config.aquaticConfig.backup.dirs}
'';
aqback-prune = pkgs.writeShellScriptBin "aqback-prune" ''
${pkgs.borgbackup}/bin/borg prune -s \
--keep-last 4 \
--keep-hourly ${config.aquaticConfig.backup.keep.hourly} \
--keep-daily ${config.aquaticConfig.backup.keep.daily} \
--keep-weekly ${config.aquaticConfig.backup.keep.weekly} \
--keep-monthly ${config.aquaticConfig.backup.keep.monthly} \
--keep-yearly ${config.aquaticConfig.backup.keep.yearly} \
${config.aquaticConfig.backup.repo}
'';
aqback-compact = pkgs.writeShellScriptBin "aqback-compact" ''
${pkgs.borgbackup}/bin/borg compact ${config.aquaticConfig.backup.repo}
'';
notify-backup-failure = pkgs.writeShellScriptBin "notify-backup-failure" ''
${pkgs.curl}/bin/curl -s \
-H "Title: Backup Error" \
-H "Tags: warning" \
-d "${config.networking.hostName} - $1 failed" \
http://192.168.0.80:4351/etc-notifications
'';
in
{
options.aquaticConfig.backup = {
enable = lib.mkEnableOption "Enable Backups";
repo = lib.mkOption {
description = "Where to backup to";
};
dirs = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [];
description = "What to backup";
};
extra = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [];
description = "Extra arguments for backup";
};
frequency = {
create = lib.mkOption {
default="*:0/15";
description = "How often to create a backup";
};
prune = lib.mkOption {
default="0/2:07:0";
description = "How often to prune backups";
};
compact = lib.mkOption {
default="*-*-1,14 01:07:00";
description = "How often compact backups";
};
};
keep = {
hourly = lib.mkOption {
default="24";
description = "How many hourly backups to keep";
};
daily = lib.mkOption {
default="7";
description = "How many daily backups to keep";
};
weekly = lib.mkOption {
default="4";
description = "How many weekly backups to keep";
};
monthly = lib.mkOption {
default="6";
description = "How many monthly backups to keep";
};
yearly = lib.mkOption {
default="3";
description = "How many yearly backups to keep";
};
};
};
config = {
environment.systemPackages = [
aqback-create
aqback-prune
aqback-compact
pkgs.borgbackup
];
systemd = {
services = {
backup-create = {
enable = true;
description = "Create a backup";
serviceConfig = {
Type = "simple";
OnFailure = "backup-notify@%n.service";
ExecStart = "${pkgs.util-linux}/bin/flock /var/lock/borg-backup.lock ${aqback-create}/bin/aqback-create";
};
};
backup-prune = {
enable = true;
description = "Prune old backups";
serviceConfig = {
Type = "simple";
OnFailure = "backup-notify@%n.service";
ExecStart = "${pkgs.util-linux}/bin/flock /var/lock/borg-backup.lock ${aqback-prune}/bin/aqback-prune";
};
};
backup-compact = {
enable = true;
description = "Compact backup repo";
serviceConfig = {
Type = "simple";
OnFailure = "backup-notify@%n.service";
ExecStart = "${pkgs.util-linux}/bin/flock /var/lock/borg-backup.lock ${aqback-compact}/bin/aqback-compact";
};
};
"backup-notify@" = {
description = "Notify on backup failure";
serviceConfig = {
Type = "oneshot";
ExecStart = "${notify-backup-failure}/bin/notify-backup-failure %i";
};
};
};
timers = {
backup-create = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "${config.aquaticConfig.backup.frequency.create}";
Persistent=true;
Unit = "backup-create.service";
};
};
backup-prune = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "${config.aquaticConfig.backup.frequency.prune}";
Persistent=true;
Unit = "backup-prune.service";
};
};
backup-compact = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar= "${config.aquaticConfig.backup.frequency.compact}";
Persistent=true;
Unit = "backup-compact.service";
};
};
};
};
};
};
}