Ниже хочу поделиться своими изысканиями на тему резервного копирования данных веб-проектов, размещенных на облачном сервере под управлением linux-системы (в моем случае, Debian Squeeze).
Для меня такой хостинг наиболее удачен, поскольку дает полный контроль над системой. Но есть и свои минусы, один из них состоит в том, что администрировать облачный сервер приходится самому. И среди прочего нужно позаботиться о создании резервных копий системы (в целом и/или отдельных ее частей) на случай краха облака (что, как показала практика, случается не редко).
Для начала нужно решить что будем архивировать. Я остановился на том, что что делать резервную копию всей системы по расписанию не целесообразно: изменяется она не так часто, а времени и ресурсов системы на такую архивацию затрачиваться будет много. Можно делать ее вручную, скажем после того как что-либо доставим или снесем. Например, так:
1 | tar -cvpzf backup.tar.gz --exclude=/lost+found --exclude=/backup.tgz / |
Ну и скопировать архив к себе на комп, на другой сервер или кому куда удобнее.
Но есть данные, которые меняются довольно часто, поэтому целесообразно делать их резервные копии по чаще, ну и соответственно не в ручную (потому как утомительно и точно забудешь сделать как раз перед падением системы). Для меня это база банных, файлы веб-сайтов и настройки системы. Расположено все это у меня в трех директориях:
/web
— файлы веб-сайтов, по умолчанию это/var/www
/mysql_data
— база данных; по умолчанию/var/lib/mysql
/etc
— настройки системы
Все это добро и будем спасать. У вас, конечно, набор может быть другим.
Передо мной стояло две основных цели: во-первых, сделать процесс автоматическим, для этого мы будем использовать скрипт запускаемый кроном, во-вторых, архивы должны храниться не в облаке, для этого будем использовать облачные хранилища. Я остановил свой выбор на Яндекс.Диск, потому как он поддерживает необходимые технологии, больше всех предоставляет бесплатного дискового пространства, ну и скорость. Но при желании можно воспользоваться любым другим сервисом, поддерживающим протокол WebDAV. Как вариант я рассматривал отправку архивов на почту, но быстро отбросил эту идею, т.к. у большинства почтовых сервисов есть ограничения на предельный размер вложения, и при разрастании проектов этот предел очень легко превзойти.
Начну, как раз с последнего, с Яндекс.Диска и как его настроить для нужных нам целей. Для начала если у кого-то нет аккаунта на Яндексе, его нужно сделать. Далее в почте идем на вкладку Диск (https://mail.yandex.ru/#disk/tab). При желании здесь можно увеличить объем и поудалять ненужные папки. Далее создаем папку, например, Backup (ну или можно в корень складывать архивы).
Взаимодействовать наш сервер с Яндекс.Диском будет с помощью утилиты davfs2 работающей по протоколу WebDAV. Поэтому устанавливаем утилиту:
1 | aptitude install davfs2 |
Утилите необходимо сообщить логин и пароль от Яндекс.Диска (точнее вашего аккаунта на Яндексе), чтоб каждый раз не вводить вручную. Открываем файл /etc/davfs2/secrets
в вашем любимом редакторе и в конце файла дописываем:
1 | https://webdav.yandex.ru:443 логин_в_яндексе пароль_в_яндексе |
Создаем папку, в которую будет монтироваться Яндекс.Диск (название можно любое):
1 | mkdir /mnt/yandex |
И монтируем диск:
1 | mount -t davfs https://webdav.yandex.ru:443 /mnt/yandex |
После этого Яндекс.Диск готов к использованию, к нему можно обращаться как к обычной директории. Что бы диск монтировался автоматически при старте системы можно добавить вышеуказанную команду в скрипт /etc/rc.local
.
А мы переходим к написанию скрипта архивации. Создаем файл скрипта, например, /sh/web_backup.sh
, делаем его исполняемым и открываем в вашем любимом редакторе.
Скрипт полностью:
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash /etc/init.d/mysql stop service apache2 stop tar -cvpzf /backup/web.tar.gz /web tar -cvpzf /backup/mysql_data.tar.gz /mysql_data tar -cvpzf /backup/etc.tar.gz /etc /etc/init.d/mysql start service apache2 start mv /backup/web.tar.gz /mnt/yandex/Backup mv /backup/mysql_data.tar.gz /mnt/yandex/Backup mv /backup/etc.tar.gz /mnt/yandex/Backup |
Теперь построчно. Для того, чтобы во время архивации не возникло никаких конфликтов из-за обращения к файлам других программ, останавливаем сервер mysql и apache:
1 2 | /etc/init.d/mysql stop service apache2 stop |
Если этого не сделать, то есть риск получить поврежденные данные в архиве.
Далее затариваем наши три директории:
1 2 3 | tar -cvpzf /backup/web.tar.gz /web tar -cvpzf /backup/mysql_data.tar.gz /mysql_data tar -cvpzf /backup/etc.tar.gz /etc |
Хотя Яндекс.Диск работает довольно быстро (для России) по сравнению с аналогами, архивировать напрямую в него лучше не стоит: как минимум процесс архивации может затянуть, а не забываем, что apache и mysql у нас выключены и сайты не доступны пользователям. Поэтому складываем наши архивы куда-либо внутри сервер (у меня директория /backup
).
После этого можно запустить apache и mysql:
1 2 | /etc/init.d/mysql start service apache2 start |
И далее просто перемещаем наши архива на Яндекс.Диск:
1 2 3 | mv /backup/web.tar.gz /mnt/yandex/Backup mv /backup/mysql_data.tar.gz /mnt/yandex/Backup mv /backup/etc.tar.gz /mnt/yandex/Backup |
Ну и наконец, нужно добавить наш скрипт в cron. Открываем crontab
, например, так:
1 | crontab -e |
Главное случайно не запустить crontab с параметром -r
: это удалит все задания для cron). Команда запустит редактор vi. Перемещаем курсор стрелочками на клавиатуре на последнюю строку и добавляем команду:
1 | 0 0 * * * /sh/web_backup.sh |
Чтобы сохранить изменения нажимаем Ctrl+O, затем для выхода из редактора Ctrl+X. Можно проверить, что все сохранилось, выведя список всех cron-задач командой:
1 | for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done |
Те, кто плохо дружит с vi могут открыть в своем любимом редакторе файл /etc/crontab
, но здесь строчка будет несколько отличаться:
1 | 0 0 * * * root /sh/web_backup.sh |
Эта строка будет запускать наш скрипт в 0 часов 0 минут каждый день. Вообще команды крон имеют следующий формат:
1 | минута час число месяц день_недели пользователь команда |
Минуты, часы, число, месяц и день недели задаются числами. Если вместо числа поставить звездочку (*), команда будет выполняться соответственно каждую минут, час, любого числа, каждый месяц, в любой день недели.
Тем, кто захочет вместо записи архивов на Яндекс.Диск отправлять их на почту, нужно будет проинсталировать mail:
1 | aptitude install mail |
1 | apt-get install mailutils |
1 | echo "текст письма" | mail -a путь_до_файла_архива -s "Тема письма" ваша_почта |
Обсуждение закрыто.