diff --git a/common/binary-cache-server.nix b/common/binary-cache-server.nix index 02c9d59..06add65 100644 --- a/common/binary-cache-server.nix +++ b/common/binary-cache-server.nix @@ -19,6 +19,8 @@ enable = true; cache = { hostName = config.networking.hostName; + # NOTE: These paths are hardcoded to /persist (not using config.custom.impermanence.persistPath) + # This is acceptable since this service is only enabled on btrfs-based hosts dataPath = "/persist/ncps/data"; tempPath = "/persist/ncps/tmp"; databaseURL = "sqlite:/persist/ncps/db/db.sqlite"; diff --git a/common/global/backup.nix b/common/global/backup.nix index 0e428e3..c7e2853 100644 --- a/common/global/backup.nix +++ b/common/global/backup.nix @@ -6,8 +6,7 @@ let btrfs = "${btrfsPkg}/bin/btrfs"; snapshotBackup = pkgs.writeScript "kopia-snapshot-backup" (builtins.readFile ./kopia-snapshot-backup.sh); backupScript = pkgs.writeShellScript "backup-persist" '' - target_path="/persist" - snapshot_path="$target_path/kopia-backup-snapshot" + target_path="${config.custom.impermanence.persistPath}" KOPIA_CHECK_FOR_UPDATES=false ${kopia} repository connect server \ @@ -16,18 +15,29 @@ let -p "$(cat ${config.sops.secrets.kopia.path})" \ || exit 1 - [ -e "$snapshot_path" ] && ${btrfs} subvolume delete "$snapshot_path" + # Check if target_path is on btrfs filesystem + fs_type=$(stat -f -c %T "$target_path") - ${btrfs} subvolume snapshot -r "$target_path" "$snapshot_path" + if [ "$fs_type" = "btrfs" ]; then + # On btrfs: use snapshot for consistency + snapshot_path="$target_path/kopia-backup-snapshot" + [ -e "$snapshot_path" ] && ${btrfs} subvolume delete "$snapshot_path" + ${btrfs} subvolume snapshot -r "$target_path" "$snapshot_path" - # --no-send-snapshot-path due to https://github.com/kopia/kopia/issues/4402 - # Exclude btrfs replication snapshots (they appear as empty dirs in the snapshot anyway) - ${kopia} snapshot create --no-send-snapshot-report --override-source "$target_path" \ - --ignore "services@*" \ - --ignore "services-standby/services@*" \ - -- "$snapshot_path" + # --no-send-snapshot-path due to https://github.com/kopia/kopia/issues/4402 + # Exclude btrfs replication snapshots (they appear as empty dirs in the snapshot anyway) + ${kopia} snapshot create --no-send-snapshot-report --override-source "$target_path" \ + --ignore "services@*" \ + --ignore "services-standby/services@*" \ + -- "$snapshot_path" + + ${btrfs} subvolume delete "$snapshot_path" + else + # On non-btrfs (e.g., ext4): backup directly without snapshot + ${kopia} snapshot create --no-send-snapshot-report --override-source "$target_path" \ + -- "$target_path" + fi - ${btrfs} subvolume delete "$snapshot_path" ${kopia} repository disconnect ''; in diff --git a/common/global/sops.nix b/common/global/sops.nix index a59e63e..2a42a26 100644 --- a/common/global/sops.nix +++ b/common/global/sops.nix @@ -3,8 +3,8 @@ sops = { # sometimes the impermanence bind mount is stopped when sops needs these age.sshKeyPaths = [ - "/persist/etc/ssh/ssh_host_ed25519_key" - "/persist/etc/ssh/ssh_host_rsa_key" + "${config.custom.impermanence.persistPath}/etc/ssh/ssh_host_ed25519_key" + "${config.custom.impermanence.persistPath}/etc/ssh/ssh_host_rsa_key" ]; defaultSopsFile = ./../../secrets/common.yaml; secrets = {