Бэкап сайтов на удаленный ftp сервер - пример скрипта

Привет, опять сегодня у нас пример скрипта для бэкапа. Сегодняшний скрипт очень похож на показанный мной ранее. Там мы копиравали файлы на сервер бэкапов, непосредсвенно с этого самого сервера бэкапов, при помощи ftp клиента, подключаясь к хостинговому серверу, тем самым необходимо было использовать 2 скрипта - 1 на хостинге, и 1 на сервере бэкапов. Сегодня же я хочу показать вам подобный скрипт, но в отличии от упомянутого выше, мы будем слать файлы на сервер бэкапов, используя ftp, с хостингового сервера. Т.е. в данном случае ftp сервер у нас - это сервер бэкапов. Так же в этом скрипте реализована простенькая ротация бэкапов.
Для работы скрита в вашей домашней папке должны быть созданы папки tmp и backup, на удаленном ftp сервере должна быть папка backup_test.
Создадим файл
Например в каталоге opt
nano www-backup.sh
И в ставим в это файл код скрипта.
папки
web - ее будем бекапить со всем содержимым.
tmp - временная папка.
backup - в нее будут временно помещены архивы бекапов, после выполнения скрипта содержимое этой папки будет удалено.
И так сам текст скрипта:
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
49
50
51
52
53
54
55
|
#!/bin/bash SHELL= /bin/sh PATH= /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin #задаем домашнюю папку пользгвателя, узнать ее можно подключившись к хостингу по ssh и набрав команду pwd HOME= /home/sanglyb #задаем имя бэкапу FILE=site_ru_$( date + "%Y-%m-%d_%H:%M" ).tgz #старый бэкап, который будет удален с сервера. Подразумевается, что ротация - 30 дневная, значит и старый бэкап будет в имени иметь дату меньше на 30 дней от сегодняшней OLDFILE=site_ru_$( date -d 'now -30 days' + "%Y-%m-%d" )* # $HOME/web - папка с файлами сайта, если у вас будет отличаться - измените ее tar czf $HOME /tmp/files .tgz $HOME /web # подключение к mysql - тут не забудьте ввести ваш хост, пользователя и пароль, а так же измените название базы данных mysqldump -h 127.0.0.1 -u sanglyb_sanglyb -ppassw0rd sanglyb_test > $HOME /tmp/mysql .sql tar czf $HOME /backup/ $FILE $HOME /tmp/ * cd $HOME /backup rm -rf $HOME /tmp/ * #параметры подключения к ftp серверу HOST= 'mytechnote.ru' USER=
PASSWD= 'passw0rd' #для подключения используется пассивный режим, если вам нужен активный - здесь и ниже при подключении к ftp уберите ключ -p ftp -np $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD binary cd backup_test put $FILE quit END_SCRIPT #получаем количество файлов в папке на ftp сервере CONTENT="$( ftp -inp $HOST <<HERE user $USER $PASSWD cd backup_test ls bye HERE )" NUMBER=` echo "$CONTENT" | egrep - v "user|ls|^d|bye" | wc -l` NUMBER=$((NUMBER-1)) #если файлов больше 30ти, удалим старый файл if [ $NUMBER -gt 30 ] then ftp -np $HOST <<END_SCRIPT1 quote USER $USER quote PASS $PASSWD binary prompt cd backup_test mdelete $OLDFILE quit END_SCRIPT1 fi #удаляем локальную копию бэкапа rm -rf $HOME /backup/ $FILE exit 0 |
Для проверки скрипта, необходимо скрипт сделать исполняемым. Команда:
chmod ugo+x www-backup.sh
Далее выполним/запустим скрипт
./www-backup.sh
После успешного запуска скрипты, можно проверить, должн быть создан файл на яндекс диске.
Настроим cron (планировщик задач Linux)
Вызовем его командой
sudo crontab -u root -e
и в открывшемся файле добавим строку:
40 2 * * * sh /opt/www-backup.sh > /dev/null
не забудьте поставить в конце строки Enter (перенос строки!)
Вот такой вот скриптик. Просьба строго не судить за топорную ротацию. Да, я понимаю, что если по какой то причине будет пропущено создание бэкапа, то на сервере будет лежать лишний файл, но скрипт писался в попыхах и на коленке, и выложен просто в качестве примера.
Если кто то знает более хорошее решение для ротации файлов с использованием ftp просьба написать в комментариях или на форуме.
В остальном - в комментариях в скрипте всё в общем то написано. После его заливки на хостинг, можно добавить этот скрипт в крон, что бы бэкапы делались автоматически.