Найти тему
Битрикс и не только

Бэкапирование проектов 1С-Битрикс

Всем привет.

В битриксе есть своя система для создания резервных копий, но для больших проектов, на мой взгляд, она не очень подходит. Сегодня я расскажу о своем методе создания бэкапов проектов на Битриксе.

Что будем сохранять:

  • Папку проекта
  • Отдельно папку upload
  • Базу данных

Что будем использовать:

  • Bash скрипт для сохранения базы
  • Bash скрипт для импорта базы
  • Утилиту backup-manager
  • Bash скрипт выполняющий все действия

Начнем с копии базы.

Обычно дамп всей базы данных хранят в одном файле, из чего возникает ряд неудобств:

  • Установленный битрикс содержит очень большое количество таблиц
  • Трудно извлечь данные одной или нескольких таблиц
  • Большой размер дампа

Наш скрипт будет делать дамп отдельно для каждой таблицы

Сначала организуем структуру хранения данных:

В папке mnt корня нашего раздела создадим папки:

  • backup_db -тут буду храниться файлы с дампом каждой таблицы для каждой базы
  • backup_data_db - папка с архивами баз (нужна для выгрузки по фтп)
  • backup_data - архивы проектов

Создадим в папке /root sh файл backup_db.sh со следующим содержимым:

#!/bin/bash
PASSWORD=$3;
HOST='localhost'
USER=$2
BASE=$1
if [ -n "$BASE" ] && [ -n "$USER" ] && [ -n "$PASSWORD" ]
then
DIR="/mnt/backup_db/$BASE/"
mkdir -p $DIR
# удаляем старые бэкапы этой базы
cd $DIR
rm -rf *
# делаем дампы
db=`mysql -u $USER -h $HOST -p$PASSWORD $BASE -Bse 'show tables'`
for n in $db; do
mysqldump -u $USER -h $HOST -p$PASSWORD $BASE $n > "$DIR$n.sql"
#sleep 1
done
else
echo "Не указаны параметры соединения"
fi

Используемые переменные:

HOST - хост для подключения к базе

BASE - имя бд (также будет называться папка)

USER - пользователь бд

PASSWORD - пароль пользователя

Описание работы скрипта:

При запуске скрипт будет удалять папку с прошлым бэкапом базы(если такая имеется), далее подключается к базе, делает запрос show tables, для получения списка таблиц базы и циклом создает дамп каждой таблицы.

Для запуска нужна подключиться по ssh под рутом и из домашней папки выполнить скрипт

./backup_db.sh имя базы имя пользователя пароль

Если после завершения работы скрипта в папке /mnt/backup_db появились файлы дампов - все прошло успешно.

Сразу создадим обратный скрипт, который будет импортировать таблицы.

В папке /root создадим файk import_tables.sh:

#!/bin/bash
HOST='localhost'
BASE=$1
USER=$2
PASSWORD=$3;
if [ -n "$BASE" ] && [ -n "$USER" ] && [ -n "$PASSWORD" ]
then
DIR="/mnt/backup_db/$BASE/"
cd $DIR
#-h $HOST
for n in `ls`; do
mysql -u $USER -p$PASSWORD $BASE < "$n"
#echo $n
done
else
echo "Не указаны параметры соединения"
fi

Описание работы скрипта:

Скрипт смотри папку /mnt/backup_db/имя_базы, в цикле импортирует каждый файл в базу.

Пока оставим базу и перейдем к утилите backup-manager

Установка под Debian

apt-get install backup-manager

После установки в папке /etc/ должен появиться файл со стандартным конфигом

Backup-manager.conf

Мы будем запускать backup-manager используя свои конфигурации(их будет 3: базы, папка сайта(без upload) и отдельно upload). Можно придумать и другую схема, но эта мне показалась оптимальной.

Создадим в папке /etc/ папку backup-manager-conf

В ней разместим три конфига:

  • backup-manager-sites-with_core_and_no_upload.conf
  • backup-manager-upload.conf
  • backup-manager-db.conf

Мой вариант конфига backup-manager-sites-with_core_and_no_upload.conf

