Каждый человек занимающийся разработкой и поддержкой сайтов сегодня знает о необходимости бэкапов, но многие по прежнему так их и не делают. В этой короткой заметке я расскажу о простейшем механизме резервирования не основанном ни на одном стороннем модуле и использующем только встроенные в Unix системы приложения. Хранить все данные мы будем на стороннем FTP сервере. Думаю, не нужно объяснять почему не стоит хранить все яйца в одной корзине (бэкапы вместе с основными файлами). Чуть позже попробую написать как отправлять бэкапы на бесплатные облачные сервера и таким образом ничего за них не платить.
В качестве FTP сервера для хранения я использую услугу Диск для Бэкапов на сервере FirstVDS. Внешний диск для хранения данных стоит всего 3 рубля в месяц за каждый гигабайт. Но сохранять наши данные можно на любой FTP сервер.
Бэкап базы данных
Воспользуемся стандартной утилитой mysqldump. Будем бэкапить все базы существующие на сервере, для этого нам нужен пользователь обладающими правами доступа к ним всем. Можно, конечно, воспользоваться пользователем root, но лучше создать нового. Я назвал его backup и предоставил необходимые права для проведения всех операций. Ничего, что могло бы навредить структуре данных (см. рисунок).
Теперь создадим 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
Если статья была Вам полезна, то буду благодарен за клик по рекламе.