Бэкап сайтаов на ftp при нехватке места на сервере.

 В данное время эта проблемам стала актуальной, поскольку все чаще используются SSD накопители, однако объем от этого не увеличился.
И зачастую даже один backup всех сайтов не помещается на этот диск. Для этого нам придется делать backup каждого сайта по отдельности и передавать на внешний ftp сервер, после передачи сразу удаляя его с сервера.
Конечно можно использовать и более продвинутый вариант, в котором мы вовсе не будем затрагивать файловую структуру и сразу из памяти копировать на внешнее устройство.
Такое решение подойдет, если у нас занято 100% дискового пространства, но есть и ограничение в размере памяти. А размер сайтов и количество оставшейся памяти вещь которую трудно прогнозировать.
Хотя и тут можно подумать. Текущий же вариант подойдет к любому серверу.
Для этого нам понадобится поставить сторонний софт wput поскольку он хорошо умеет ограничивать скорость upload, что может ограничить нагрузки на I-O дисковой подсистемы, особенно это актуально если у нас классические HDD.
В данном случае, я выставил ограничение в 60 Мегабайт в секунду, что подойдет для SSD дисков и наличия 1GB канала связи между серверами.



Ставим wput
apt-get install wput
или
yum intall wput

Создаем файл скрипта
touch /usr/bin/file_backup
Разрешаем его запускать только себе
chmod 700 /usr/bun/file_backup 

 Редактируем файл и сохраняем в него следующий код.
#!/bin/sh

FTPUSER="******"                      # Логин FTP сервера
FTPPASS="******"                      # Пароль FTP
FTPHOST="******"                      # сервер FTP
FTPDIR="/sitebackup/"                 # папка на FTP
SITEDIR="/var/www"                    # Папка где лежат сайты
TMPDIR="/var/backup/site"             # Где будут храниться временные файлы
DATE=`date +"%Y-%m-%d"`               # Формат даты в имени файла
cd $SITEDIR                           # Нужно чтб  сделать ls
LIST=`ls | grep -E ".*\.\w{1,5}"`     # создаем список сайтов 



cd $TMPDIR
test ! -d $TMPDIR/`date +%Y`/`date +%m` && { mkdir -p $TMPDIR/`date +%Y`/`date +%m` ; } 
for ELEMENT in $LIST
    do
        echo -en "Архивируется сайт $ELEMENT" 
        tar -zcvpf $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz $SITEDIR/$ELEMENT/web --exclude=backup --exclude=managed_cache --exclude=stats --exclude=resize_cache >> /dev/nool 2> /var/log/file_backup.err

        wput --limit-rate=60000K --timestamping `date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR
        rm $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz && echo "Удален файл $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz"
  done


#find $TMPDIR/ -type f -mtime +750 | xargs rm -f; #удаляет предыдущие бэкапы стaрше 2 лет.
#find $TMPDIR/ -type d -empty | xargs rm -r;
rm -r $TMPDIR/`date +%Y`


Добавляем в крон
crontab -e
Вставляем и заменяем путь к лог файлу если это необходимо
00 01 3 * * nice -n +19 /usr/bin/filebackup_archive >/dev/null 2 >> /var/log/ispconfig/syslog 

Все что вам остается, это заменить учетные данные FTP на ваши настройки.
Обратите внимание у меня на сервере в папке сайта есть еще подпапки с куками логами и тд, по этому я доставил папку web  в путь для архивации файлов, в вашем случае это может быть или другая папка или вовсе ее удалить, я не стал ее выносить в настройки, поскольку не придумал как ее правильно описать.
Ну и естественно это только файл, резервной копии БД тут нет!
В ближайшее время я покажу как это сделать.


Оставить комментарий