export BM_DAILY_CRON="false"
export BM_REPOSITORY_ROOT="/mnt/backup_data"
export BM_TEMP_DIR="/mnt/tmp"
export BM_REPOSITORY_SECURE="true"
export BM_REPOSITORY_USER="root"
export BM_REPOSITORY_GROUP="root"
export BM_REPOSITORY_CHMOD="770"
export BM_UPLOAD_FTP_TIMEOUT="900"
export BM_ARCHIVE_CHMOD="660"
export BM_ARCHIVE_TTL="1"
export BM_ARCHIVE_FREQUENCY="daily"
export BM_REPOSITORY_RECURSIVEPURGE="false"
export BM_ARCHIVE_PURGEDUPS="true"
export BM_ARCHIVE_PREFIX="$HOSTNAME"
export BM_ARCHIVE_STRICTPURGE="true"
export BM_ARCHIVE_NICE_LEVEL="10"
export BM_ARCHIVE_METHOD="tarball"
export BM_TARBALL_NAMEFORMAT="long"
export BM_TARBALL_FILETYPE="tar.gz"
export BM_TARBALL_OVER_SSH="false"
export BM_TARBALL_DUMPSYMLINKS="false"
declare -a BM_TARBALL_TARGETS
BM_TARBALL_TARGETS[0]="путь к вашему проекту от корня"
BM_TARBALL_TARGETS[1]="путь к вашему проекту от корня"
export BM_TARBALL_TARGETS
export BM_TARBALL_BLACKLIST="путь к вашему проекту от корня/upload"
export BM_TARBALL_SLICESIZE="1000M"
export BM_TARBALL_EXTRA_OPTIONS=""
export BM_TARBALLINC_MASTERDATETYPE="weekly"
export BM_TARBALLINC_MASTERDATEVALUE="1"
export BM_PIPE_COMMAND
export BM_PIPE_NAME
export BM_PIPE_FILETYPE
export BM_PIPE_COMPRESS
#выгрузка по FTP
export BM_UPLOAD_METHOD="ftp"
#имя фтп поьзователя
export BM_UPLOAD_FTP_USER=""
# его пароль
export BM_UPLOAD_FTP_PASSWORD=""
# хост для подключения
export BM_UPLOAD_FTP_HOSTS=""
# путь на удаленном сервере
export BM_UPLOAD_FTP_DESTINATION=""
export BM_UPLOADFTP_TTL="2"
export BM_UPLOAD_FTP_PURGE="true"
export BM_LOGGER="true"
export BM_LOGGER_LEVEL="warning"
export BM_LOGGER_FACILITY="user"

Основные настройки:

BM_REPOSITORY_ROOT - папка куда будут складываться архивы

BM_TARBALL_TARGETS - массив путей папок, которые будем бэкапить

BM_TARBALL_BLACKLIST - исключения, перечислять через запятую. В данном случае мы исключаем папку upload.

В моем примере показан способ выгрузки по фтп. Другие вариант есть в стандартном конфиге. Если не собираетесь выгружать удалите настройки BM_UPLOAD_METHOD и все, что начинается с BM_UPLOAD_FTP

Для конфига backup-manager-upload.conf измените BM_TARBALL_TARGETS на пути к папкам upload ваших проектов. Все остальное можно оставить. В конфиге backup-manager-db.conf изменим BM_REPOSITORY_ROOT на /mnt/backup_data_db, а в BM_TARBALL_TARGETS укажем пути для папок с таблицами наших баз. Backup-manager создаст архивы из этих папок и выгрузит их(если это задано в конфиге)

Теперь, когда у нас почти все готово, создадим bash скрипт, который будет выполнять все действия. В папке /root создадим файл backupper.sh :

#!/bin/bash
# очищаем папки от старых бэкапов
rm -rf /mnt/backup_db
rm -rf /mnt/backup_data/*
rm -rf /mnt/backup_data_db/*
rm -rf /mnt/backup_upload/*
#step1 - создаем дампы
~/backup_db.sh ИМЯ БАЗЫ ПОЛЬЗОВАТЕЛЬ ПАРОЛЬ
~/backup_db.sh ИМЯ БАЗЫ2 ПОЛЬЗОВАТЕЛЬ ПАРОЛЬ
# Запуск заданий bc-manager
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-db.conf
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-upload.conf
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-sites-with_core_and_no_upload.conf

Все готово. Можно запускать из консоли:

./backupper.sh

И ждем, процесс может длиться в долго. Если все прошло успешно, ставим данный скрипт в крон и наслаждаемся результатом.

Советую ознакомиться с возможностями backup-manager, т.к. Описанное мною, далеко, не все, что он умеет (а умеет он очень много).

Спасибо за внимание! На Ваши вопросы, с радостью, отвечу в комментариях!