Резервное копирование на удаленный ftp сервер (shell)

Исчезновение хостера подвигло меня к срочному поиску и покупке ftp хостинга для бэкапов, а также поиску / написанию скрипта для сохранения копий на удаленный сервер.

Для поиска хостера я просмотрел большую часть основного списка vps-хостеров на hosting101.ru. Искал либо недорогой vps c большими объемами жестких дисков, либо собственно backup hosting. Свой выбор я остановил на хостинге от Fornex.com. Основной критерий — стоимость. У них ~ 3р / GB*мес., с шагом 50G или 3,5 евро за каждые 50G.

За основу скрипта для резервного копирования я взял скрипт выдаваемый этим генератором: http://bash.cyberciti.biz/backup/wizard-ftp-script.php, с первой попытки он у меня не заработал, поэтому я его изучил и немного модифицировал. Буквально несколько строчек.

Вот несколько моментов, которые понадобилось изменить:

В первую очередь для работы скрипта понадобится ftp клиент ncftp. Не каждый менеджер пакетов о нем знает, но он без проблем компилируется из исходников.

Программы tar и mysqldump уже должны быть на любом веб сервере.

После отладки скрипта из shell, он у меня не запустился из cron. Видимо пути для поиска из крона не совпадают с путями поиска оболочки. ncftp заменил на полный путь до него (узнать полный путь можно командой whereis ncftp)

При попытке сделать дамп всех баз данных пользователя, mysql  на базе information_schema выдал сообщение о запрещенном доступе. Собственно резервная копия этой базы и не нужна. Поэтому получение списка баз для копирования вполне можно заменить на ввод этого списка вручную.

Копировать различные сайты и подсайты я решил отдельными процессами, чтобы одна папка / один tar-файл соответствовали одному сайту, а не сразу всем. Если сервер не упадет полностью — восстанавливать надо будет скорее всего один сайт, а не все.

Файлы сайта, как правило содержат несколько MB текстовых скриптов, и гораздо более значительные объемы фотографий, музыки, видео. Весь этот медиаконтент как правило не поддается сжатию, поэтому при создании копий я использую формат tar, а не tar.gz или bz. При больших объемах данных — это очень экономит время.
Если на вашем сайте основной контент — текстовые документы, то можно сжимать.

Собственно сам скрипт:

#!/bin/sh
# System + MySQL backup script
# Full backup day - Sun (rest of the day do incremental backup)
# Copyright (c) 2005-2006 nixCraft <http://www.cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# Automatically generated by http://bash.cyberciti.biz/backup/wizard-ftp-script.php
# modified: thenest.ru
# ---------------------------------------------------------------------

### System Setup ###
# Короткое название папки (используется для формирования имен)
DIRSHORT="sitename"
# Папка для бэкапа
DIRS="/var/www/sitename/data/www/sitename.ru"
# Временная папка (в нее будут архивироваться файлы)
BACKUP=/root/back/backup.$$
# формат даты для имен (можно не менять)
NOW=$(date +"%Y-%m-%d")
# Файл с информацией о инкрементальных копиях
INCFILE="/root/back/$DIRSHORT-tar-inc-backup.dat"
# текущий день недели (не менять)
DAY=$(date +"%a")
# день недели полного бэкапа
FULLBACKUP="Sun"

### MySQL Setup ###
# имя пользователя MySQL
MUSER="siteuser"
# пароль MySQL
MPASS="pass"
# адрес сервера MySQL
MHOST="localhost"
# база MySQL или список баз
MYDB="sitenamedb"
# используемые программы
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

### FTP server Setup ###
# папка на FTP
FTPD="/sitename/$DIRSHORT"
# имя пользователя FTP
FTPU="ftpuser"
# Паароль FTP
FTPP="ftppass"
# Сервер FTP
FTPS="ftpserver.com"
#NCFTP="$(which ncftpput)"

### Other stuff ###
EMAILID="user@gmail.com"

### Start Backup for file system ###
[ ! -d $BACKUP ] && mkdir -p $BACKUP || :

### See if we want to make a full backup ###
i=$(date +"%Hh%Mm%Ss")
if [ "$DAY" == "$FULLBACKUP" ]; then
# FTPD="/ftpback/full"
datedir="$NOW-full"
FILE="$DIRSHORT-full-$NOW-$i.tar"
rm $INCFILE
tar -g $INCFILE -cvf $BACKUP/$FILE $DIRS
else
datedir=$NOW
FILE="$DIRSHORT-i-$NOW-$i.tar"
tar -g $INCFILE -cvf $BACKUP/$FILE $DIRS
fi

### Start MySQL Backup ###
# Get all databases name
#DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
DBS=$MYDB
for db in $DBS
do
FILE=$BACKUP/mysql-$db.$NOW-$(date +"%T").gz
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done

### Dump backup using FTP ###
#Start FTP backup using ncftp
echo "Ftp upload start"

# temp files
ftpcommand="/dir/to/script/tmp/$DIRSHORT-com.ftp"
ftplog="/dir/to/script/tmp/$DIRSHORT-log.ftp"

# ftp script
echo "mkdir sitename
mkdir $FTPD
mkdir $FTPD/$datedir
cd $FTPD/$datedir
lcd $BACKUP
mput *
quit" > $ftpcommand

# execute ftp script
/usr/local/bin/ncftp -u$FTPU -p$FTPP $FTPS > $ftplog < $ftpcommand

### Find out if ftp backup failed or not ###
if [ "$?" == "0" ]; then
echo "Ftp upload end ok"
rm -rf $BACKUP
else
echo "Ftp upload end error"
T=/root/back/backup.fail
echo "Date: $(date)">$T
echo "Hostname: $(hostname)" >>$T
echo "$DIRSHORT Backup failed" >>$T
echo "ftpout:" >> $T
cat $ftplog >> $T
mail -s "BACKUP FAILED" "$EMAILID" <$T
rm -f $T
fi

  • Ponomarchik

    тут есть кто? нужна помощь по этой теме…

    • VladimirDolgov

      что не получается?

  • Дмитрий

    Если не сложно помогите с скриптом

    mysqldump -h localhost -u name_ru -p’pass’ name | gzip > /var/www/admin/data/www//simple-backup/dumpbase_`date «+%Hh%Mm_%Y%m%d»`.sql.gz | scp /var/www/admin/data/www/prohoro.ru/simple-backup/dumpbase__`date «+%Hh%Mm_%Y%m%d»`.sql.gz login@81.12.76.80:./home/

    Как в к scp указать и пароль в login@81.12.76.80, нужно чтобы через крон работало?

    • Vladimir

      scp работает поверх ssh и использует его авторизацию.

      Как логиниться автоматом по логину и паролю — я так и не нашел, но можно авторизоваться по ключам. Этот способ работает на большинстве хостингов.

      Для этого генерируется пара ключей.

      Закрытый оставляется в ~/.ssh, открытый копируется определенный файл на удаленном сервере.

      После этого можно авторизоваться без паролей. Только один раз согласиться что доверяете удаленному хосту.

      подробнее по запросу ssh авторизация по ключу
      например тут:
      http://belgorod.lug.ru/wiki/index.php/SSH_%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BA%D0%BB%D1%8E%D1%87%D1%83

      • Дмитрий

        спасибо, бум разбираться.