many improvements
This commit is contained in:
88
modules/nixos/backup.nix
Normal file
88
modules/nixos/backup.nix
Normal file
@@ -0,0 +1,88 @@
|
||||
{pkgs, lib, ...}:
|
||||
let
|
||||
snapshotsDir = "/snapshots/home";
|
||||
in
|
||||
{
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
restic
|
||||
btrbk
|
||||
libnotify
|
||||
];
|
||||
|
||||
|
||||
# btrbk systemd service and timer for daily home snapshots
|
||||
systemd.services.btrbk-home-snapshot = {
|
||||
description = "Create daily btrbk snapshot of the home subvolume";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
User = "remy";
|
||||
ExecStartPre = "${lib.getExe pkgs.libnotify} \"Backup\" \"Creating BTRBK snapshot of /home.\"";
|
||||
# run the btrbk command as superuser
|
||||
ExecStart = "+${lib.getExe pkgs.btrbk} -c /etc/btrbk/home.conf run";
|
||||
Environment = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus"; # ensure the notification is sent to the correct display
|
||||
ExecStartPost = "${lib.getExe pkgs.libnotify} \"Backup\" \"Snapshot of /home created successfully.\"";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.btrbk-home-snapshot = {
|
||||
enable = true;
|
||||
description = "Daily timer for btrbk home snapshot";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = "*-*-* 12:00";
|
||||
Persistent = true; # ensures missed runs are triggered after resume
|
||||
};
|
||||
};
|
||||
# ensure the target directory exists
|
||||
systemd.tmpfiles.settings = {
|
||||
"btrbk snapshots" = {
|
||||
"${snapshotsDir}" = {
|
||||
d = {
|
||||
group = "root";
|
||||
user = "root";
|
||||
mode = "0770";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# btrbk config for home snapshots
|
||||
environment.etc."btrbk/home.conf".text = ''
|
||||
timestamp_format long
|
||||
# keep snapshots for 2 days independently of the call
|
||||
snapshot_preserve_min 2d
|
||||
# retain daily snapshots for 14 days
|
||||
snapshot_preserve 14d
|
||||
|
||||
subvolume /home
|
||||
snapshot_dir ${snapshotsDir}
|
||||
'';
|
||||
|
||||
# Now create a restic backup off the newest btrbk snapshot
|
||||
systemd.services.restic-backup-latest-snapshot = {
|
||||
description = "Backup home subvolume using restic";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${lib.getExe pkgs.restic} -r /home/snapshots/restic-backup backup /home/snapshots/home-$(date +%Y-%m-%d_%H-%M-%S)";
|
||||
# send a notification when the service is done
|
||||
ExecStartPost = "su remy -c 'notify-send \"Restic Backup\" \"Home backup created successfully.\"'";
|
||||
};
|
||||
};
|
||||
# # the udev rule:
|
||||
# services.udev.extraRules = ''
|
||||
# ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="backup-restic", TAG+="systemd", ENV{SYSTEMD_WANTS}="backup-restic.service"
|
||||
# '';
|
||||
|
||||
# # the systemd service:
|
||||
# systemd.services.backup-restic = {
|
||||
# description = "Backup using restic (triggered when USB drive is plugged in)";
|
||||
# after = [ "local-fs.target" ];
|
||||
# wantedBy = [ "multi-user.target" ];
|
||||
# serviceConfig = {
|
||||
# Type = "oneshot";
|
||||
# # TODO: adapt command
|
||||
# ExecStart = "${lib.getExe pkgs.restic} backup /home/username";
|
||||
# };
|
||||
# };
|
||||
}
|
Reference in New Issue
Block a user