заметки на полях

Блокнот разработчика

Backup проекта

Люди делятся на тех кто еще не делает
и тех, кто уже делает бэкапы

Обязательным свойством любого проекта являются резервное сохранение данных. И так, приступим. Допустим все данные у нас хранятся в БД (в моем случае mysql, но если это postgres – отличие будет в одной строчке) и существуют различные файлы загружаемые пользователями. Файлы проекта хранятся в репозитории, поэтому за их сохранность можно не беспокоиться (можно на всякий случай еще сохранять конфиг). Так же понадобится другая машина для сохранения бэкапов, более чем достаточно иметь FTP на другой машине.

UPD: Немного подчищен код и приведен к соответствию соглашениям.

Начнем с сохранения БД:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

# Данные для подключения к БД
DBUSER="dbuser"
DBNAME="dbname"
DBPASS="password"

# Дата, для именования файла бэкапа в формате YYYY.MM.DD
DT=`date '+%Y.%m.%d'`
# Временная директория для хранения файлов
TEMPDIR="/tmp/backup-"$DT"/"
SQLFILE="backup.sql"

mkdir $TEMPDIR
cd $TEMPDIR

mysqldump --user=$DBUSER --password=$DBPASS $DBNAME > $SQLFILE

Итак у нас теперь есть дамп БД и мы знаем какие пользовательские файлы необходимо сохранять. Собираем их в один архив, сжимаем его и кладем через FTP на другую машину. В итоге получается следующий скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh

# Данные для подключения к БД
DBUSER="dbuser"
DBNAME="dbname"
DBPASS="password"

# Данные для подключения по FTP
FTPUSER='ftpuser'
FTPHOST='ftp.svdev.ru'
FTPPASS='password'

# Дата, для именования файла бэкапа в формате YYYY.MM.DD
DT=`date '+%Y.%m.%d'`
# Временная директория для хранения файлов
TEMPDIR="/tmp/backup-"$DT"/"
SQLFILE="backup.sql"
# Путь на FTP куда положим файл
# !!! Путь от корня домашней директории FTP
REMOTEDIR="backups/svdev"
# Файл архива
DESTFILE=$DT".tar"

TARFILES=" -C /var/www/svdev/htdocs wp-config.php -C /var/www/svdev/htdocs/wp-content uploads -C "$TEMPDIR" backup.sql"

mkdir $TEMPDIR
cd $TEMPDIR
mysqldump --user=$DBUSER --password=$DBPASS $DBNAME > $SQLFILE
tar cf $DESTFILE $TARFILES
gzip -9 $DESTFILE
ftp -n $FTPHOST <<EOF
quote USER $FTPUSER
quote PASS $FTPPASS
binary
cd $REMOTEDIR
put $DESTFILE".gz"
quit
EOF


# Удаляем за собой все временные файлы
rm -rf $TEMPDIR

exit 0

Вот в принципе и все, осталось прописать его в крон и можно наслаждаться результатом.

Данный пример является самым простым, что хотелось бы добавить:

  • вынесение алгоритма в общий шаблон, а для проекта оставить только определение констант. Таким образом при наличии нескольких проектов – подключение/отключение бэкапов будет задаваться одним симлинком
  • скрипта для удаления старых бэкапов (в данной схеме это необходимо делать вручную)

Можно скачать приведенный пример: backup.tar.gz и поэксперементировать с ним в свое удовольствие.

Использованный полезный материал:

Tags: , ,

2 Responses to “Backup проекта”

  1. alxrem Says:

    Серёга, не юзай верблюда в шелле, козлёночком станешь. :)

  2. Дерябин Сергей Says:

    Ну вроде внес изменения согласно поступившим замечаниям :)

Leave a Reply