Простой автоматический backup сайта на своем сервере

sddefaultКаждый человек занимающийся разработкой и поддержкой сайтов сегодня знает о необходимости бэкапов, но многие по прежнему так их и не делают. В этой короткой заметке я расскажу о простейшем механизме резервирования не основанном ни на одном стороннем модуле и использующем только встроенные в Unix системы приложения. Хранить все данные мы будем на стороннем FTP сервере. Думаю, не нужно объяснять почему не стоит хранить все яйца в одной корзине (бэкапы вместе с основными файлами). Чуть позже попробую написать как отправлять бэкапы на бесплатные облачные сервера и таким образом ничего за них не платить.

В качестве FTP сервера для хранения я использую услугу Диск для Бэкапов на сервере FirstVDS. Внешний диск для хранения данных стоит всего 3 рубля в месяц за каждый гигабайт. Но сохранять наши данные можно на любой FTP сервер.

Бэкап базы данных

Воспользуемся стандартной утилитой mysqldump. Будем бэкапить все базы существующие на сервере, для этого нам нужен пользователь обладающими правами доступа к ним всем. Можно, конечно, воспользоваться пользователем root, но лучше создать нового. Я назвал его backup и предоставил необходимые права для проведения всех операций. Ничего, что могло бы навредить структуре данных (см. рисунок).

backup mysql user

 

Теперь создадим sh скрипт для создания самого файла бэкапа. Он состоит из 3х частей — настройка переменных, создание копии БД и отправка полученного файла на FTP сервер. Файл будем именовать на основе текущей даты.

#!/bin/sh

DATE=`date +%d%m%Y`
LOCAL_BACKUP_DIR="/tmp/mysql_backup/"
DB_USER="backup"
DB_PASSWORD="dbpassword"
FTP_SERVER="urlto.ftpserver.ru"
FTP_USERNAME="username"
FTP_PASSWORD="password"
FTP_UPLOAD_DIR="/mysql_backup/"

############### Local Backup ########################

mysqldump -A -u $DB_USER -p$DB_PASSWORD $DB_NAME | gzip > $LOCAL_BACKUP_DIR/$DATE.sql.gz

############### UPLOAD to FTP Server ################


ftp -n $FTP_SERVER << EndFTP
user "$FTP_USERNAME" "$FTP_PASSWORD"
binary
hash
cd $FTP_UPLOAD_DIR
#pwd
lcd $LOCAL_BACKUP_DIR
put "$DATE.sql.gz"
bye
EndFTP

if test $? = 0
then
 echo "Database Successfully Uploaded to Ftp Server
 File Name $DATE.sql.gz "
else
 echo "Error in database Upload to Ftp Server"
fi

Запуск всех скриптов будем выполнять cron’ом:

0 4 * * 7       /home/www/mysql_backup.sh

Запуск каждое воскресенье в 4 часа ночи.

Не забываем создать папку для файлов на локальном сервере

mkdir /tmp/mysql_backup

И на FTP сервере

# ftp
ftp> open urlto.ftpserver.ru
Connected to urlto.ftpserver.ru
220 (vsFTPd 2.2.2)
Name (urlto.ftpserver.ru:username): username
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir mysql_backup
"/mysql_backup" created
ftp> exit
221 Goodbye.

Бэкап файлов

Файлы будем отправлять на FTP похожим образом — архивируем необходимую папку и отправляем на FTP.

Создавать архив будем командой tar, где первый параметр место назначения, а второй папка для архивирования.

tar -zcvf /tmp/backups/example.com.tar.gz /home/www/public_html/example.com/

Если предварительно перейти в каталог который будем архивировать, то при распаковке архива получим только содержимое директории.


Основной скрипт создания бэкапов файлов

#!/bin/sh

TIME=`date "+%d%m%Y"`; # Date
FILENAME="archive.$TIME" # Archive name
DIR="/home/www/public_html/" # Dir for backup
BACKUPDIR="/tmp/backups" # Backup dir

FTP_SERVER="urlto.ftpserver.ru"
FTP_USERNAME="username"
FTP_PASSWORD="password"
FTP_UPLOAD_DIR="/file_backup/"

cd $DIR
tar -czf $BACKUPDIR/$FILENAME.tar.gz ./

############### UPLOAD to FTP Server ################


ftp -n $FTP_SERVER << EndFTP
user "$FTP_USERNAME" "$FTP_PASSWORD"
binary
hash
cd $FTP_UPLOAD_DIR
#pwd
lcd $BACKUPDIR
put "$FILENAME.tar.gz"
bye
EndFTP

if test $? = 0
then
 echo "Files Successfully Uploaded to Ftp Server
 File Name $FILENAME.tar.gz "
else
 echo "Error in files Upload to Ftp Server"
fi


Так же не забываем создать требуемые каталоги на локальном и удаленном сервере и добавляем в крон аналогично предыдущему скрипту. Время срабатывания крона для файлов можно поставить и побольше.

0 5 15 */3 *    /home/www/folderbackup.sh 
#15 числа каждые 3 месяца в 5 утра

Важно! При запуске из крона указывайте полный путь до запускаемых в скрипте приложений, в нашем случае до mysqldump. Узнать его можно командой whereis

 # whereis mysqldump
mysqldump: /usr/local/bin/mysqldump /usr/local/man/man1/mysqldump.1.gz

В качестве доработок чтобы не засорять место можем чистить созданные архивы на локальном сервер. Для этого после отправки на FTP сервер необходимо добавить команду:

rm "$BACKUPDIR/$FILENAME.tar.gz" #для удаления бэкапа папки

Можно объединить два скрипта в один если нет необходимости бэкапить несколько папок в различных местах. Или отправить результат работы скрипта на почту:

echo "Files Successfully Uploaded to Ftp Server 
File Name $FILENAME.tar.gz " | mail -s "Succsess Files Backup" user@mail.ru

Если статья была Вам полезна, то буду благодарен за клик по рекламе.

Запись опубликована в рубрике MySQL, PHP, Администрирование, Безопасность с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *