.gitignore | ||
backup-manager.py | ||
BackupPC_archiveHost_s3 | ||
COPYRIGHT | ||
README.markdown | ||
secrets.py.orig |
BackupPC_archiveHost_s3
This is a Python script that acts as an interface between BackupPC and Amazon S3. It uses BackupPC's archive function to extract a tarball and split it into chunks, like the normal archive function. Then, the chunks are encrypted using gpg and transmitted to S3 using Boto.
Installation
I wrote this script some years ago, and can't remember how to get it going. But, here's going to be my best guess :-)
-
Install prerequisites
You will need Python, Boto, and a working BackupPC installation.
-
Download and install this script
Something like this seems like a good idea:
cd /usr/local/src/ git clone git://github.com/rtucker/backuppc-archive-s3.git
Then create a link from
/usr/share/backuppc/bin/
to here:ln -s /usr/local/src/backuppc-archive-s3/BackupPC_archiveHost_s3 /usr/share/backuppc/bin/
-
Configure this script
Create a file in this directory called
secrets.py
, based upon thesecrets.py.orig
file. It should have your AWS Access and Shared keys, a passphrase that will be used to encrypt the tarballs, and, optionally, a path to a file that contains a maximum upload rate in kilobits per second:accesskey = 'ASDIASDVINASDVASsvblahblah' sharedkey = '889rv98rv8fmasmvasdvsdvasdv' gpgsymmetrickey = 'hunter2' speedfile = '/var/cache/speedlimit.txt'
If you use the
speedfile
option, you can change this on the fly to limit upstream bandwidth usage during peak hours, etc. -
Configure BackupPC
From the BackupPC configuration interface, go to
Edit Hosts
and add a new host,archiveS3
, which looks like the existingarchive
host. Save this, select thearchives3
host, and thenEdit Config
for that host.Change the settings on each tab as follows:
Xfer: XferMethod: archive ArchiveDest: /var/lib/backuppc/archives3 ArchiveComp: bzip2 ArchiveSplit: 500 ArchiveClientCmd: $Installdir/bin/BackupPC_archiveHost_s3 $tarCreatePath $splitpath $parpath $host $backupnumber $compression $compext $splitsize $archiveloc $parfile *
Backup Settings: ClientTimeout: 720000
That should be just about it. Note that
ArchiveDest
is where it will stage the tarballs before it uploads them; this must have enough disk space for your archive!ArchiveSplit
is the size of each tar file, in megabytes; you may want to adjust this for your needs. Also, theArchiveClientCmd
is the default, except with the_s3
added. -
Use it
Go to the main page for the
archives3
host and clickStart Archive
. To start with, just tick the box next to the smallest backup you have, thenArchive selected hosts
. Go with the defaults (which look suspiciously like what you set on the Xfer tab, do they not? :-) and thenStart the Archive
.Watch syslog and hopefully everything will work.
backup-manager.py
There is a companion script, backup-manager.py
, that can be used to see
what's on S3. Run it with no arguments to get a listing of backups and
their ages, or use the --help
argument to see what it can do.
The "crown jewel" of this whole system is the script
command, which
produces a script that can be used to restore a backup. It uses S3's
Query String Request Authentication
mechanism to generate temporary URLs to download each file required to
restore a backup.
Each night, from cron
, I run a script:
#!/bin/sh
BACKUPMGR=/path/to/backup-manager.py
# Delete all backups older than 30 days.
$BACKUPMGR delete --age=30
# Create restore scripts, valid for one week, for all of my computers
cd /home/rtucker/Dropbox/RestoreScripts/
$BACKUPMGR --expire=604800 --host=gandalf script > restore_gandalf.sh
$BACKUPMGR --expire=604800 --host=witte script > restore_witte.sh
# etc, etc
# Output a list of what's on the server
$BACKUPMGR
The output of this is mailed to me, so I always know what's going on!
FAQs
-
BackupPC is written in Perl. Why is this thing written in Python?
I know Python much better than I know Perl, so I wrote it in Python. The good news is that BackupPC doesn't care, but it does mean this probably won't be part of the BackupPC main distribution any time soon.
-
Is this project dead?
You could say that. A lot of my projects are one-off scripts that solve a very specific need I have, and I don't put too much thought into making them useful for other people. This script works for me and (sorta) meets my needs, so that's where it is.