The Complete Computer

Secure Backup Infrastructure with Restic

LifeTechEmacsArcology

Layer 1: Syncthing gives me strength in numbers

Anything that I care about flows in to Last Bank and is also persisted on my other laptops to prevent single-machine hardware failure or device loss from affecting me.

Layer 2: Local ZFS Snapshots

ZFS snapshots let me quickly undo any mistakes I make locally, or recover if Syncthing blows away something I care about. NixOS gives me auto-snapshots every fifteen minutes and cleans up old stuff reasonably.

My Basic ZFS Configuration handles this.

Layer 3: Remote Disaster Recovery

We're using restic this time. Off-site backups are sent to Backblaze B2 which is decently affordable to store, don't charge for inbound bandwidth, and will mail you a disk with a snapshot if you ask for it.

nix source: :tangle ~/arroyo-nix/nixos/restic.nix
{ pkgs, lib, config, ... }: let enableLocalRules = config.services.restic_local_backups.enable; reportingSpf = 300; mkBackup = overrides: lib.mkIf (overrides.local && enableLocalRules) ({ initialize = true; timerConfig = { OnCalendar = "00:00"; RandomizedDelaySec = "2h"; }; passwordFile = "/root/restic-password"; environmentFile = "/root/restic-env"; pruneOpts = [ "--keep-daily 7" "--keep-weekly 5" "--keep-monthly 12" "--keep-yearly 75" ]; } // (builtins.removeAttrs overrides ["local"])); in { options = with lib; { # services.restic_local_backups.enable = mkEnableOption { # name = "restic local disk backup jobs"; # }; services.restic_local_backups.enable = mkOption { description = "Whether to enable restic local disk backup jobs"; # default true default = true; type = lib.types.bool; }; }; config = { # services.restic.backups.tank_media = mkBackup { # repository = "b2:restic-last-bank:media"; # paths = ["/media"]; # }; services.restic.backups.tank_srv = mkBackup { # local = false; repository = "b2:restic-last-bank:srv"; paths = ["/srv"]; timerConfig.OnCalendar = "03:00"; }; services.restic.backups.tank_home = mkBackup { local = false; repository = "b2:restic-last-bank:home"; paths = ["/home"]; timerConfig.OnCalendar = "05:00"; }; # TV, movies, media, backed up w/ rsync instead of restic services.restic.backups.local_media_personal = mkBackup { local = true; repository = "/media/enc/media_personal"; paths = ["/media/landfill" "/media/pictures" "/media/org"]; timerConfig = {}; }; services.restic.backups.local_srv = mkBackup { # local = true; repository = "/media/enc/srv"; paths = ["/srv"]; timerConfig = {}; }; services.restic.backups.local_home = mkBackup { local = true; repository = "/media/enc/home"; paths = ["/home"]; timerConfig = {}; }; }; }

restic · Backups done right!

Restic is a modern backup program that can back up your files:

  • from Linux, BSD, Mac and Windows

  • to many different storage types, including self-hosted and online services

  • easily, being a single executable that you can run without a server or complex setup

  • effectively, only transferring the parts that actually changed in the files you back up

  • securely, by careful use of cryptography in every part of the process

  • verifiably, enabling you to make sure that your files can be restored when needed

  • freely - restic is entirely free to use and completely open source

NEXT Layer 4: Local Offline zpool with snapshots sent to it

I need to buy more disks for this to work. would be nice to store them with Alice or have a pair that i swap between when I go to San Diego...

INPROGRESS this entire project needs to be done...

i have enough ideas i just need to stop having tool anxiety and read about borg backup

NEXT can this be more secure than having a password file legible by root....

the evergreen problem of backups