Продукты Р7
Корпоративный сервер 2024
Корпоративный сервер 2024
Сервер документов
Сервер документов
Редакторы документов
Редакторы документов
Корпоративный сервер 2019
Корпоративный сервер 2019
Графика
Графика
ВКС и мессенджер
ВКС и мессенджер
Мобильные редакторы
Мобильные редакторы
Почтовый сервер
Почтовый сервер
Органайзер
Органайзер
Сервер лицензирования
Сервер лицензирования
Файл-Экспресс
Файл-Экспресс
Аналитика
Аналитика
Дополнительно
Часто задаваемые вопросы
Разработчикам
Интеграции
Новые возможности

Резервное копирование/восстановление Корпоративный сервер 2024 архитектура Middle

Обновлено: 13.10.26

Инструкция актуальна для версий продукта: 2.0.2024.14752 – 2026.3.6.17475

Хранилище файлов NFS, без встроенного почтового сервера

Краткое описание

Для работы скриптов необходимо наличие установленного rsync на серверах, участвующих в схеме Корпоративного сервера, и на сервере, с которого запускается скрипт. На сервере, с которого запускается скрипт, необходимо установить lbzip2 (в скрипте есть проверка). Рекомендуется использовать скрипт на NFS сервере или другом сервере централизованном хранении данных.

Скрипт копирует и архивирует информацию из каталогов:

Сервер с ролью Диск:

  • /etc/supervisor (в REDOS /etc/supervisord.d)
  • /opt/r7-office
  • /var/r7-office
  • /var/www/r7-office

Сервер с ролью Сервер документов:

  • /etc/r7-office
  • /var/www/r7-office

Сервер с ролью Поиск:

  • /opt/r7-office
  • /var/r7-office
  • /etc/supervisor (в REDOS /etc/supervisor.d)

Сервер с ролью NFS:

  • /mnt/nfs

Перед запуском необходимо указать следующие данные

  1. Если для доступа к серверам используется доступ по ключу, вписать путь;
  2. Если подключение выполняется без ключа, необходимо изменить параметры подключения в командах rsync и SSH;
  3. Если для доступа по ssh используется нестандартный порт, так же нужно указать в командах;
  4. Нужно ввести адреса серверов согласно их ролям.

Описание переменных

ПеременнаяОписание
BACKUP_DIR=/backup/corpportalПапка для хранения архивов
BACKUP_DATE=$(date +'%Y-%m-%d')Формат даты для имени архива
SSH_KEY_PATH=/backup/id_rsaПуть к SSH-ключу
SSH_PORT=22SSH-порт, по которому осуществляется подключение к серверам
NUM_CORES=$(($(nproc)/2))Для работы архиватора по умолчанию берётся половина ядер на сервере бэкапа
DS_IP=172.16.10.11Адрес сервера с ролью Сервер документов
KS_IP=172.16.10.12Адрес сервера с ролью Диск
SRCH_IP=172.16.10.13Адрес сервера с ролью Поиск
NFS_IP=172.16.10.14Адрес сервера с ролью NFS
BACKUP_FILEИмя файла с архивом для восстановления

Список переменных с адресами серверов вынесен в отдельный файл backup.conf:

BACKUP_DIR="/backup/corpportal"

BACKUP_DATE=$(date +'%Y-%m-%d')

SSH_KEY_PATH="/backup/id_rsa"

SSH_PORT=22

NUM_CORES=$(( ($(nproc) + 1) / 2 ))

DS_IP="172.16.10.11"

KS_IP="172.16.10.12"

SRCH_IP="172.16.10.13"

NFS_IP="172.16.10.14"

LOG_FILE="$BACKUP_DIR/backup_${BACKUP_DATE}.log" #Имя файла содержит дату

Пример скрипта для создания резервной копии

#!/bin/bash

# Путь до файла конфигурации
source backup.conf

# Вызов функции cleanup после выполнения прерывания
trap cleanup INT TERM
trap cleanup_exit EXIT

cleanup() {
log_info "Завершение скрипта после прерывания..."
exit 1
}

cleanup_exit() {
log_info "Завершение скрипта..."
# ВАЖНО: не завершаем с ошибкой при нормальном выходе
# (если нужно всегда 1 — верни как было)
return 0
}

# Функции логирования
log_info() {
echo "$(date +'%Y-%m-%d %H:%M:%S') INFO: $1" | tee -a "$LOG_FILE"
}

