# This is my external hard drive with the backup setup with borg. { config, options, lib, pkgs, ... }: let cfg = config.tasks.backup-archive; 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 { options.tasks.backup-archive.enable = 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; repo = "/archives/backups"; 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} ''; }; }