# Backup, verify, restore with duplicity

I had decided moving from unmaintained and old rdiff-backup to quite new and modern duplicity. Another reason beside its relative novelty is e.g. its support for different storage like Dropbox, Webdav or multistorage(!) and also encryption. I will use SSH and rsync to do a backup on a remote host.

# Creating first backup

I will not go into big details here, since this was done very well on DigitalOcean. Just don't forget that from two keys you create with gpg you need to use the private key denoted as sub in gpg --list-keys. This is needed just for the first time you make a backup e.g. by this command:

duplicity -v5 --encrypt-key 6B5xxxx2  /dirs/to/backup rsync://endpoint//place/to/do/backup/on/remote/host


## Bugs and caveats

This part is relevant to this configuration of my stack:

\$ gpg --version

gpg (GnuPG) 2.1.11
libgcrypt 1.6.5
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2


and duplicity duplicity 0.7.06 and latest Arch Linux up to this date.

The first backup went well, but the second one wasn't possible to do because of some stupid error. I found that this is a bug and can be solved by:
1. Possibly installing pinentry and then adding this to ~/.gnupg/gpg-agent.conf:

pinentry-program /usr/bin/pinentry
allow-loopback-pinentry


and this to ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback


then you should be able to do the backup just with passing your passphrase (or setting it as env variable) by this:

duplicity /dir/to/backup rsync://endpoing//dir/where/to/save/backup


I also recommend to set up lower priority for this process by prepending the command above by nice -n 10.

# Restore files

First you should try to find the file you are looking for by this command:

duplicity list-current-files rsync://endpoint/backups|grep my/file


and then, if you find it, restore it with:

duplicity restore --file-to-restore file/to/restore/without/leading/slash rsync://endpoint/backups where/to/save/locally


# How to restore on different device

When your backup device dies, you also might have lost your private keys and hence you are f**d up because even though you have your backup, you can't de-encrypt it. Hence, you should create a backup of your private key used for backup and save it somewhere securely. This can be done by gpg --export-private-keys <KEY_ID> > key.cer. Then you can import it on a machine you want to do a restore operation by gpg --import key.cer. That's it.

# Bugs and caveats

I wanted to use duplicity with mega, but it seems there is some bug because of old megapy package. I just hope someone will do a new binding using official MEGA SDK.