log_warn() {
echo "$(date +'%Y-%m-%d %H:%M:%S') WARN: $1" | tee -a "$LOG_FILE"
}

log_error() {
echo "$(date +'%Y-%m-%d %H:%M:%S') ERROR: $1" | tee -a "$LOG_FILE"
}

# Создаём backup каталог
mkdir -p "$BACKUP_DIR"

# Проверка, установлен ли lbzip2 и rsync
if ! command -v lbzip2 &> /dev/null; then
log_error "Ошибка: lbzip2 не установлен. Установите lbzip2 и повторите попытку."
exit 1
fi

if ! command -v rsync &> /dev/null; then
log_error "Ошибка: rsync не установлен. Установите rsync и повторите попытку."
exit 1
fi

# Если NUM_CORES не задан в backup.conf — используем nproc
if [ -z "${NUM_CORES:-}" ]; then
NUM_CORES=$(nproc)
fi

# Функция для получения пути до директории supervisor
get_supervisor_dir() {
local server=$1
local supervisor_dir=""

if ssh -i "$SSH_KEY_PATH" -p "$SSH_PORT" root@"$server" "test -d /etc/supervisord.d" 2>/dev/null; then
supervisor_dir="/etc/supervisord.d"
elif ssh -i "$SSH_KEY_PATH" -p "$SSH_PORT" root@"$server" "test -d /etc/supervisor" 2>/dev/null; then
supervisor_dir="/etc/supervisor"
else
log_error "Не найден каталог supervisor на сервере $server"
return 1
fi

echo "$supervisor_dir"
return 0
}

rsync_msg() {
local code_err=$1
local host_ip=$2

if [ "$code_err" -eq 23 ]; then
log_error "Ошибка: rsync не установлен или произошла другая фатальная ошибка на удалённом хосте $host_ip (code 23). Проверьте rsync/сеть."
exit 1
elif [ "$code_err" -ne 0 ]; then
log_error "Ошибка rsync (code $code_err) при копировании с $host_ip. Смотрите лог: $LOG_FILE"
exit 1
fi

log_info "Копирование с $host_ip завершено успешно."
}

