85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, pkgs, lib, ... }:
 | 
						|
{
 | 
						|
  services.restic.backups = let
 | 
						|
    localJob = name: paths: {
 | 
						|
      inherit paths;
 | 
						|
      repository = "/mnt/feal-syn1/backup/challenger/${name}";
 | 
						|
      passwordFile = config.sops.secrets."restic/${name}".path;
 | 
						|
      initialize = true;
 | 
						|
      pruneOpts = [
 | 
						|
        "--keep-daily 7"
 | 
						|
        "--keep-weekly 4"
 | 
						|
        "--keep-monthly 3"
 | 
						|
        "--keep-yearly 10"
 | 
						|
      ];
 | 
						|
    };
 | 
						|
    cloudJob = name: paths: {
 | 
						|
      inherit paths;
 | 
						|
      # "rsyncnet" connection details specified in /root/.ssh/config
 | 
						|
      repository = "sftp://rsyncnet/restic/challenger/${name}";
 | 
						|
      passwordFile = config.sops.secrets."restic/${name}".path;
 | 
						|
      initialize = true;
 | 
						|
      pruneOpts = [
 | 
						|
        # rsync.net keeps daily snapshots
 | 
						|
        "--keep-weekly 4"
 | 
						|
        "--keep-monthly 36"
 | 
						|
      ];
 | 
						|
    };
 | 
						|
  in {
 | 
						|
 | 
						|
    # Calibre metadata and config
 | 
						|
    calibre = localJob "calibre" [
 | 
						|
      "/var/lib/calibre-web"
 | 
						|
      "/var/lib/calibre-server"
 | 
						|
    ];
 | 
						|
 | 
						|
    # Other system backups (NB: Large!)
 | 
						|
    hostBackups = localJob "hostBackups" [
 | 
						|
      "/tank/backup"
 | 
						|
    ] // {
 | 
						|
      pruneOpts = [ "--keep-monthly 12" ];
 | 
						|
    };
 | 
						|
 | 
						|
    media = localJob "media" [
 | 
						|
      "/tank/media/books"
 | 
						|
      "/tank/media/komga"
 | 
						|
      "/tank/media/music"
 | 
						|
    ];
 | 
						|
    media-remote = cloudJob "media" [
 | 
						|
      "/tank/media/books"
 | 
						|
      "/tank/media/komga"
 | 
						|
      "/tank/media/music"
 | 
						|
    ] // {
 | 
						|
      pruneOpts = [ "--keep-monthly 12" ];
 | 
						|
    };
 | 
						|
 | 
						|
    # Nextcloud config and data
 | 
						|
    nextcloud = localJob "nextcloud" [ "/tank/nextcloud" ];
 | 
						|
    nextcloud-remote = cloudJob "nextcloud" [ "/tank/nextcloud" ];
 | 
						|
 | 
						|
    # Postgresql databases
 | 
						|
    postgres = (localJob "postgres" [ "/var/backup/postgres" ]) // {
 | 
						|
      timerConfig.OnCalendar = "05:15"; # 2h after postgresqlBackup
 | 
						|
    };
 | 
						|
    postgres-remote = (cloudJob "postgres" [ "/var/backup/postgres" ]) // {
 | 
						|
      timerConfig.OnCalendar = "05:15"; # 2h after postgresqlBackup
 | 
						|
    };
 | 
						|
 | 
						|
    # Transmission metadata/config
 | 
						|
    transmission = localJob "transmission" [ "/var/lib/transmission" ];
 | 
						|
 | 
						|
    # TODO: timemachine
 | 
						|
  };
 | 
						|
 | 
						|
  sops.secrets."restic/calibre" = { };
 | 
						|
  sops.secrets."restic/hostBackups" = { };
 | 
						|
  sops.secrets."restic/media" = { };
 | 
						|
  sops.secrets."restic/nextcloud" = { };
 | 
						|
  sops.secrets."restic/postgres" = { };
 | 
						|
  sops.secrets."restic/transmission" = { };
 | 
						|
 | 
						|
  environment.systemPackages = with pkgs; [
 | 
						|
    restic
 | 
						|
  ];
 | 
						|
}
 |