Данная статья расскажет как создать бэкап сайта и поможет настроить планировщик задач (cron) таким образом, чтобы он создавал резервные копии баз данных и данных Вашего сайта. А также сделаем возможность выгрузки бекапа на FTP.
Бэкап баз данных
Для того чтобы сделать бэкап базы данных достаточно запустить в командной строке:
mysqldump --opt -u user -p password database > /path/to/backup/filename.sql
Вместо user нужно вписать имя пользователя, password - пароль, database - имя базы данных, и вписать нужный путь и название файла для сохранения. Даная команда выгрузить только указаную БД и сохранит файл в указаную директорию без сжатия файла (в формате sql)
Для того чтобы выгрузить все БД указаного пользователя нужно вместо название БД написать опцию --all-databases :
mysqldump --opt -u user -p password --all-databases > /path/to/backup/filename.sql
Если же нужно сжать sql файл в архив gzip:
mysqldump --opt -u user -p password --all-databases | gzip -c -9 > /path/to/backup/filename.gz
Бэкап данных сайтов
Для бэкапа сайта нужно запустить в той же консоли такую команду:
tar -czf /path/to/backup/filename.tar.gz /path/to/site
Таким образом создастся архив gzip c данными Вашего сайта. Не забудьте заменить путь к бэкапу и сайту на свои директории предварительно создав их.
Автоматизация
Таким образом мы рассмотрели как можно сделать бэкапы Вашего сайта и БД, но вручную каждый раз запускать архивацию сайта неудобно, поэтому нужно добавить эти команды в планировщик задач.
Это можно сделать двумя способами:
Первый - самый простой, добавить обе команды непосредственно в cron. Это можно сделать или в Панели Управления сайтом, или же вручную в консоли:
crontab -e
и задать расписание по которому запускать скрипты, например:
30 2 * * * tar -czf /path/to/backup/filename.tar.gz /path/to/site > /dev/null 2>&1 30 3 * * * mysqldump --opt -u user -p password --all-databases | gzip -c -9 > /path/to/backup/filename.gz > /dev/null 2>&1
В первой строке запускается бэкап сайта в 2:30 каждый день, во второй - бэкап БД в 3:30 каждый день. "> /dev/null 2>&1" говорит, что стандартный вывод и сообщения об ошибках не нужно возвращать.
Второй способ - это создать скрипт с нужными нам командами и уже потом этот скрипт добавлять в cron.
Создаем файл /path/to/script/backup.sh:
#!/bin/bash # Делаем бэкап сайта tar -czf /path/to/backup/filename.tar.gz /path/to/site # Делаем бэкап БД mysqldump --opt -u user -p password --all-databases | gzip -c -9 > /path/to/backup/filename.gz
Обратите внимание, что в конце скрипта необходимо наличие отступа.
Добавляем скрипт в cron:
30 2 * * * /usr/bin/perl /path/to/script/backup.sh
Выгрузка на FTP
Часто появляется необходимость не только сделать бэкап сайта но и выгрузить его на сторонный FTP. Реализовать данную возможность поможет команда:
lftp -e "put /path/to/filename.gz & exit" -u username,pass 192.168.1.1
Данная команда выгружает на FTP только указаный файл. Если нужно выгрузить сразу несколько файлов или все файлы *.gz из директории:
lftp -c 'open -e "mput /path/to/*.gz " -u username,password 192.168.1.1 exit'
Окончательный скрипт будет выглядеть таким образом:
#!/bin/bash # Делаем бэкап сайта tar -czf /path/to/backup/filename.tar.gz /path/to/site # Делаем бэкап БД mysqldump --opt -u user -p password --all-databases | gzip -c -9 > /path/to/backup/filename.gz # Выгружаем все файлы .gz из директории на FTP lftp -c 'open -e "mput /path/to/backup/*.gz " -u username,password 192.168.1.1 exit'
Незабудьте только указать параметры пользователя к доступу на FTP и БД, адрес FTP сервера и путь для хранения бэкапов на сервере.
На этом и все, скрипт для бэкапа готов!
Здесь вы можете найти более улучшенную версию скрипта для бэкапа
Спасибо за внимание, будут вопросы пишите в комментариях!
Добавить бы в скрипт ротацию архивов, типа пять последних от каждого бэкапа оставляет а шестые удаляет. :)
как исключить одну или несколько папок?
Чтобы исключить директорию или файл, используйте ключ --exclude='/directory/file'
Например, чтобы исключить директорию cache из каталога '/var/www.site.ru' то нужно сделать так
tar -czf /home/backup/site.ru.tar.gz --exclude='/var/www.site.ru/cache' /var/www.site.ru
чтобы создалась пустая папка cache но без файлов
tar -czf /home/backup/filename.tar.gz --exclude='/var/www.site.ru/cache/*' /var/www.site.ru