From 1e9417785d914d4f3934e648d59ba01e1adbfedb Mon Sep 17 00:00:00 2001 From: DACHXY Date: Thu, 24 Apr 2025 16:09:36 +0800 Subject: [PATCH] feat: add nextcloud auto backup --- system/dev/dn-server/boot.nix | 17 ++++++++++ system/dev/dn-server/nextcloud.nix | 52 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/system/dev/dn-server/boot.nix b/system/dev/dn-server/boot.nix index a3463e0..7c878e8 100644 --- a/system/dev/dn-server/boot.nix +++ b/system/dev/dn-server/boot.nix @@ -1,6 +1,23 @@ { pkgs, ... }: { + fileSystems."/mnt/backup_dn" = { + device = "/dev/disk/by-uuid/FBD9-F625"; + fsType = "exfat"; + options = [ + "x-systemd.automount" + "noauto" + "x-systemd.idle-timeout=600" + "nofail" + "user" + "x-gvfs-show" + "gid=1000" + "uid=1000" + "dmask=000" + "fmask=000" + ]; + }; + boot.kernelPackages = pkgs.linuxPackages; boot.loader.systemd-boot.enable = true; diff --git a/system/dev/dn-server/nextcloud.nix b/system/dev/dn-server/nextcloud.nix index 36521fc..69a197d 100644 --- a/system/dev/dn-server/nextcloud.nix +++ b/system/dev/dn-server/nextcloud.nix @@ -96,4 +96,56 @@ environment.systemPackages = with pkgs; [ exiftool ]; + + systemd.timers."nextcloud-backup" = { + enable = true; + description = "Nextcloud backup"; + timerConfig = { + OnCalendar = "*-*-* 03:00:00"; + Persistent = true; + OnUnitActiveSec = "1d"; + AccuracySec = "1h"; + Unit = "nextcloud-backup.service"; + }; + wantedBy = [ "timers.target" ]; + }; + + systemd.services."nextcloud-backup" = { + enable = true; + serviceConfig = { + User = "nextcloud"; + ExecStart = + let + script = pkgs.writeShellScriptBin "backup" '' + nextcloudPath="/var/lib/nextcloud" + mountPoint="/mnt/backup_dn" + nextcloudBakPath="$mountPoint" + nextcloudDBBakPath="$mountPoint/nextcloud-db.bak.tar" + + if [ ! -d "$nextcloudPath" ]; then + echo "nextcloud path not found: $nextcloudPath" + exit 1 + fi + + if [ ! -d "$mountPoint" ]; then + echo "Backup device is not mounted: $mountPoint" + exit 1 + fi + + if [ ! -d "$nextcloudBakPath" ]; then + mkdir -p "$nextcloudBakPath" + fi + + echo "Start syncing..." + ${pkgs.rsync}/bin/rsync -rh --delete "$nextcloudPath" "$nextcloudBakPath" + echo "Data dir backup completed." + + echo "Try backing up database (postgresql)" + ${pkgs.postgresql}/bin/pg_dump -F t nextcloud -f "$nextcloudDBBakPath" + echo "Database backup completed." + ''; + in + "${script}/bin/backup"; + }; + }; }