{ config, pkgs, ... }: { # For each instance, a service and timer will be created: # systemctl list-unit-files | grep btrbk # #=> btrbk-.service # #=> btrbk-.timer # # If onCalendar is set to null, one can manually execute btrbk with # sudo systemctl start btrbk-.service # Print generated systemd unit file # cat "$(systemctl show -P FragmentPath btrbk-.service)" # TODO: Maybe the following is not necessary if using hd-idle anyways (!) # TODO: Mount/Unmount backup drive # Example1: # - https://github.com/oxalica/nixos-config/blob/1b18628afda9cecca0bc8c348b91e3ae6ab56905/nixos/invar/btrbk.nix#L55 # - https://github.com/oxalica/nixos-config/blob/1b18628afda9cecca0bc8c348b91e3ae6ab56905/nixos/invar/btrbk.nix#L64 # Example2: # - https://github.com/emmanuelrosa/erosanix/blob/master/modules/btrbk.nix#L35-L42C7 # Spin down (unmounted/inactive) HDD disk. # Inspired by https://www.reddit.com/r/NixOS/comments/751i5t/comment/do3f3l7/ # # environment.systemPackages = with pkgs; [ # hd-idle # ]; # systemd.services.hd-idle = { # description = "Spin down inactive HDD"; # wantedBy = [ "multi-user.target" ]; # serviceConfig = { # Type = "simple"; # # Options: # # -a : Select disk for subsequent parameters. # # -i 180: Spin down after 2 minutes (180 seconds) of inactivity. # ExecStart = "${pkgs.hd-idle}/bin/hd-idle -a /dev/disk/by-id/XXX-XXX-XXX -i 180"; # TODO make disk id configurable # }; # }; services.btrbk = { extraPackages = [ pkgs.lz4 ]; # Lowest scheduling priority. niceness = 19; # Set of btrbk instances. The instance named btrbk is the default one. instances = { # # This is the configuration equivalent to # # README.md section "Testing on Local Host". # "testing-on-local-host" = { # # The timer is disabled. The service has to be invoked manually. # onCalendar = null; # #onCalendar = "hourly"; # #onCalendar = "*:0/15"; # Every 15min # # Configuration options for btrbk. Nested attrsets translate to subsections. # settings = { # timestamp_format = "long"; # stream_compress = "lz4"; # # snapshot_preserve_min = "2d"; # snapshot_preserve = "24h 7d 4w 6m"; # # target_preserve_min = "no"; # target_preserve = "7d 4w 6m"; # # volume."/mnt/top-level" = { # snapshot_dir = "@snap"; # target = "/mnt/usb-top-level/@snap"; # subvolume = "@foo"; # }; # }; # }; "local-snapshots" = { onCalendar = "hourly"; #onCalendar = "*:0/15"; # Every 15min settings = { timestamp_format = "long"; stream_compress = "lz4"; snapshot_preserve_min = "2d"; snapshot_preserve = "24h 7d 4w 6m"; volume."/mnt/data/data" = { snapshot_dir = "/mnt/data/snap"; subvolume = { "arch.p1st.de" = {}; "blogger.privacy1st.de" = {}; "changedetection.p1st.de" = {}; "cloud.media-kollektiv.eu" = {}; "cloud.privacy1st.de" = {}; "git.privacy1st.de" = {}; #"mastodon-toot-follower.privacy1st.de" = {}; "money.p1st.de" = {}; "music.privacy1st.de" = {}; #"paste.p1st.de" = {}; "proxy" = {}; "recipe.privacy1st.de" = {}; "traggo.privacy1st.de" = {}; }; }; }; }; }; }; }