Хранилище файлов NFS, без встроенного почтового сервера
Краткое описание
Скрипты основаны на инструкциях по установке Корпоративный сервер 2024 в архитектуре middle ↗
Для работы скриптов необходимо наличие установленного rsync на серверах участвующих в схеме КС и с которого запускается скрипт. На сервере, с которого запускается скрипт, необходимо установить lbzip2 (в скрипте есть проверка).
Скрипт копирует и архивирует информацию из папок:
Сервер с ролью Диск:
/etc/supervisor (в REDOS /etc/supervisor.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
Перед запуском необходимо вписать следующую информацию
- Если для доступа к серверам используется доступ по ключу, вписать путь;
- Если доступ без ключа, тогда нужно изменить команды доступа у rsync и ssh;
- Если для доступа по ssh используется нестандартный порт, так же нужно указать в командах;
- Нужно ввести адреса серверов согласно их ролям.
Описание переменных
| Переменная | Описание |
|---|---|
| BACKUP_DIR=/backup/corpportal | Папка для хранения архивов |
| BACKUP_DATE=$(date +’%Y-%m-%d’) | Формат даты для имени архива |
| SSH_KEY_PATH=/backup/id_rsa | Путь к SSH ключу |
| SSH_PORT=22 | SSH порт по которому осуществляется подключение к серверам |
| 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_FILE="cddisk-2024-04-23.tar.bz2" #Только для восстановления данных из архива
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')"Восстановление из архива
Обратите внимание, если при восстановлении изменились адреса серверов внутри архитектуры, возможны ошибки в работе Корпоративного сервера. Нужно будет проверить все настройки, связанные с этими серверами согласно инструкции по установке.
Пример скрипта восстановления
#!/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 --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 --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 --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 --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 --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 --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 --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 --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 --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 --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 секунд"










