[This is the English translation by DeepL]
[Version originale en français]
All backup solutions require a minimum of configuration to do the job. These three solutions are no exception.
What Borg, Restic and Kopia have in common is the use of a repository into which they push backups. This repository must be initialized before the first backup can be made. In practice, here's how I proceeded with each of these programs.
Borg
Borg relies on an SSH key to open the communication tunnel between Borg on the server and Borg on the client. For this purpose, I use a dedicated SSH key and configuration. If you've mastered SSH configuration on the client side, this opens the door to fairly fine-tuning of the tunnel between client and server. We're back in familiar territory, and it's quite comfortable.
$ borg init --encryption=repokey-blake2 --rsh "ssh -F .ssh/config_bkp" bkppat@192.168.0.22:/backupmaison/bench-borg
Creating the first backup, on the other hand, is a completely different story. The number of parameters is so great that, in my scripts, I define them as variables which I then use in the various commands:
$ SSH="ssh -F .ssh/config_bkp" $ HOMEREPO="bkppat@192.168.0.22:/backupmaison/bench-borg" $ HOMEOPTIONS="--stats --exclude-caches --exclude-if-present .nobench-bkup" $ SOURCEROOT="/Users/patpro" $ ARCHIVENAME=$(date "+%Y%m%d.%s") $ export BORG_PASSPHRASE="foobar" $ borg create ${HOMEOPTIONS} --rsh "${SSH}" ${HOMEREPO}::${ARCHIVENAME} ${SOURCEROOT}
With Borg, all parameterization is done in this way. There is no configuration file. Fortunately, a backup task is supposed to be automated, i.e. to reside in one form or another in a script that doesn't need to be retyped manually at the command line. The disadvantage is therefore rather minor.
Kopia
If you're using SFTP transport, then Kopia works in much the same way as Borg, except that Kopia uses its own SSH implementation by default. This requires you to specify the location of the known_hosts file, for example. Nor will it take into account the configuration file of the machine's native SSH client. Unfortunately, Kopia's native implementation of the SSH protocol does not support all key types. This bug has been identified but not yet corrected. The use of Elliptic Curve keys remains possible if the Kopia client is told to use an external SSH client. For my part, I chose to create an RSA key to get around the bug.
$ kopia repository create sftp --path=/backupmaison/bench-kopia --host=192.168.0.22 --username=patpro --keyfile=/Users/patpro/.ssh/kopia_rsa --known-hosts=/Users/patpro/.ssh/known_hosts-kopia
Unlike Borg, Kopia's configuration is largely deported to the repository. This involves using policy management commands to set a certain number of parameters for use by the Kopia client.
Here's how it works in my case :
$ kopia policy list 85bf7bc7688d5819433aad9ba1c84f6b (global) $ kopia policy set --add-dot-ignore .nobench-bkup 08c59f69009c88ee463de6acbbc59a3a Setting policy for patpro@cassandre:/Users/patpro/08c59f69009c88ee463de6acbbc59a3a - adding ".nobench-bkup" to "dot-ignore filenames" $ kopia policy set --compression=zstd --global Setting policy for (global) - setting compression algorithm to zstd
These policies are inherited, from the most general to the most specific:
$ kopia policy show --global| head Policy for (global): Retention: Annual snapshots: 3 (defined for this target) Monthly snapshots: 24 (defined for this target) Weekly snapshots: 4 (defined for this target) Daily snapshots: 7 (defined for this target) Hourly snapshots: 48 (defined for this target) Latest snapshots: 10 (defined for this target) Ignore identical snapshots: false (defined for this target) $ kopia policy show 08c59f69009c88ee463de6acbbc59a3a| head Policy for patpro@cassandre:/Users/patpro/08c59f69009c88ee463de6acbbc59a3a: Retention: Annual snapshots: 3 inherited from (global) Monthly snapshots: 24 inherited from (global) Weekly snapshots: 4 inherited from (global) Daily snapshots: 7 inherited from (global) Hourly snapshots: 48 inherited from (global) Latest snapshots: 10 inherited from (global) Ignore identical snapshots: false inherited from (global)
As the various client parameters used to define backup and purge tasks are deported, the command line for the various actions is greatly simplified. You still need to to connect the client to the backup server. This is done with a command like :
$ kopia -p foobar repository connect sftp --path=/backupmaison/bench-kopia --host=192.168.0.22 --username=patpro --keyfile=/Users/patpro/.ssh/kopia_rsa --known-hosts=/Users/patpro/.ssh/known_hosts-kopia
Disconnection is then carried out as follows:
$ kopia repository disconnect
It's important to understand that this connection and disconnection doesn't have to be done systematically. It's a mistake I made myself: in the early days of running my backup scripts, for each Kopia task I would connect, perform the task and then disconnect. The side effects are minimal, but I'll come back to that later. In any case, a connection at time T persists, because it's not a network connection. It's best to think of this as a pre-configuration of the client, enabling it to use the server's login, password and contact details to carry out backup tasks. In the rest of my tests, I simply made a connection once and never disconnected my client again. As a result, creating a backup is as simple as this trivial command:
$ kopia snapshot create /Users/patpro
The difference with Borg is obvious.
Restic
To test Restic, I decided to use the REST-server. Transport is over HTTP and the command is relatively trivial. On the server side, configuration is fairly basic, since I've simply specified the storage path, interface and TCP port for listening and the --no-auth parameter, as I don't need authentication.
$ restic -r rest:http://192.168.0.22:8000/ init
Like Borg, backup and purge tasks require all parameters to be passed on the command line:
$ export RESTIC_PASSWORD=foobar $ restic -r rest:http://192.168.0.22:8000/ backup --verbose --exclude-if-present .nobench-bkup --one-file-system --exclude-caches --no-scan --read-concurrency 4 /Users/patpro
There's not much more to say about Restic, which behaves much like Borg in terms of settings and command line. Even if the number of parameters were to multiply, it would all take place in a perfectly readable shell script.
To conclude
I really like the readability of a command line with or without variables: it allows me to analyze a backup script in any editor and in any context. Nevertheless, I have to admit that I'm quite taken with the elegance of Kopia's policy system, even if accessing the policy content requires access to the Kopia command in a terminal as well as to the backup repository (which is a drawback). I think we're faced with a choice criterion that will depend solely on the end-user's preference.