Programster's Blog

Tutorials focusing on Linux, programming, and open-source

Iteratively Backing Up To A Remote Computer Using FTP

This tutorial will show you how to back up your files to a remote computer in an encrypted format using duplicity.

Steps

Install duplicity if you haven't already

sudo apt-get install duplicity -y

If using Ubuntu, you may wish to install Duplicity from the PPA.

Copy and paste the following BASH backup script onto the server and edit your settings/variables appropriately.

#!/bin/bash

# A simple backup script wrapper for duplicity.
# Author - nixCraft  under GPL v2+
# Edited by Programster
# On ubuntu
# -----------------------------------------------------

# Put your ftp password here for duplicity to be able to automatically login/proceed.
export FTP_PASSWORD=xxxxx

# Specify your FTP user.
FTP_USER="programster"

# Specify the host of your FTP account
FTP_HOST="ftp.mydomain.com"

# Specify the path on your ftp host where you want the backups to go.
# Be sure to end with a /. if you want the folders to be within the folder you named.
FTP_STORAGE_PATH="/Backups/name-of-backup-folder/."

# The path to where the files that we want to backup are
SOURCE='/path/to/folder/to/backup'

# The target string to provide duplicity of where to store the backup
TARGET="ftp://${FTP_USER}@${FTP_HOST}${FTP_STORAGE_PATH}"

# The full path to the duplicity program
# you shouldn't need to change this if you are using Ubuntu
DUPLICITY_CMD='/usr/bin/duplicity'

# Specify how far back we want to be able to restore to
# e.g. how long a backup lives in days before it is removed.
BACKUP_LIFETIME="30D"

# Specify how many days of iterative backups are allowed to
# be taken before a full backup has to be taken
DAYS_BETWEEN_FULL_BACKUPS="10D"

####################


# Removing old backups
echo "Removing old backups..."
$DUPLICITY_CMD remove-older-than ${BACKUP_LIFETIME} ${TARGET}

# Backup our files 
echo "Backing up files..."
$DUPLICITY_CMD ${SOURCE} --full-if-older-than ${DAYS_BETWEEN_FULL_BACKUPS} --no-encryption ${TARGET}

echo "done!"

Now run your backup script and you should get output similar to below:

Last full backup date: none
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1494703857.24 (Sat May 13 14:30:57 2017)
EndTime 1494703857.25 (Sat May 13 14:30:57 2017)
ElapsedTime 0.02 (0.02 seconds)
this is another file
SourceFiles 2
SourceFileSize 4108 (4.01 KB)
NewFiles 2
NewFileSize 4108 (4.01 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 12 (12 bytes)
TotalDestinationSizeChange 521 (521 bytes)
Errors 0
-------------------------------------------------

Congratulations, you now have a remote backup!

Checking It Worked

If you ftp into the remote server's backup area, you should now see a bunch of encrypted gpg files like below:

duplicity-full.20170513T193057Z.manifest.gpg
duplicity-full.20170513T193057Z.vol1.difftar.gpg
duplicity-full-signatures.20170513T193057Z.sigtar.gpg
duplicity-inc.20170513T193057Z.to.20170513T193126Z.manifest.gpg
duplicity-inc.20170513T193057Z.to.20170513T193126Z.vol1.difftar.gpg
duplicity-new-signatures.20170513T193057Z.to.20170513T193126Z.sigtar.gpg

Also, if you run the following command, you can see all the backups you have got:

TARGET="ftp://${FTP_USER}@${FTP_HOST}${FTP_STORAGE_PATH}"
duplicity collection-status ${TARGET}
Last full backup date: Fri Feb 26 19:23:07 2021
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive directory: /home/programster/.cache/duplicity/423e0f105fe7a57fc4e0caf611ff17cb

Found 0 secondary backup chains.

Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Fri Feb 26 19:23:07 2021
Chain end time: Fri Feb 26 19:26:02 2021
Number of contained backup sets: 4
Total number of contained volumes: 4
 Type of backup set:                            Time:   Number of volumes:
                Full         Fri Feb 26 19:23:07 2021                 1
         Incremental         Fri Feb 26 19:23:49 2021                 1
         Incremental         Fri Feb 26 19:24:17 2021                 1
         Incremental         Fri Feb 26 19:26:02 2021                 1
-------------------------
No orphaned or incomplete backup sets found.

References

Last updated: 13th November 2022
First published: 27th February 2021

This blog is created by Stuart Page

I'm a freelance web developer and technology consultant based in Surrey, UK, with over 10 years experience in web development, DevOps, Linux Administration, and IT solutions.

Need support with your infrastructure or web services?

Get in touch