- Introduces new modules for cloud, backup, and NFS services - Removes deprecated Caddy and cloudflared configs - Migrate /pool from SSHFS to NFS - Migrate filerun and SnapRAID configurations to cloud only for better modularity
140 lines
3.2 KiB
Nix
140 lines
3.2 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
|
|
let
|
|
# Borg backup destinations
|
|
dockerStorageRepo = "/pool/Backups/DockerStorage";
|
|
forgejoRepo = "/pool/Backups/forgejo";
|
|
|
|
# Common borg backup settings
|
|
borgCommonSettings = ''
|
|
# Don't use cache to avoid issues with concurrent backups
|
|
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
|
|
|
|
# Set this for non-interactive use
|
|
export BORG_NON_INTERACTIVE=yes
|
|
'';
|
|
|
|
# Initialize a repo if it doesn't exist
|
|
initRepo = repo: ''
|
|
if [ ! -d "${repo}" ]; then
|
|
mkdir -p "${repo}"
|
|
${pkgs.borgbackup}/bin/borg init --encryption=none "${repo}"
|
|
fi
|
|
'';
|
|
|
|
in
|
|
{
|
|
# Make sure borg is installed
|
|
environment.systemPackages = [ pkgs.borgbackup ];
|
|
|
|
# Docker Storage Backup Service
|
|
systemd.services.backup-docker-storage = {
|
|
description = "Backup Docker storage directory with Borg";
|
|
|
|
path = with pkgs; [
|
|
borgbackup
|
|
coreutils
|
|
];
|
|
|
|
script = ''
|
|
${borgCommonSettings}
|
|
|
|
# Initialize repository if needed
|
|
${initRepo dockerStorageRepo}
|
|
|
|
# Create backup
|
|
${pkgs.borgbackup}/bin/borg create \
|
|
--stats \
|
|
--compression zstd,15 \
|
|
--exclude '*.tmp' \
|
|
--exclude '*/tmp/*' \
|
|
${dockerStorageRepo}::docker-{now:%Y-%m-%d_%H%M%S} \
|
|
/mnt/drive1/DockerStorage
|
|
|
|
# Prune old backups
|
|
${pkgs.borgbackup}/bin/borg prune \
|
|
--keep-daily 7 \
|
|
--keep-weekly 4 \
|
|
--keep-monthly 3 \
|
|
${dockerStorageRepo}
|
|
'';
|
|
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
IOSchedulingClass = "idle";
|
|
CPUSchedulingPolicy = "idle";
|
|
Nice = 19;
|
|
};
|
|
};
|
|
|
|
# Docker Storage Backup Timer (Weekly on Monday at 4am)
|
|
systemd.timers.backup-docker-storage = {
|
|
description = "Timer for Docker Storage Backup";
|
|
|
|
wantedBy = [ "timers.target" ];
|
|
|
|
timerConfig = {
|
|
OnCalendar = "Mon *-*-* 04:00:00";
|
|
Persistent = true; # Run backup if system was off during scheduled time
|
|
RandomizedDelaySec = "5min"; # Add randomized delay
|
|
};
|
|
};
|
|
|
|
# Forgejo Backup Service
|
|
systemd.services.backup-forgejo = {
|
|
description = "Backup Forgejo directory with Borg";
|
|
|
|
path = with pkgs; [
|
|
borgbackup
|
|
coreutils
|
|
];
|
|
|
|
script = ''
|
|
${borgCommonSettings}
|
|
|
|
# Initialize repository if needed
|
|
${initRepo forgejoRepo}
|
|
|
|
# Create backup
|
|
${pkgs.borgbackup}/bin/borg create \
|
|
--stats \
|
|
--compression zstd,15 \
|
|
--exclude '*.tmp' \
|
|
--exclude '*/tmp/*' \
|
|
${forgejoRepo}::forgejo-{now:%Y-%m-%d_%H%M%S} \
|
|
/pool/forgejo
|
|
|
|
# Prune old backups
|
|
${pkgs.borgbackup}/bin/borg prune \
|
|
--keep-daily 14 \
|
|
--keep-weekly 4 \
|
|
--keep-monthly 3 \
|
|
${forgejoRepo}
|
|
'';
|
|
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
IOSchedulingClass = "idle";
|
|
CPUSchedulingPolicy = "idle";
|
|
Nice = 19;
|
|
};
|
|
};
|
|
|
|
# Forgejo Backup Timer (Every 2 days at 4am)
|
|
systemd.timers.backup-forgejo = {
|
|
description = "Timer for Forgejo Backup";
|
|
|
|
wantedBy = [ "timers.target" ];
|
|
|
|
timerConfig = {
|
|
OnCalendar = "*-*-1/2 04:00:00"; # Every 2 days at 4am
|
|
Persistent = true;
|
|
RandomizedDelaySec = "5min";
|
|
};
|
|
};
|
|
}
|