]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - modules/private/system/eldiron.nix
Use zrepl to make zfs backups
[perso/Immae/Config/Nix.git] / modules / private / system / eldiron.nix
index b2a728c1864fa8173c1fbe955491bc5427fa6376..83e52b8989636d50328060d97412329c2bfc0f66 100644 (file)
@@ -1,10 +1,28 @@
 { privateFiles }:
-{ config, pkgs, ... }:
+{ config, pkgs, lib, ... }:
 {
   boot.supportedFilesystems = [ "zfs" ];
+  boot.kernelParams = ["zfs.zfs_arc_max=6442450944"];
   boot.kernelPackages = pkgs.linuxPackages_latest;
   myEnv = import "${privateFiles}/environment.nix" // { inherit privateFiles; };
 
+  fileSystems = {
+    "/"     = lib.mkForce { fsType = "zfs"; device = "zpool/root"; };
+    "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
+    "/etc"  = { fsType = "zfs"; device = "zpool/root/etc"; };
+    "/nix"  = { fsType = "zfs"; device = "zpool/root/nix"; };
+    "/tmp"  = { fsType = "zfs"; device = "zpool/root/tmp"; };
+    "/var"  = { fsType = "zfs"; device = "zpool/root/var"; };
+  };
+  boot.initrd.secrets = {
+    "/boot/pass.key" = "/boot/pass.key";
+  };
+
+  services.zfs = {
+    autoScrub = {
+      enable = true;
+    };
+  };
   networking = {
     hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
     firewall.enable = true;
 
   secrets.keys = [
     {
-      dest = "rsync_backup/identity";
+      dest = "zrepl_backup/identity";
       user = "root";
       group = "root";
       permissions = "0400";
-      text = config.myEnv.rsync_backup.ssh_key.private;
+      text = config.myEnv.zrepl_backup.ssh_key.private;
     }
   ];
   programs.ssh.knownHosts.dilion = {
     mailto = "cron@immae.eu";
     systemCronJobs = [
       ''
-        # The star after /var/lib/* avoids deleting all folders in case of problem
-        0 3,9,15,21 * * * root rsync -e "ssh -i /var/secrets/rsync_backup/identity" --new-compress -aAXv --delete --numeric-ids --super --rsync-path="sudo rsync" /var/lib/* backup@dilion.immae.eu: > /dev/null
         0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
         # Need a way to blacklist properly
         # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
   };
   environment.systemPackages = [ pkgs.bindfs ];
 
+  services.zrepl = {
+    enable = true;
+    config = let
+      redis_dump = pkgs.writeScript "redis-dump" ''
+        #! ${pkgs.stdenv.shell}
+        ${pkgs.redis}/bin/redis-cli bgsave
+      '';
+    in ''
+      jobs:
+        - type: push
+          # must not change
+          name: "backup-to-dilion"
+          filesystems:
+            "zpool/root": true
+            "zpool/root/etc": true
+            "zpool/root/var<": true
+          connect:
+            type: ssh+stdinserver
+            host: dilion.immae.eu
+            user: backup
+            port: 22
+            identity_file: ${config.secrets.fullPaths."zrepl_backup/identity"}
+          snapshotting:
+            type: periodic
+            prefix: zrepl_
+            interval: 15m
+            hooks:
+              - type: mysql-lock-tables
+                dsn: "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/"
+                filesystems:
+                  "zpool/root/var": true
+              - type: command
+                path: ${redis_dump}
+                err_is_fatal: false
+                filesystems:
+                  "zpool/root/var": true
+          send:
+            encrypted: true
+          pruning:
+            keep_sender:
+              - type: not_replicated
+              - type: regex
+                regex: "^manual_.*"
+              - type: grid
+                grid: 1x1h(keep=all) | 24x1h | 7x1d | 4x7d | 6x30d
+                regex: "^zrepl_.*"
+            keep_receiver:
+              - type: regex
+                regex: "^manual_.*"
+              - type: grid
+                grid: 1x1h(keep=all) | 24x1h | 7x1d | 4x7d | 6x30d
+                regex: "^zrepl_.*"
+    '';
+  };
   # This value determines the NixOS release with which your system is
   # to be compatible, in order to avoid breaking some software such as
   # database servers. You should change this only after NixOS release