blob: 30fb9e43b5cf7efa4db99474d327dcc51b100485 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
{ pkgs, config, ... }:
let
syncJobs = [
{
name = "movies";
source = "/data/media/movies/";
destination = "/volume1/media/movies/";
}
{
name = "videos";
source = "/data/media/videos/";
destination = "/volume1/media/videos/";
}
];
remoteHost = "192.168.1.68";
remoteUser = "nas";
in
{
age.secrets.rsync-ssh-key.file = ../secrets/rsync-ssh-nas.age;
systemd.timers = pkgs.lib.listToAttrs (
map (job: {
name = "rsync-backup-${job.name}";
value = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "daily";
Persistent = true;
RandomizedDelaySec = "1h";
};
};
}) syncJobs
);
systemd.services = pkgs.lib.listToAttrs (
map (job: {
name = "rsync-backup-${job.name}";
value = {
description = "Rsync backup for ${job.name}";
serviceConfig = {
Type = "oneshot";
DynamicUser = true;
LoadCredential = "ssh-key:${config.age.secrets.rsync-ssh-key.path}";
PrivateTmp = true;
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = true;
ExecStart = pkgs.writeShellScript "rsync-backup-${job.name}" ''
${pkgs.rsync}/bin/rsync \
-avz \
-e "${pkgs.openssh}/bin/ssh -i ''${CREDENTIALS_DIRECTORY}/ssh-key -o StrictHostKeyChecking=accept-new" \
${job.source} \
${remoteUser}@${remoteHost}:${job.destination}
'';
};
};
}) syncJobs
);
}
|