2022-02-19 08:58:08 +00:00
|
|
|
# This is my external hard drive with the backup setup with borg.
|
|
|
|
{ config, options, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
2022-03-31 05:59:54 +00:00
|
|
|
cfg = config.tasks.backup-archive;
|
2022-02-19 08:58:08 +00:00
|
|
|
|
|
|
|
borgJobCommonSetting = { patterns ? [ ] }: {
|
|
|
|
compression = "zstd,9";
|
|
|
|
dateFormat = "+%F-%H-%M-%S-%z";
|
|
|
|
doInit = true;
|
|
|
|
encryption = {
|
|
|
|
mode = "repokey-blake2";
|
|
|
|
passCommand = "cat ${config.age.secrets.borg-password.path}";
|
|
|
|
};
|
|
|
|
extraCreateArgs = lib.concatStringsSep " "
|
|
|
|
(builtins.map (patternFile: "--patterns-from ${patternFile}") patterns);
|
|
|
|
extraInitArgs = "--make-parent-dirs";
|
|
|
|
|
|
|
|
# We're emptying them since we're specifying them all through the patterns file.
|
|
|
|
paths = [ ];
|
|
|
|
|
|
|
|
persistentTimer = true;
|
|
|
|
preHook = ''
|
|
|
|
extraCreateArgs="$extraCreateArgs --exclude-if-present .nobackup"
|
|
|
|
extraCreateArgs="$extraCreateArgs --stats"
|
|
|
|
'';
|
|
|
|
prune = {
|
|
|
|
keep = {
|
|
|
|
within = "1d";
|
|
|
|
hourly = 8;
|
|
|
|
daily = 30;
|
|
|
|
weekly = 4;
|
|
|
|
monthly = 6;
|
|
|
|
yearly = 3;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
in {
|
2022-03-31 05:59:54 +00:00
|
|
|
options.tasks.backup-archive.enable =
|
2022-02-19 08:58:08 +00:00
|
|
|
lib.mkEnableOption "backup setup with BorgBackup";
|
|
|
|
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
|
|
assertions = [{
|
|
|
|
assertion = config.profiles.agenix.enable;
|
|
|
|
message = ''
|
|
|
|
Agenix module is not enabled. This is for the borgmatic configuration
|
|
|
|
we're using.
|
|
|
|
'';
|
|
|
|
}];
|
|
|
|
|
|
|
|
age.secrets.borg-password.file = lib.getSecret "archive/password";
|
|
|
|
age.secrets.borg-patterns.file = lib.getSecret "archive/borg-patterns";
|
|
|
|
age.secrets.borg-patterns-local.file =
|
|
|
|
lib.getSecret "archive/borg-patterns-local";
|
|
|
|
age.secrets.borg-ssh-key.file = lib.getSecret "archive/borg-ssh-key";
|
|
|
|
|
|
|
|
fileSystems."/mnt/external-storage" = {
|
|
|
|
device = "/dev/disk/by-uuid/665A391C5A38EB07";
|
|
|
|
fsType = "ntfs";
|
|
|
|
noCheck = true;
|
|
|
|
options = [
|
|
|
|
"nofail"
|
|
|
|
"noauto"
|
|
|
|
"user"
|
|
|
|
|
|
|
|
# See systemd.mount.5 and systemd.automount.5 manual page for more
|
|
|
|
# details.
|
|
|
|
"x-systemd.automount"
|
|
|
|
"x-systemd.device-timeout=2"
|
|
|
|
"x-systemd.idle-timeout=2"
|
|
|
|
];
|
|
|
|
};
|
|
|
|
|
|
|
|
services.borgbackup.jobs = {
|
|
|
|
local = borgJobCommonSetting {
|
|
|
|
patterns = [
|
|
|
|
config.age.secrets.borg-patterns-local.path
|
|
|
|
config.age.secrets.borg-patterns.path
|
|
|
|
];
|
|
|
|
} // {
|
|
|
|
doInit = true;
|
2022-03-31 05:59:54 +00:00
|
|
|
repo = "/archives/backups";
|
2022-02-19 08:58:08 +00:00
|
|
|
startAt = "04/5:00:00";
|
|
|
|
};
|
|
|
|
|
|
|
|
local-archive = borgJobCommonSetting {
|
|
|
|
patterns = [
|
|
|
|
config.age.secrets.borg-patterns-local.path
|
|
|
|
config.age.secrets.borg-patterns.path
|
|
|
|
];
|
|
|
|
} // {
|
|
|
|
doInit = false;
|
|
|
|
removableDevice = true;
|
|
|
|
repo = "/mnt/external-storage/backups";
|
|
|
|
startAt = "daily";
|
|
|
|
};
|
|
|
|
|
|
|
|
remote-borgbase = borgJobCommonSetting {
|
|
|
|
patterns = [ config.age.secrets.borg-patterns.path ];
|
|
|
|
} // {
|
|
|
|
doInit = false;
|
|
|
|
repo = "m9s7d92s@m9s7d92s.repo.borgbase.com:repo";
|
|
|
|
startAt = "daily";
|
|
|
|
environment.BORG_RSH = "ssh -i ${config.age.secrets.borg-ssh-key.path}";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
programs.ssh.extraConfig = ''
|
|
|
|
Host *.repo.borgbase.com
|
|
|
|
IdentityFile ${config.age.secrets.borg-ssh-key.path}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
}
|