diff --git a/flake.lock b/flake.lock index 22afd1f..264be08 100644 --- a/flake.lock +++ b/flake.lock @@ -406,11 +406,11 @@ }, "nixunstable": { "locked": { - "lastModified": 1705856552, - "narHash": "sha256-JXfnuEf5Yd6bhMs/uvM67/joxYKoysyE3M2k6T3eWbg=", + "lastModified": 1707092692, + "narHash": "sha256-ZbHsm+mGk/izkWtT4xwwqz38fdlwu7nUUKXTOmm4SyE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "612f97239e2cc474c13c9dafa0df378058c5ad8d", + "rev": "faf912b086576fd1a15fca610166c98d47bc667e", "type": "github" }, "original": { diff --git a/hosts/myself/container-git.nix b/hosts/myself/container-git.nix index 364ab5c..b822573 100644 --- a/hosts/myself/container-git.nix +++ b/hosts/myself/container-git.nix @@ -8,6 +8,7 @@ in { inputs.agenix.nixosModules.default ../../modules/linux/proxy.nix ../../modules/linux/tailscale.nix + ../../modules/linux/backup.nix ]; age.identityPaths = [ "/etc/ssh/ssh_host_ed25519_key" ]; @@ -42,6 +43,19 @@ in { virtualisation.docker.enable = true; + programs.ssh.extraConfig = lib.strings.concatStringsSep "\n" [ + "Host nas" + " User backup" + " IdentityFile /etc/ssh/duplicity_ed25519" + " StrictHostKeyChecking no" + " UserKnownHostsFile /dev/null" + ]; + + greg.backup.jobs.nas-backup = { + src = "/var/gitlab/state/backup/"; + dest = "gitlab"; + }; + services = { gitlab = { enable = true; diff --git a/modules/linux/backup.nix b/modules/linux/backup.nix index 15346e2..951b908 100644 --- a/modules/linux/backup.nix +++ b/modules/linux/backup.nix @@ -2,46 +2,24 @@ let cfg = config.greg.backup; - backup_key = "backup_keys/id_ed25519"; - makeJob = name: job: { - paths = job.src; - encryption.mode = "none"; - environment.BORG_RSH = "ssh -i /etc/${backup_key} -o 'StrictHostKeyChecking=no' -o 'UserKnownHostsFile=/dev/null'"; - repo = "ssh://backup@nas.me.ts//volume1/NetBackup/${job.dest}"; - compression = "auto,zstd"; - startAt = "daily"; - - user = job.user; - group = job.group; - preHook = job.pre; - postHook = job.post; + makeTimer = name: job: { + timerConfig.OnCalendar = "daily"; + wantedBy = [ "timers.target" ]; }; - cronJob = name: job: - let - binName = "backup-${name}"; - script = pkgs.writeShellScriptBin binName '' -exec 1> >(systemd-cat -t $(basename $0)) 2>&1 -set -ex -${job.pre} -${pkgs.rsync}/bin/rsync -avz --delete -e "${pkgs.openssh}/bin/ssh -i /etc/${backup_key} -o 'StrictHostKeyChecking=no' -o 'UserKnownHostsFile=/dev/null'" ${job.src}/* backup@chronicles:/volume1/NetBackup/${job.dest}/ -${job.post} -''; - in { - inherit script; - cron = "0 1 * * * ${job.user} ${script}/bin/${binName}"; + makeService = name: job: { + serviceConfig = { + User = job.user; + ExecPre = lib.optionalString (job.pre != "") job.pre; + ExecStart = "${pkgs.rsync}/bin/rsync -avz --delete -e '${pkgs.openssh}/bin/ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null' ${job.src}/ backup@nas:/volume1/NetBackup/${job.dest}"; + ExecPost = lib.optionalString (job.post != "") job.post; + }; }; in with lib; { options = { greg.backup = { - key = mkOption { - type = types.path; - description = "SSH key to use"; - default = ../ssh/id_ed25519; - }; - jobs = mkOption { default = {}; @@ -82,15 +60,11 @@ in with lib; { }; }; - config = let - jobs = attrValues ( mapAttrs cronJob cfg.jobs ); - in mkIf ( ( attrValues cfg.jobs ) != [] ) + config = mkIf ( ( attrValues cfg.jobs ) != [] ) { - services.cron = { - enable = true; - systemCronJobs = map (e: e.cron) jobs; + systemd = { + timers = mapAttrs makeTimer cfg.jobs; + services = mapAttrs makeService cfg.jobs; }; - - environment.systemPackages = map (e: e.script) jobs; }; }