1
0

modules/backup: Migrate automatic backups to clerie-backup backend

This commit is contained in:
clerie 2025-02-14 13:17:26 +01:00
parent d17c2855ac
commit 61a7d64452

View File

@ -21,18 +21,11 @@ let
) cfg.jobs ) cfg.jobs
); );
backupServiceUnits = listToAttrs (map ({jobName, jobOptions, targetName, targetOptions}: let backupServiceUnits = listToAttrs (map ({jobName, jobOptions, targetName, targetOptions}:
jobPasswordFile = if jobOptions.passwordFile != null then jobOptions.passwordFile else
config.sops.secrets."clerie-backup-job-${jobName}".path;
repoPath = if jobOptions.repoPath == null then "/${config.networking.hostName}/${jobName}" else jobOptions.repoPath;
targetPasswordFile = if targetOptions.passwordFile != null then targetOptions.passwordFile else
config.sops.secrets."clerie-backup-target-${targetName}".path;
targetUsername = if targetOptions.username == null then config.networking.hostName else targetOptions.username;
in
nameValuePair "clerie-backup-${jobName}-${targetName}" { nameValuePair "clerie-backup-${jobName}-${targetName}" {
requires = [ "network.target" "local-fs.target" ]; requires = [ "network.target" "local-fs.target" ];
after = [ "network.target" "local-fs.target" ]; after = [ "network.target" "local-fs.target" ];
path = [ pkgs.restic ]; path = [ pkgs.clerie-backup ];
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
@ -41,14 +34,7 @@ let
script = '' script = ''
set -euo pipefail set -euo pipefail
export RESTIC_PASSWORD_FILE=${jobPasswordFile} clerie-backup "${jobName}-${targetName}" backup
export RESTIC_REPOSITORY="rest:https://${targetUsername}:$(cat ${targetPasswordFile})@${targetOptions.serverName}${repoPath}"
export RESTIC_PROGRESS_FPS=0.1
export RESTIC_CACHE_DIR=/var/cache/restic
restic snapshots --latest 1 || restic init
restic backup ${optionalString (jobOptions.exclude != []) "--exclude-file ${pkgs.writeText "clerie-backup-${jobName}-${targetName}-excludes" (concatStringsSep "\n" jobOptions.exclude)}"} ${escapeShellArgs jobOptions.paths}
${optionalString (config.clerie.monitoring.enable) '' ${optionalString (config.clerie.monitoring.enable) ''
echo "clerie_backup_last_successful_run_time{backup_job=\"${jobName}\", backup_target=\"${targetName}\"} $(date +%s)" > /var/lib/prometheus-node-exporter/textfiles/clerie-backup-${jobName}-${targetName}.prom echo "clerie_backup_last_successful_run_time{backup_job=\"${jobName}\", backup_target=\"${targetName}\"} $(date +%s)" > /var/lib/prometheus-node-exporter/textfiles/clerie-backup-${jobName}-${targetName}.prom
@ -69,32 +55,22 @@ let
} }
) jobTargetPairs); ) jobTargetPairs);
backupCommands = map ({jobName, jobOptions, targetName, targetOptions}: let backupConfigs = mergeAttrsList (map ({jobName, jobOptions, targetName, targetOptions}: let
jobPasswordFile = if jobOptions.passwordFile != null then jobOptions.passwordFile else jobPasswordFile = if jobOptions.passwordFile != null then jobOptions.passwordFile else
config.sops.secrets."clerie-backup-job-${jobName}".path; config.sops.secrets."clerie-backup-job-${jobName}".path;
repoPath = if jobOptions.repoPath == null then "/${config.networking.hostName}/${jobName}" else jobOptions.repoPath; repoPath = if jobOptions.repoPath == null then "/${config.networking.hostName}/${jobName}" else jobOptions.repoPath;
targetPasswordFile = if targetOptions.passwordFile != null then targetOptions.passwordFile else targetPasswordFile = if targetOptions.passwordFile != null then targetOptions.passwordFile else
config.sops.secrets."clerie-backup-target-${targetName}".path; config.sops.secrets."clerie-backup-target-${targetName}".path;
targetUsername = if targetOptions.username == null then config.networking.hostName else targetOptions.username; targetUsername = if targetOptions.username == null then config.networking.hostName else targetOptions.username;
in pkgs.writeShellApplication { in {
name = "clerie-backup-${jobName}-${targetName}"; "clerie-backup/${jobName}-${targetName}/repo_password".source = jobPasswordFile;
"clerie-backup/${jobName}-${targetName}/repo_url".text = "https://${targetOptions.serverName}${repoPath}";
runtimeInputs = [ pkgs.restic ]; "clerie-backup/${jobName}-${targetName}/auth_username".text = targetUsername;
"clerie-backup/${jobName}-${targetName}/auth_password".source = targetPasswordFile;
text = '' "clerie-backup/${jobName}-${targetName}/files".text = concatStringsSep "\n" jobOptions.paths;
set -euo pipefail "clerie-backup/${jobName}-${targetName}/excludes".text = concatStringsSep "\n" jobOptions.exclude;
export RESTIC_PASSWORD_FILE=${jobPasswordFile}
export RESTIC_REPOSITORY="rest:https://${targetUsername}:$(cat ${targetPasswordFile})@${targetOptions.serverName}${repoPath}"
export RESTIC_PROGRESS_FPS=0.1
export RESTIC_CACHE_DIR=/var/cache/restic
restic "$@"
'';
checkPhase = "";
} }
) jobTargetPairs; ) jobTargetPairs);
targetOptions = { ... }: { targetOptions = { ... }: {
options = { options = {
@ -158,6 +134,7 @@ in
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d /var/cache/restic - - - - -" "d /var/cache/restic - - - - -"
]; ];
environment.systemPackages = backupCommands; environment.systemPackages = [ pkgs.clerie-backup ];
environment.etc = backupConfigs;
}; };
} }