More actions
Introduction
The following is a small tutorial on how to setup Borg on NixOS, while using rsync.net as a remote target for your backups.
Prerequisites
- An account created on rsync.net
- NixOS on your local machine, with a flakes setup
- You have a .ssh key pair in your local machine
Nothing else (not even having a repo on rsync.net or even borg installed) is assumed for this guide.
Terms
- Repo: top-level storage unit where your backup data is written.
Add your public key to the rsync.net server
$ cat ~/.ssh/id_ed25519.pub | ssh <rsync.net user>@<rsync.net server ip> 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'
Create remote repo on rsync.net
$ nix shell nixpkgs#borgbackup $ borg --remote-path=borg14 init -e repokey-blake2 <rsync.net user>@<rsync.net server ip>:<path to repo name>
You will be prompted for a password. Store it in a file accessible only by root in your local machine. For example:
/var/trust/borg/passphrase
This path will later be referenced by your Nix config.
Also, export the key and store it in a safe place (maybe your password manager?):
borg --remote-path=borg14 key export --paper <rsync.net user>@<rsync.net server ip>:<path to repo name>
Create local job to automatically backup data
Configure your local NixOS to use Borg:
{ services.borgbackup.jobs = { rsync = { paths = [ "/paths/to/backup" ]; exclude = [ ]; user = "root"; group = "root"; doInit = true; startAt = [ "hourly" ]; inhibitsSleep = true; persistentTimer = true; repo = "<rsync.net user>@<rsync.net server ip>:<path to repo name>"; encryption = { mode = "repokey-blake2"; passCommand = "cat /var/trust/borg/passphrase"; }; compression = "auto,lz4"; prune = { keep = { hourly = 24; daily = 7; weekly = 4; monthly = 12; yearly = 99; }; }; extraArgs = [ "--remote-path=borg14" ]; }; }; environment.sessionVariables.BORG_REMOTE_PATH = "borg14"; }
I also have an example here: borg.nix.
Then simply switch:
sudo nixos-rebuild switch --flake . --show-trace
Test your backup
The easiest way to test your backup is to restart the job and then list the backups on the remote server:
sudo systemctl restart borgbackup-job-rsync.service borg list <rsync.net user>@<rsync.net server ip>:<path to repo name>