В этом году начал перевозить почти все свои сайты (uCoz не перевезешь) на свежекупленный виртуальный сервер. Сервер по технологии OpenVZ, что не очень круто, но зато недорого. Разумеется встал вопрос о резервном копировании. На самом деле, конечно, вопрос стоял и раньше, но тогда это вызывало одни сложности, сейчас другие.
Раньше для резервного копирования я пользовался несколькими вариантами, а иногда и несколькими сразу:
- Возможности панели управления хостингом. Все настраивается в несколько кликов мышкой, но главное неудобство это то, что для хранения резервных копий используется тот же объём дискового пространства, что и для всех сайтов. В некоторых панелях бэкапы можно дополнительно выливать на какой-нибудь фтп, но его тоже надо где-то держать.
- Плагины CMS для бэкапа. WordPress позволяет без проблем делать копии базы данных и отправлять его в почту, но это не избавляет от необходимости делать резервную копию файлов самой CMS, а таких плагинов немного, да и зачастую они платные. Лучшее что я нашел это плагин который сливал копию в DropBox, однако на моем хостинге он отказался нормально работать, видимо сказалась нехватака оперативной памяти.
- Сторонние сервисы. Долгое время я пользовался услугами сервиса для резервного копирования Comcure. Сервис платный но есть бесплатный тариф с ограничениями, которых мне в целом хватало. Минус данного подхода в том, что вы фактически передаете права на доступ к сайту и базе стороннему сервису.
- Ручное резервное копирование. Запускаете Phpmyadmin, сливаете базу, запускаете файловый менеджер (например FileZilla) и сливаете содержимое сайта по ftp или ssh. Очевидный минус — все надо делать руками и не забывать это делать вовремя. Есть возможность написать скрипт который будет делать это автоматически.
- Комбинация плагина для резервной копии и скрипта на компьютере. На самом деле именно этим я в основном и пользовался долгое время. Плагин выливал копию базы данных в папку на хостинге, а скрипт сливал все это дело на компьютер, архивировал и ложил в папку облачного клиента (например DropBox или Яндекс.Диск). Минусом такого подхода — компьютер всегда должен быть включен, интернет всегда должен быть. А если непредвиденные обстоятельства? А если отпуск и вы обесточили квартиру с интернетом?
Поход меняется с переходом на vps/vds хостинг. Тут как известно у вас появляется полноценная консоль и полноценная операционная система, которая поимо предоставления услуг вебсервера, может ещё что-то на сервере делать по расписанию. Сразу было решено в это самое расписание закинуть скрипт резервного копирования сайтов и бд. Ну а чтобы не занимать ограниченное дисковое пространство выделенного виртуального сервера, готовые файлы резервных копий было решено тут же скидывать на сервер. Немного погугвлив я нашел скрипт, который и лег в основу моего решения. Вот ссылка: http://hudson.su/2011/03/03/mysql-backup-script/ Оригинал делал резервное копирование только баз данных, но в комментариях вы найдете доработку скрипта, который так же бэкапит и папки сайтов. Я же добавил только закачку полученных файлов на Яндекс.Диск (или другое облачное хранилище поддерживающее работу по протоколу webdav) и возможность удаления старых копий на яндекс диске.
Решение не претендует на оригинальность или корректность, предоставляется как есть безо всяких гарантий. Если будут вопросы помогу чем смогу в комментариях. Внизу ссылка на файл, если кому лень копипастить.
Вот сам текст скрипта:
[sociallocker]#!/bin/bash
#пути to куда копировать patch откуда
to=»/var/backups/sites/»
patch=»/var/www/»#webdaw имя, пароль и адрес
cname=»»
cpass=»»
# backup — это папка в которую будут сливаться бэкапы, должна уже существовать на диске яндекса (или другом сервисе)
caddr=»https://webdav.yandex.ru/backup/»# текущая дата
DATE=`date +%Y-%M-%d`# y/m/d/h/m дата по отдельности
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
HOURS=`date +%H`
MINUTES=`date +%M`# данные доступа к серверу бд
DBUSER=»root»
DBPASS=»»
DBHOST=»127.0.0.1″
#файл лога для разбора полетов
LOGFILE=»$DATE.log»echo «************* Start Backup **********»>>$LOGFILE
echo «Start Time: $HOURS:$MINUTES»>>$LOGFILE#процедура очистки. будет создавать файл со списком загруженных файлов, затем будет удалять файлы из списка uploaded.7
i=0
for i in {6..0}
do
echo $i
mv $to/uploaded.$i $to/uploaded.$[$i+1] done
#создать папку назначения для времнного хранения файлов и хранения лога со списками загруженных файлов
mkdir —parents —verbose $to# список баз данных
mysql -u $DBUSER -p$DBPASS -e «show databases;» > /tmp/databases.list# список исключения (Database is a part of SHOW DATABASES output) у меня не заработал, ругается на след. строчку отключил
EXCLUDES=( ‘Database’ ‘information_schema’ )
NUM_EXCLUDES=${#EXCLUDES[@]}#бэкапим базы данных
for database in `cat /tmp/databases.list`
do
skip=0let count=0
while [ $count -lt $NUM_EXCLUDES ] ; do
# check if this name in excludes list
if [ «$database» = ${EXCLUDES[$count]} ] ; then
let skip=1
fi
let count=$count+1
doneif [ $skip -eq 0 ] ; then
echo «++ $database»
echo «++ $database»>>$LOGFILE
# now we can backup current database
cd $to
backup_name=»$YEAR-$MONTH-$DAY.$database.backup.sql»
`/usr/bin/mysqldump —databases «$database» -u «$DBUSER» —password=»$DBPASS» > «$backup_name»`
echo » backup $backup_name»
`/bin/bzip2 «$backup_name»`
filez=»$backup_name.bz2″
curl —user $cname:$cpass -T $filez $caddr
echo $filez >>uploaded.0
/bin/rm $filez
echo » cleanup $backup_name»
fi
done
`/bin/rm /tmp/databases.list`
echo «********* MySQL backup is done! ***********»>>$LOGFILE
#########################
# backuping is www dir
#########################ls $patch > /tmp/dir.list
for dir in `cat /tmp/dir.list`
do
filez=»$YEAR-$MONTH-$DAY.$dir.backup.www.tar.gz»
tar -zcvpf $to/»$YEAR-$MONTH-$DAY.$dir.backup.www.tar.gz» $patch/$dir/
echo «***************************************************************»
echo «Uploading $filez»>>$LOGFILE
curl —user $cname:$cpass -T $filez $caddr
echo $filez >>uploaded.0
/bin/rm $filezdone
rm /tmp/dir.list
echo «******************* Dir backup is Done! ****************»#Удаление старых бэкапов
for dfile in `cat $to/upload.7`
do
curl —user $cname:$cpass —request DELETE https://webdav.yandex.ru/backup/$dfile
echo «Delete $dfile from cloud…»>>$LOGFILE
doneecho «**Purge old files is Done!**»>>$LOGFILE
HOURS=`date +%H`
MINUTES=`date +%M`
echo «*** Script Complite ***»
echo «Start Time: $HOURS:$MINUTES»>>$LOGFILE
Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.