From 791c61aa9478cdc065f87904adf41f2537df85f5 Mon Sep 17 00:00:00 2001 From: m3tam3re Date: Wed, 5 Jul 2023 15:05:59 +0200 Subject: [PATCH] backup timer lkk-nix-1 --- hosts/common/base/default.nix | 2 +- hosts/lkk-nix-1/services/backup.nix | 86 ++++++++++++++++++++++++++++ hosts/lkk-nix-1/services/default.nix | 1 + 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 hosts/lkk-nix-1/services/backup.nix diff --git a/hosts/common/base/default.nix b/hosts/common/base/default.nix index 5fbc563..1cea47c 100644 --- a/hosts/common/base/default.nix +++ b/hosts/common/base/default.nix @@ -7,5 +7,5 @@ users.defaultUserShell = pkgs.fish; environment.systemPackages = - [ inputs.agenix.packages.x86_64-linux.default pkgs.coreutils ]; + [ inputs.agenix.packages.x86_64-linux.default pkgs.coreutils pkgs.fd ]; } diff --git a/hosts/lkk-nix-1/services/backup.nix b/hosts/lkk-nix-1/services/backup.nix new file mode 100644 index 0000000..dbbd21e --- /dev/null +++ b/hosts/lkk-nix-1/services/backup.nix @@ -0,0 +1,86 @@ +{ pkgs, ... }: { + + systemd = { + timers.backup-timer = { + wantedBy = [ "timers.target" ]; + partOf = [ "backup-timer.service" ]; + timerConfig.OnCalendar = "*-*-* 4:00:00"; + }; + services.backup-timer = { + serviceConfig.Type = "oneshot"; + script = '' + BKG_DIR=/var/backup + + EXCLUDE_APPS=("s3/") + EXCLUDE_VOLUMES=("wireguard_data") + EXCLUDE_CLEANUP=("s3/") + + DAYS=7 # how many days should daily backups be stored + DF=daily # folder name for daily backups + WF=weekly # folder name for weekly backups + MF=monthly # folder name for monthly backups + + MBD=22 # day of month for monthly backup + WBD=3 # weekday for weekly backups + PV=podman-volumes # folder name for podman volumes + + cd $BKG_DIR + PODMAN_VOLUMES=$(podman volume ls --format '{{.Name}}') + # Podman volume backup + if [ ! -d $PV ]; then + mkdir $PV + fi + for vol in $PODMAN_VOLUMES; do + if [[ " $\{EXCLUDE_VOLUMES[@]} " =~ " $\{vol} " ]]; then + continue + fi + cd $BKG_DIR/$PV + podman volume export $vol --output $vol.tar ; gzip $vol.tar + done + + BACKUP_APPS=$(fd . -td -d 1 $BKG_DIR) + # App backup + for bkg in $BACKUP_APPS; do + if [[ " $\{EXCLUDE_APPS[@]} " =~ " $\{bkg} " ]]; then + continue + fi + cd $bkg + #monthly + if [ ! -d $MF ]; then + mkdir $MF + fi + DOM=$(date +%d) + if [ $DOM -eq $MBD ]; then + fd . -tf -d 1 -x cp {/} $MF/$(date +"%Y%m")-{/} + fi + + #weekly + if [ ! -d $WF ]; then + mkdir $WF + fi + DOW=$(date +%u) + if [ $DOW -eq $WBD ]; then + fd . -tf -d 1 -x cp {/} $WF/$(date +"%U%Y")-{/} + fi + + #dailies + if [ ! -d $DF ]; then + mkdir $DF + fi + fd . -tf -d 1 -x mv {/} $DF/$(date +"%Y%m%d")-{/} + done + + # Delete old backups + for bkg in $BACKUP_APPS; do + if [[ " $\{EXCLUDE_CLEANUP[@]} " =~ " $\{bkg} " ]]; then + continue + fi + fd . $bkg"daily" --changed-before "$DAYS days" -x rm + fd . $bkg"weekly" --changed-before "4 weeks" -x rm + fd . $bkg"monthly" --changed-before "8 weeks" -x rm + done + ''; + }; + }; + +} diff --git a/hosts/lkk-nix-1/services/default.nix b/hosts/lkk-nix-1/services/default.nix index a65b070..4cf7481 100644 --- a/hosts/lkk-nix-1/services/default.nix +++ b/hosts/lkk-nix-1/services/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./backup.nix ./container.nix ./gitea.nix ./invidious.nix