sbc-deploys/modules/btrbk/default.nix

134 lines
3.6 KiB
Nix
Raw Normal View History

2023-05-08 18:43:41 +00:00
{ instances ? [ ], localMountDir ? null, enabled ? true }:
{ config, pkgs, ... }:
let
btrbkPrimary = { subvolumes ? [ ] }: {
snapshot_dir = "@snapshots";
2023-05-08 18:43:41 +00:00
subvolume =
builtins.foldl' (acc: subvol: acc // { ${subvol} = { }; }) { } subvolumes;
};
btrbkSecondary = { targetDir, subvolumes ? [ ] }: {
target = "send-receive ${targetDir}";
subvolume = builtins.foldl'
2023-05-08 18:43:41 +00:00
(acc: subvol:
acc // {
${subvol} = {
snapshot_dir = "@snapshots";
snapshot_preserve_min = "all";
snapshot_create = "no";
};
})
{ }
subvolumes;
};
2023-02-10 01:37:49 +00:00
primary = mountDir: subvolumes: {
snapshot_preserve_min = "2h";
snapshot_preserve = "4h 1d 1w";
transaction_log = "/var/log/btrbk.log";
2023-05-08 18:43:41 +00:00
volume = { "${mountDir}" = btrbkPrimary { inherit subvolumes; }; };
};
2023-02-10 01:37:49 +00:00
secondary = primaryIp: mountDir: subvolumes: {
backend_remote = "btrfs-progs-sudo";
ssh_identity = config.sops.secrets.private_key.path;
ssh_user = "btrbk";
stream_buffer = "512m";
target_preserve = "24h 7d";
target_preserve_min = "24h";
transaction_log = "/var/log/btrbk.log";
volume = {
"ssh://${primaryIp}${mountDir}" = btrbkSecondary {
targetDir = "${mountDir}/@snapshots";
inherit subvolumes;
};
};
};
2023-05-06 19:22:29 +00:00
2023-05-06 20:39:28 +00:00
backup = instances: {
2023-05-06 19:22:29 +00:00
backend_remote = "btrfs-progs-sudo";
ssh_identity = config.sops.secrets.private_key.path;
ssh_user = "btrbk";
2023-06-14 23:37:35 +00:00
# stream_buffer = "512m";
target_preserve = " 2d 10w *m";
target_preserve_min = "1d";
2023-05-06 19:22:29 +00:00
transaction_log = "/var/log/btrbk.log";
2023-05-08 18:43:41 +00:00
volume = builtins.foldl'
(acc:
{ primaryIp, mountDir, name, subvolumes }:
acc // {
"ssh://${primaryIp}${mountDir}" = btrbkSecondary {
targetDir = "${localMountDir}/@snapshots/${name}";
inherit subvolumes;
};
})
{ }
instances;
2023-05-06 19:22:29 +00:00
};
in
{
sops.secrets.private_key = {
format = "yaml";
sopsFile = ../../secrets/btrbk.yaml;
owner = config.users.users.btrbk.name;
group = config.users.users.btrbk.group;
};
2023-05-08 18:43:41 +00:00
environment.systemPackages = with pkgs;
[
btrbk
btrfs-progs
(writeShellScriptBin "restore-snapshot"
(builtins.readFile ./restore-snapshot))
(writeShellScriptBin "restore-all-snapshots"
(builtins.readFile ./restore-all-snapshots))
] ++ (if localMountDir != null then
[
(writeShellScriptBin "make-backup-subdirectories" (builtins.foldl'
(acc:
{ name, ... }: ''
${acc}
mkdir -p ${localMountDir}/@snapshots/${name}'') ""
instances))
]
else
[ ]);
2023-08-22 18:41:54 +00:00
services.btrbk-patched = {
2023-05-14 16:34:10 +00:00
sshAccess = [{
key =
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHTqU3EvTgY5/e9m6YyQWypQPK58t9iPmPnPYAvnODGB asonix@lionheart";
roles = [ "source" "info" "send" ];
}];
extraPackages = with pkgs; [ gzip ];
instances =
if localMountDir == null then
(builtins.foldl'
(acc:
{ primaryIp ? null, mountDir, subvolumes, name ? "btrbk" }:
let
selected =
if primaryIp == null then
(primary mountDir subvolumes)
else
(secondary primaryIp mountDir subvolumes);
in
acc // {
${name} = {
onCalendar = "hourly";
settings = selected;
};
})
{ }
instances)
else if enabled then {
btrbk = {
onCalendar = "hourly";
settings = (backup instances);
2023-05-06 20:39:28 +00:00
};
2023-05-14 16:34:10 +00:00
} else { };
};
}