get_databases() {
# Забираем конфиг с KS, чтобы получить HOST/USER/PASS/PORT (и основное имя БД)
scp -i "$SSH_KEY_PATH" -P "$SSH_PORT" root@"$KS_IP":/opt/r7-office/Api/appsettings.json .
if [ $? -eq 0 ]; then
log_info "Файл конфигурации удалось скопировать"
else
log_error "Файл конфигурации не удалось скопировать"
exit 1
fi

local DB_PATH_PARAM=./appsettings.json

PSQL_HOST=$(grep -oP "Host=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_DB_NAME=$(grep -oP "Database=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_USER=$(grep -oP "Username=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_PASS=$(grep -oP "Password=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_PORT=$(grep -oP "Port=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)

export PGPASSWORD="$PSQL_PASS"

log_info "DB_HOST=$PSQL_HOST DB_PORT=$PSQL_PORT DB_USER=$PSQL_USER DB_NAME=$PSQL_DB_NAME"

rm -f "$DB_PATH_PARAM"

# Дата для имени дампов/архива (без пробелов/двоеточий)
BACKUP_DATE=$(date +'%Y-%m-%d_%H-%M-%S')

# Очистка от старых дампов
rm -f "$BACKUP_DIR"/cddisk_db_*.dump "$BACKUP_DIR"/pagesdb_db_*.dump

dump_db() {
local dbname="$1"
local prefix="$2"
local out_file="$BACKUP_DIR/${prefix}_${BACKUP_DATE}.dump"

log_info "Создание дампа БД $dbname -> $out_file"
pg_dump -v -h "$PSQL_HOST" -p "$PSQL_PORT" -U "$PSQL_USER" -d "$dbname" -F c -c -f "$out_file"
if [ $? -eq 0 ]; then
log_info "Дамп $dbname успешно создан"
else
log_error "Дамп $dbname создан с ошибкой"
exit 1
fi

echo "$out_file"
}

# 1) Дамп БД из конфига (обычно cddisk)
cddisk_dump_file=$(dump_db "$PSQL_DB_NAME" "cddisk_db")

# 2) Дамп pagesdb (тот же сервер/учётка)
pagesdb_dump_file=$(dump_db "pagesdb" "pagesdb_db")
}

# Время начала создания бэкапа
START_BACKUP_TIME=$(date +'%Y-%m-%d %H:%M:%S')
log_info "Начало резервного копирования: $START_BACKUP_TIME"

# Получить каталоги supervisor
KS_SUPERVISOR_DIR=$(get_supervisor_dir "$KS_IP") || exit 1
SRCH_SUPERVISOR_DIR=$(get_supervisor_dir "$SRCH_IP") || exit 1

# Подготовка каталогов
mkdir -p "$BACKUP_DIR/ds/etc/r7-office"
mkdir -p "$BACKUP_DIR/ds/var/www/r7-office"
mkdir -p "$BACKUP_DIR/ks/$KS_SUPERVISOR_DIR"
mkdir -p "$BACKUP_DIR/ks/opt/r7-office"
mkdir -p "$BACKUP_DIR/ks/var/r7-office"
mkdir -p "$BACKUP_DIR/ks/var/www/r7-office"
mkdir -p "$BACKUP_DIR/srch/opt/r7-office"
mkdir -p "$BACKUP_DIR/srch/$SRCH_SUPERVISOR_DIR"
mkdir -p "$BACKUP_DIR/srch/var/r7-office"
mkdir -p "$BACKUP_DIR/nfs/mnt/"

# Получить дампы баз
get_databases

# RSYNC копирование данных с удаленных серверов
log_info "Начало копирования с сервера $DS_IP из каталога /etc/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$DS_IP":/etc/r7-office "$BACKUP_DIR/ds/etc/r7-office/"
rsync_msg $? "$DS_IP"

log_info "Начало копирования с сервера $DS_IP из каталога /var/www/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$DS_IP":/var/www/r7-office "$BACKUP_DIR/ds/var/www/r7-office/"
rsync_msg $? "$DS_IP"

log_info "Начало копирования с сервера $KS_IP из каталога $KS_SUPERVISOR_DIR"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$KS_IP":"$KS_SUPERVISOR_DIR" "$BACKUP_DIR/ks/$KS_SUPERVISOR_DIR/"
rsync_msg $? "$KS_IP"

log_info "Начало копирования с сервера $KS_IP из каталога /opt/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$KS_IP":/opt/r7-office "$BACKUP_DIR/ks/opt/r7-office/"
rsync_msg $? "$KS_IP"

log_info "Начало копирования с сервера $KS_IP из каталога /var/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$KS_IP":/var/r7-office "$BACKUP_DIR/ks/var/r7-office/"
rsync_msg $? "$KS_IP"

log_info "Начало копирования с сервера $KS_IP из каталога /var/www/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$KS_IP":/var/www/r7-office "$BACKUP_DIR/ks/var/www/r7-office/"
rsync_msg $? "$KS_IP"

log_info "Начало копирования с сервера $SRCH_IP из каталога /opt/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$SRCH_IP":/opt/r7-office "$BACKUP_DIR/srch/opt/r7-office/"
rsync_msg $? "$SRCH_IP"

log_info "Начало копирования с сервера $SRCH_IP из каталога $SRCH_SUPERVISOR_DIR"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$SRCH_IP":"$SRCH_SUPERVISOR_DIR" "$BACKUP_DIR/srch/$SRCH_SUPERVISOR_DIR/"
rsync_msg $? "$SRCH_IP"

log_info "Начало копирования с сервера $SRCH_IP из каталога /var/r7-office"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$SRCH_IP":/var/r7-office "$BACKUP_DIR/srch/var/r7-office/"
rsync_msg $? "$SRCH_IP"

log_info "Начало копирования с сервера $NFS_IP из каталога /mnt/nfs"
rsync -avz --partial -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" root@"$NFS_IP":/mnt/ "$BACKUP_DIR/nfs/mnt/"
rsync_msg $? "$NFS_IP"

# Создание архива с бэкапом (BACKUP_DATE задан в get_databases)
log_info "Формируется архив..."
tar cvf "$BACKUP_DIR/cddisk-${BACKUP_DATE}.tar.bz2" \
--selinux \
--use-compress-prog="lbzip2 -k -n$NUM_CORES" \
"$BACKUP_DIR/ds/etc/r7-office" \
"$BACKUP_DIR/ds/var/www/r7-office" \
"$BACKUP_DIR/ks/$KS_SUPERVISOR_DIR" \
"$BACKUP_DIR/ks/opt/r7-office" \
"$BACKUP_DIR/ks/var/r7-office" \
"$BACKUP_DIR/ks/var/www/r7-office" \
"$BACKUP_DIR/srch/opt/r7-office" \
"$BACKUP_DIR/srch/$SRCH_SUPERVISOR_DIR" \
"$BACKUP_DIR/srch/var/r7-office" \
"$BACKUP_DIR/nfs/mnt/nfs" \
"$cddisk_dump_file" \
"$pagesdb_dump_file"

if [ $? -eq 0 ]; then
log_info "Архив успешно создан"
else
log_error "Архив создан с ошибкой"
exit 1
fi

# Время завершения бэкапирования
END_BACKUP_TIME=$(date +'%Y-%m-%d %H:%M:%S')
log_info "Завершение резервного копирования: $END_BACKUP_TIME"

# Время в секундах работы бэкапирования
START_TIMESTAMP=$(date -d "$START_BACKUP_TIME" +%s)
END_TIMESTAMP=$(date -d "$END_BACKUP_TIME" +%s)
TOTAL_DURATION=$((END_TIMESTAMP - START_TIMESTAMP))
log_info "Общее время выполнения: $TOTAL_DURATION секунд"

log_info "Резервное копирование завершено: $(date +'%Y-%m-%d %H:%M:%S')"

Восстановление из архива

Обратите внимание

Если при восстановлении изменились адреса серверов в архитектуре, возможны ошибки в работе Корпоративного сервера 2024. Необходимо проверить все настройки, связанные с этими серверами, в соответствии с инструкцией по установке.

Пример конфигурационного файла restore.conf

# Каталог для распаковки и восстановления
BACKUP_DIR="/backup/corpportal"
# Дата создания резервной копии
BACKUP_DATE="2024-04-23"
# Полный путь к архиву резервной копии
ARCHIVE_PATH="/backup/corpportal/cddisk-2024-04-23.tar.bz2"
 
# SSH-подключение
SSH_KEY_PATH="/backup/id_rsa"
SSH_PORT=22
 
# Сервер документов
DS_IP="172.16.10.11"
 
# Корпоративный сервер (Диск)
KS_IP="172.16.10.12"
 
# Сервер поиска
SRCH_IP="172.16.10.13"
 
# Сервер NFS
NFS_IP="172.16.10.14"
 
# Файл журнала восстановления
LOG_FILE="$BACKUP_DIR/restore_${BACKUP_DATE}.log"
Важно

Нюансы по использованию скрипта ARCHIVE_PATH можно не указывать, если архив уже распакован и данные расположены в ожидаемой структуре внутри BACKUP_DIR.

А BACKUP_DATE желательно указывать точно. В скрипте предусмотрен поиск дампов cddisk_db_* и pagesdb_db_* по этой дате. Если они не найдены, скрипт попытается выбрать последние доступные файлы.

Пример скрипта восстановления

#!/bin/bash

# Путь до файла конфигурации
source restore.conf

# Функция для обработки прерываний
trap cleanup INT TERM
trap cleanup_exit EXIT

# ---- ЛОГИРОВАНИЕ (исправлено: без экранирования $1) ----
log_info() { echo "$(date +'%Y-%m-%d %H:%M:%S') INFO: $1" | tee -a "$LOG_FILE"; }
log_warn() { echo "$(date +'%Y-%m-%d %H:%M:%S') WARN: $1" | tee -a "$LOG_FILE"; }
log_error() { echo "$(date +'%Y-%m-%d %H:%M:%S') ERROR: $1" | tee -a "$LOG_FILE"; }

# Функция очистки при прерывании
cleanup() {
log_warn "Скрипт восстановления прерван. Выполняется очистка..."
exit 1
}

# Функция очистки при выходе
cleanup_exit() {
log_info "Скрипт восстановления завершает работу."
return 0
}

# ---- ПРОВЕРКИ КОМАНД ----
for cmd in lbzip2 rsync psql pg_restore ssh scp; do
if ! command -v "$cmd" &> /dev/null; then
log_error "Ошибка: $cmd не установлен. Установите $cmd и повторите попытку."
exit 1
fi
done

# ---- ФУНКЦИИ ----

# Функция для получения пути до директории supervisor
get_supervisor_dir() {
local server="$1"
local supervisor_dir=""

if ssh -i "$SSH_KEY_PATH" -p "$SSH_PORT" root@"$server" "test -d /etc/supervisord.d" 2>/dev/null; then
supervisor_dir="/etc/supervisord.d"
elif ssh -i "$SSH_KEY_PATH" -p "$SSH_PORT" root@"$server" "test -d /etc/supervisor" 2>/dev/null; then
supervisor_dir="/etc/supervisor"
else
log_error "Не найден каталог supervisor на сервере $server"
return 1
fi

echo "$supervisor_dir"
return 0
}

# Обработка результата rsync
rsync_msg() {
local code_err="$1"
local host_ip="$2"

if [ "$code_err" -eq 23 ]; then
log_error "Ошибка rsync (code 23) на удалённом хосте $host_ip. Проверьте rsync/сеть."
exit 1
elif [ "$code_err" -ne 0 ]; then
log_error "Ошибка rsync (code $code_err) при копировании с/на $host_ip. Смотрите лог: $LOG_FILE"
exit 1
fi

log_info "Rsync для $host_ip завершён успешно."
}

# Создать базу заново
recreate_db() {
local dbname="$1"

# подключаемся к postgres
local PSQL_ADMIN="psql -h $PSQL_HOST -p $PSQL_PORT -U $PSQL_USER -d postgres"
$PSQL_ADMIN -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='${dbname}' AND pid <> pg_backend_pid();"
log_info "Пересоздание базы данных $dbname (DROP/CREATE)..."
$PSQL_ADMIN -v ON_ERROR_STOP=1 -c "DROP DATABASE IF EXISTS $dbname;"
$PSQL_ADMIN -v ON_ERROR_STOP=1 -c "CREATE DATABASE $dbname OWNER $PSQL_USER;"
}

# Восстановить базы из дампа
restore_db_from_dump() {
local dbname="$1"
local dump_file="$2"

if [ ! -f "$dump_file" ]; then
log_error "Файл дампа не найден: $dump_file"
exit 1
fi

log_info "Восстановление БД $dbname из $dump_file"
pg_restore -h "$PSQL_HOST" -p "$PSQL_PORT" -U "$PSQL_USER" -d "$dbname" -v -F c "$dump_file"
if [ $? -eq 0 ]; then
log_info "База данных $dbname успешно восстановлена."
else
log_error "Не удалось восстановить базу данных $dbname."
exit 1
fi
}

# Функция для восстановления баз данных (cddisk + pagesdb)
restore_databases() {
local APPSETTINGS_PATH="$BACKUP_DIR/ks/opt/r7-office/appsettings.json"
if [ ! -f "$APPSETTINGS_PATH" ]; then
log_error "Не найден $APPSETTINGS_PATH. Проверьте, что архив распакован в $BACKUP_DIR и структура верная."
exit 1
fi

# Извлекаем параметры для подключения к PostgreSQL
DB_PATH_PARAM="$APPSETTINGS_PATH"
PSQL_HOST=$(grep -oP "Host=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_DB_NAME=$(grep -oP "Database=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2) # обычно cddisk
PSQL_USER=$(grep -oP "Username=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_PASS=$(grep -oP "Password=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)
PSQL_PORT=$(grep -oP "Port=[^\";]*" "$DB_PATH_PARAM" | head -1 | cut -d'=' -f2)

export PGPASSWORD="$PSQL_PASS"

log_info "Параметры БД: host=$PSQL_HOST port=$PSQL_PORT user=$PSQL_USER main_db=$PSQL_DB_NAME"

local cddisk_dump=""
local pagesdb_dump=""

if [ -n "${BACKUP_DATE:-}" ]; then
for ext in dump tar.gz; do
[ -f "$BACKUP_DIR/cddisk_db_${BACKUP_DATE}.${ext}" ] && cddisk_dump="$BACKUP_DIR/cddisk_db_${BACKUP_DATE}.${ext}"
[ -f "$BACKUP_DIR/pagesdb_db_${BACKUP_DATE}.${ext}" ] && pagesdb_dump="$BACKUP_DIR/pagesdb_db_${BACKUP_DATE}.${ext}"
done
fi

# если не нашли по BACKUP_DATE — попробуем найти последние файлы
if [ -z "$cddisk_dump" ]; then
cddisk_dump=$(ls -1t "$BACKUP_DIR"/cddisk_db_* 2>/dev/null | head -1 || true)
fi
if [ -z "$pagesdb_dump" ]; then
pagesdb_dump=$(ls -1t "$BACKUP_DIR"/pagesdb_db_* 2>/dev/null | head -1 || true)
fi

if [ -z "$cddisk_dump" ]; then
log_error "Не найден дамп cddisk_db_* в $BACKUP_DIR"
exit 1
fi
if [ -z "$pagesdb_dump" ]; then
log_error "Не найден дамп pagesdb_db_* в $BACKUP_DIR"
exit 1
fi

# Восстановление cddisk
recreate_db "$PSQL_DB_NAME"
restore_db_from_dump "$PSQL_DB_NAME" "$cddisk_dump"

# Восстановление pagesdb
recreate_db "pagesdb"
restore_db_from_dump "pagesdb" "$pagesdb_dump"
}

# ---- ОСНОВНОЙ ПРОЦЕСС ----

START_RESTORE_TIME=$(date +'%Y-%m-%d %H:%M:%S')
log_info "Начало процесса восстановления: $START_RESTORE_TIME"

# Распаковка архива (если в restore.conf задан ARCHIVE_PATH)
if [ -n "${ARCHIVE_PATH:-}" ]; then
if [ ! -f "$ARCHIVE_PATH" ]; then
log_error "Архив не найден: $ARCHIVE_PATH"
exit 1
fi
log_info "Распаковка архива $ARCHIVE_PATH в $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
tar xf "$ARCHIVE_PATH" --selinux -C "$BACKUP_DIR" --use-compress-prog="lbzip2 -k -n$(nproc)"
fi

# Восстановление баз данных (cddisk + pagesdb)
restore_databases

# Восстановление данных с помощью rsync
log_info "Начало восстановления данных из резервной копии на серверы."

# Восстановление данных на сервер DS
log_info "Восстановление /etc/r7-office на $DS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ds/etc/r7-office/" root@"$DS_IP":/etc/r7-office/
rsync_msg $? "$DS_IP"

log_info "Восстановление /var/www/r7-office на $DS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ds/var/www/r7-office/" root@"$DS_IP":/var/www/r7-office/
rsync_msg $? "$DS_IP"

# Восстановление данных на сервер KS
log_info "Восстановление директории supervisor на $KS_IP"
KS_SUPERVISOR_DIR=$(get_supervisor_dir "$KS_IP") || exit 1
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ks/$KS_SUPERVISOR_DIR/" root@"$KS_IP":"$KS_SUPERVISOR_DIR"/
rsync_msg $? "$KS_IP"

log_info "Восстановление /opt/r7-office на $KS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ks/opt/r7-office/" root@"$KS_IP":/opt/r7-office/
rsync_msg $? "$KS_IP"

log_info "Восстановление /var/r7-office на $KS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ks/var/r7-office/" root@"$KS_IP":/var/r7-office/
rsync_msg $? "$KS_IP"

log_info "Восстановление /var/www/r7-office на $KS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/ks/var/www/r7-office/" root@"$KS_IP":/var/www/r7-office/
rsync_msg $? "$KS_IP"

# Восстановление данных на сервер SRCH
log_info "Восстановление директории supervisor на $SRCH_IP"
SRCH_SUPERVISOR_DIR=$(get_supervisor_dir "$SRCH_IP") || exit 1
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/srch/$SRCH_SUPERVISOR_DIR/" root@"$SRCH_IP":"$SRCH_SUPERVISOR_DIR"/
rsync_msg $? "$SRCH_IP"

log_info "Восстановление /opt/r7-office на $SRCH_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/srch/opt/r7-office/" root@"$SRCH_IP":/opt/r7-office/
rsync_msg $? "$SRCH_IP"

log_info "Восстановление /var/r7-office на $SRCH_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/srch/var/r7-office/" root@"$SRCH_IP":/var/r7-office/
rsync_msg $? "$SRCH_IP"

# Восстановление данных NFS
log_info "Восстановление данных NFS на $NFS_IP"
rsync -avz --no-owner --no-group --partial  -e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" --log-file="$LOG_FILE" \
"$BACKUP_DIR/nfs/mnt/" root@"$NFS_IP":/mnt/
rsync_msg $? "$NFS_IP"

END_RESTORE_TIME=$(date +'%Y-%m-%d %H:%M:%S')
log_info "Процесс восстановления завершён: $END_RESTORE_TIME"

START_TIMESTAMP=$(date -d "$START_RESTORE_TIME" +%s)
END_TIMESTAMP=$(date -d "$END_RESTORE_TIME" +%s)
TOTAL_DURATION=$((END_TIMESTAMP - START_TIMESTAMP))
log_info "Общее время выполнения: $TOTAL_DURATION секунд"

Была ли эта статья полезной?

Поделитесь пожалуйста своим мнением

      В статье есть ошибкиРекомендации не помоглиТекст трудно понятьСодержание статьи не соответствует заголовкуДругое