Backup бесплатно

2012-06-28

Будь мужиком, делай бэкапы!

Звучит банально, но важность бэкапов сложно переоценить. Как правило, если вас угораздило арендовать VPS, то в погоне за экономией мало кто включает в стоимость и ежедневные бэкапы.
Да и недорогой VPS имеет диск по размеру ну явно меньше средней по размеру флешки. Ну и конечно же, делать бэкапы на тот же компьютер - несколько опрометчиво.
Вывод - делать бэкап на сторонний сервис. 
Уже порядка года использую довольно пуленепробиваемое решение - складирую бэкапы по FTP на публичый "файловый хостинг", у которого этот самый ftp upload есть. Их много, можно подобрать с наименее тошнотворным интерфейсом. Звучит немного странно - бэкап на файловый хостинг, но все становится на свои места, если учесть, что файлы копируются в зашифрованном виде.
Из программ нам понадобится:
  • wput - "wget наоборот" - есть почти в любом Unix
  • bcrypt - утилита для BlowFish шифрования файлов - можно либо собрать, либо поставить. Очень рекомендуется сохранить ее архив с исходным кодом, ибо утилита немолодая. Хотя ее можно чем-нибудь заменить.
  • expect - стандартная распространенная утилита для обработки команд, использующий диалоговый режим
Ниже приводится пример двух скриптов, обеспечивающих бэкап произвольного количества директорий.

Итак, предположим, что все “запчасти” есть в системе - пишем скрипт.

Один скрипт будет запускаться из другого, так что понадобятся оба файла. 

my_backup.sh


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
# What to backup.
backup_files="/home/userdir /home/anotheruserdir"
backup_databases="base1 base2"
mysql_user="root"
mysql_password="yourmysqlpasswordhere"
#Added special user "backup" just to keep files consistent
crypto_tool=/home/backup/bin/bwfile.sh
crypto_key="topSecretData"
ftpuser="your_file_hosting_username"
ftppassword="your_file_hosting_password"
# Where to backup to. Temporary
dest="/home/backup/tmp"
# Create archive filename.
day=$(date +%F_%T)
hostname=$(hostname -s)
archive_file="$hostname-$day-files.tbz"
db_backup="$hostname-$day-bases"
# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo
# Backup the files using tar.
tar cjf $dest/$archive_file $backup_files
#backup databases
echo "Dumping bases $backup_databases"
/usr/local/bin/mysqldump --user=$mysql_user --password=$mysql_password --databases \
$backup_databases &gt; $dest/$db_backup.sql</pre><pre>echo "Packing bases $dest/$db_backup.sql with bzip2"
bzip2 $dest/$db_backup.sql
#encrypt backups
#files#
echo "Crypting files"
$crypto_tool $dest/$archive_file $crypto_key
#bases#
echo "Crypting bases"
$crypto_tool $dest/$db_backup.sql.bz2 $crypto_key
#uploading to remote ftp (fileserve)
echo "Starting ftp upload..."
#$ftp_uploader $ftpuser $ftppassword $dest $ftpdir
cd $dest
/usr/local/bin/wput --binary --remove-source-files \
ftp://$ftpuser:$ftppassword@ftp.your_hosting_name.com/backup/ $archive_file.bfe
/usr/local/bin/wput --binary --remove-source-files \
ftp://$ftpuser:$ftppassword@ftp.your_hosting_name.com/backup/ $db_backup.sql.bz2.bfe
echo "End ftp upload"
# Print end status message.
echo
echo "Backup finished"

Ок, первый скрипт есть. Некоторые пояснения:

  • Скрипт пакует директории. Они перечислены вначале и имена разделены пробелом
  • Также умеет паковать mySQL бэкапы. В случае с sqlite - этот кусок можно закомментировать
  • Криптование архивов перед загрузкой происходит еще одним скриптом, подробности дальше
bwfile.sh


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/local/bin/expect
set BCRYPT_BINARY /usr/local/bin/bcrypt
if {[llength $argv] &lt; 2} {
puts "usage: bwfile.sh {file_path key}"
exit 1
}
spawn $BCRYPT_BINARY [lindex $argv 0]
set timeout -1
expect "Encryption key:"
set key [lindex $argv 1]
send "$key\r"
expect "Again:"
send "$key\r"
expect eof

Обратите внимание, что скрипт не шелловский, а команды expect. Конечно bcrypt - древняя утилита, но работает “как надо”, почему бы ей не воспользоваться.


Ну а дальше все просто. Подбираем хостинг по вкусу (их было ОЧЕНЬ МНОГО до недавнего скандала с файлообменниками), настраиваем на наш environment - и тестируем. 
Если все ок - в панели управления файлообменника появятся новые файлы с бэкапами. 
Быстро, бесплатно, без СМС :-)

Да, кстати, если вдруг бэкап понадобится восстановить - для начала его нужно будет дешифровать bcrypt’ом. Именно поэтому и рекомендуется хранить хотя бы его исходник.


В массы

В трубу