студия открытых решений о-никс
<< Доступ к файлам веб-сервера через FTP

Скрипт бэкапа

Не ленитесь делать бэкапы (резервные копии) своих веб-проектов. Иногда серверы хостинга падают, а сайты взламывают. Чтобы избежать проблем с восстановлением сайтов и веб-сервисов в этих случаях, нужно обязательно хранить свежии копии как файлов проекта (html, php и т.д.), так и баз данных. И хранить их нужно, конечно же, не на том же хосте, где размещен проект.

Чтобы избежать рутинной ручной работы по резервированию данных, нужно использовать главное оружие администратора Linux/UNIX-сервера - командную строку, скрипты и планировщик задач.

Пример скрипта бэкапа, который автоматически делает резервные копии файлов рабочего каталога сайта, веб-сервиса и чего еще душе угодно, а также делает резервную копию базы данных MySQL, после чего складывает их в назначенном каталоге и отправляет по FTP эти копии на резервный удаленный хост, предназначенный для хранения бэкапов и быстрого их разворачивания в случае падения первого:

#!/bin/bash

PROJNAME=mysite.ru #Имя проекта, сайта, веб-сервиса
CHARSET=utf8 #Кодировка базы данных (utf8)
DBNAME=mydbname #Имя БД, которую будем бэкапить, измените на свое
DBFILENAME=dumpdb #Имя дампа базы данных
ARFILENAME=backfiles #Имя архива с файлами
HOST=localhost #Хост MySQL
USER=username #Имя пользователя базы данных, измените на свое
PASSWD=YoUrPaSsW0Rd #Пароль от базы данных, измените на свой
DATADIR=/home/backup #Путь к каталогу, где будут храниться бэкапы
SRCFILES=/var/www/mysite/ #Путь к каталогу файлов для архивирования
PREFIX=`date +%F` #Префикс по дате
PREFIXDB=`date +%F--%H-%M` #Префикс копии БД

#start backup
echo "[----------[`date +%F--%H-%M`]----------]"
echo "[----------][`date +%F--%H-%M`] Запуск скрипта бэкапа..."
mkdir $DATADIR/$PREFIX 2> /dev/null
echo "[++--------][`date +%F--%H-%M`] Генерация бэкапа БД..."
#MySQL dump
mysqldump --user=$USER --host=$HOST --password=$PASSWD \
--default-character-set=$CHARSET $DBNAME > \
$DATADIR/$PREFIX/$DBFILENAME-$PREFIXDB.sql
if [[ $? -gt 0 ]];then
echo "[++---][`date +%F--%H-%M`] Прервано. Неудачная генерация бэкапа БД."
exit 1
fi
echo "[++++--][`date +%F--%H-%M`] Бэкап БД [$DBNAME] - удачно."
echo "[++++++-][`date +%F--%H-%M`] Копирование файлов проекта [$PROJNAME]..."
#Src dump
tar -czpf $DATADIR/$PREFIX/$ARFILENAME-$PREFIXDB.tar.gz \
$SRCFILES 2> /dev/null
if [[ $? -gt 0 ]];then
echo "[++++++-][`date +%F--%H-%M`] Прервано. Неудачное копирование файлов."
exit 1
fi
echo "[++++++++--][`date +%F--%H-%M`] Копирование файлов \
проекта [$PROJNAME] удачное."
echo "[+++++++++-][`date +%F--%H-%M`] Использование \
каталога (ЗАНЯТО): `du -h $DATADIR | tail -n1`"
echo "[+++++++++-][`date +%F--%H-%M`] Свободное место \
на диске: `df -h /home|tail -n1|awk '{print $4}'`"
echo "[++++++++++][`date +%F--%H-%M`] Все операции резервного \
копирования завершены удачно!"

# Отправляем на FTP, юзера и пароль - свои на доступ к FTP-серверу
ncftpput -u ftpuser -p FtPpAssWd myrezervhost.com /backups \
$DATADIR/$PREFIX/$DBFILENAME-$PREFIXDB.sql
if [[ $? -gt 0 ]];then
echo "[++++++----][`date +%F--%H-%M`] Прервано. Копирование \
$DBFILENAME-$PREFIXDB.sql на FTP неудачно."
exit 1
fi
echo "[++++++++++][`date +%F--%H-%M`] Копирование \
$DBFILENAME-$PREFIXDB.sql на FTP успешно."

ncftpput -u ftpuser -p FtPpAssWd myrezervhost.com /backups \
$DATADIR/$PREFIX/$ARFILENAME-$PREFIXDB.tar.gz
if [[ $? -gt 0 ]];then
echo "[++++++----][`date +%F--%H-%M`] Прервано. Копирование \
$ARFILENAME-$PREFIXDB.tar.gz на FTP неудачно."
exit 1
fi
echo "[++++++++++][`date +%F--%H-%M`] Копирование \
$ARFILENAME-$PREFIXDB.tar.gz на FTP успешно"

# Удаляем файлы и каталоги старше 7 дней
find $DATADIR -mtime +7 -delete

exit 0

В конце этот скрипт также удаляет старые каталоги и файлы, дата изменения которых старше 7 дней.

Запуск скрипта осуществляется по cron - как часто, смотрите уже из свойств своего проекта. Например, раз в сутки, или раз в неделю, если данные не часто меняются. Вот живой пример с одного из рабочих VPS-серверов:

0 */4 * * * /root/backup.sh | tee /var/log/backup.log

Если данные в БД меняются часто по сравнению с файлами, то скрипт можно разделить на два - одним чаще делать резервные копии базы данных, воторым - реже бэкапы файлов.

Если результаты работы требуется высылать на e-mail, то:

0 */4 * * * /root/backup.sh | mail -s "backup db" mail@o-nix.com

Можно также последовательно через пайп сначала генерировать в лог, после - отправлять на e-mail, в одной строке задания cron.

Чтобы старые файлы не скапливались на удаленном FTP-сервере, там тоже нужно запускать по крону удаление старых файлов.

<< Доступ к файлам веб-сервера через FTP

Поделиться в соцсетях:

система комментирования CACKLE
RSS