From 6a62963bf46c75eec5edab9f13a89d5675180e25 Mon Sep 17 00:00:00 2001 From: oqyude Date: Tue, 5 Aug 2025 14:02:22 +0300 Subject: [PATCH] backups int --- modules/essentials/services.nix | 22 +++++++++++++ modules/options.nix | 55 ++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/modules/essentials/services.nix b/modules/essentials/services.nix index 11afd12..0a7395a 100755 --- a/modules/essentials/services.nix +++ b/modules/essentials/services.nix @@ -5,5 +5,27 @@ { services = { tailscale.enable = config.xlib.device.type != "wsl"; # true, if not wsl + systemd = { + services.rsync-archive = lib.mkIf (config.xlib.device.type == "server") { + description = "Backup data using rsync"; + after = [ "network.target" ]; + requiresMountsFor = [ config.xlib.dirs.archive-drive ]; + serviceConfig = { + Type = "oneshot"; + #ExecStartPre = "/bin/sh -c 'if ! mountpoint -q ${config.xlib.dirs.archive-drive}; then exit 1; fi'"; + ExecStart = "${pkgs.rsync}/bin/rsync -av --delete ${config.xlib.dirs.immich-folder} ${config.xlib.dirs.archive-drive}/Services/immich"; + Nice = 19; + IOSchedulingClass = "idle"; + }; + }; + timers.rsync-archive = lib.mkIf (config.xlib.device.type == "server") { + description = "Run rsync backup weekly"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = "weekly"; + Persistent = true; + }; + }; + }; }; } diff --git a/modules/options.nix b/modules/options.nix index 0bf3369..19da64a 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -32,79 +32,98 @@ dirs = { user-home = lib.mkOption { type = lib.types.str; + default = "/home/${config.xlib.device.username}"; description = "User home directory."; }; user-storage = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.user-home}/Storage"; description = "User storage directory."; }; + archive-drive = lib.mkOption { + type = lib.types.str; + default = "/mnt/archive"; + description = "Archive drive mount point."; + }; therima-drive = lib.mkOption { type = lib.types.str; + default = "/mnt/therima"; description = "Therima drive mount point."; }; vetymae-drive = lib.mkOption { type = lib.types.str; + default = "/mnt/vetymae"; description = "Vetymae drive mount point."; }; wsl-home = lib.mkOption { type = lib.types.str; + default = "/mnt/c/Users/${config.xlib.device.username}"; description = "WSL home directory."; }; wsl-storage = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.wsl-home}/Storage"; description = "WSL storage directory."; }; server-home = lib.mkOption { type = lib.types.str; + default = "/home/${config.xlib.device.username}/External"; description = "Server home directory."; }; server-credentials = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Credentials/server"; description = "Server credentials directory."; }; storage = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Storage"; description = "General storage directory."; }; calibre-library = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Books-Library"; description = "Calibre library directory."; }; music-library = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.user-home}/Music"; description = "Music library directory."; }; immich-folder = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Services/immich"; description = "Immich service folder."; }; nextcloud-folder = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Services/nextcloud"; description = "Nextcloud service folder."; }; postgresql-folder = lib.mkOption { type = lib.types.str; + default = "${config.xlib.dirs.server-home}/Services/postgresql"; description = "PostgreSQL service folder."; }; }; }; }; - config = { - xlib.dirs = { - user-home = "/home/${config.xlib.device.username}"; - user-storage = "${config.xlib.dirs.user-home}/Storage"; - therima-drive = "/mnt/therima"; - vetymae-drive = "/mnt/vetymae"; - wsl-home = "/mnt/c/Users/${config.xlib.device.username}"; - wsl-storage = "${config.xlib.dirs.wsl-home}/Storage"; - server-home = "/home/${config.xlib.device.username}/External"; - server-credentials = "${config.xlib.dirs.server-home}/Credentials/server"; - storage = "${config.xlib.dirs.server-home}/Storage"; - calibre-library = "${config.xlib.dirs.server-home}/Books-Library"; - music-library = "${config.xlib.dirs.user-home}/Music"; - immich-folder = "${config.xlib.dirs.server-home}/Services/immich"; - nextcloud-folder = "${config.xlib.dirs.server-home}/Services/nextcloud"; - postgresql-folder = "${config.xlib.dirs.server-home}/Services/postgresql"; - }; - }; + # config = { + # xlib.dirs = { + # user-home = "/home/${config.xlib.device.username}"; + # user-storage = "${config.xlib.dirs.user-home}/Storage"; + # therima-drive = "/mnt/therima"; + # vetymae-drive = "/mnt/vetymae"; + # wsl-home = "/mnt/c/Users/${config.xlib.device.username}"; + # wsl-storage = "${config.xlib.dirs.wsl-home}/Storage"; + # server-home = "/home/${config.xlib.device.username}/External"; + # server-credentials = "${config.xlib.dirs.server-home}/Credentials/server"; + # storage = "${config.xlib.dirs.server-home}/Storage"; + # calibre-library = "${config.xlib.dirs.server-home}/Books-Library"; + # music-library = "${config.xlib.dirs.user-home}/Music"; + # immich-folder = "${config.xlib.dirs.server-home}/Services/immich"; + # nextcloud-folder = "${config.xlib.dirs.server-home}/Services/nextcloud"; + # postgresql-folder = "${config.xlib.dirs.server-home}/Services/postgresql"; + # }; + # }; }