Бэкап сайтаов на 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  в путь для архивации файлов, в вашем случае это может быть или другая папка или вовсе ее удалить, я не стал ее выносить в настройки, поскольку не придумал как ее правильно описать.
Ну и естественно это только файл, резервной копии БД тут нет!
В ближайшее время я покажу как это сделать.

Комментарии (4)

  1. Андрей 21.03.2018 Ответить
    Вы пишите что рассматриваете ситуацию, года места на диске совсем нет, однако делаете архивы на этом же диске, что только усугубляет ситуацию. Почему бы не воспользоваться утилитой scp для пофайлового копирования на внешний сервер, а затем на нем делать архивы?
  2. Виктор
    Виктор 10.04.2018 Ответить
    Для этого есть ряд причин.
    Во первых scp копирует пофайлово, для этого он создает сессию завершает копирование начинает сессию, по сути миллион файлов у вас будет копироваться вечность, попробуйте залить на ftp 40К файлов и посмотреть по скорости что будет быстрей заливка их в 10 потоков или копирование 1 архива и распаковка там, разница не в десятки а в несколько порядков по скорости, так что копировать нужно архив целиком.
    И да можно было бы сделать что-то более изящное не сохраняя бэпак на диск, например держа все в буфере и заливая все это дело сразу от туда, но тут есть ограничение на размер памяти, ведь размеры сайты очень даже разные, возможно скрипт перепишу на такое решение.
    НО scp тут не подойдет.
    Так же у CSP нет ограничения на скорость аплоада, что дает при HDD очень высокую нагрузку как на канал так и на I-O системы. Тем самым сильно проваливая load avarage.
  3. Андрей 27.04.2018 Ответить
    У меня была ситуация когда надо было сделать бекап сайт на другой сервер, вес которого 22Гб (сотни тысяч файлов), свободного места не было. Я воспользовался SCP. С учетом того, что хостер обычно режет исходящую скорость копирование длилось 6 часов. Легко подсчитать, что скорость была не высокая, а значит и нагрузка на HDD не большая (архивирование дало бы большую нагрузку на диск и CPU).
  4. Виктор
    Виктор 14.05.2018 Ответить
    везде разные ситуации в случае когда на хостинге нет ни места ни оперативки, возможно имеет смысл воспользоваться вашим методом.
    НО даже копирование в 10 потоков ВСЕГДА будет в десятки а то и тысачи раз медленней.
    К примеру копирование с архивированием 30 GB сайта у меня в среднем занимает около 5 минут

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