Резервные копии позволяют восстанавливать работоспособность системы в случае непредвиденных ситуаций, препятствуя потере данных пользователей и внесенных конфигурационных изменений.
Перед восстановлением системы должна быть создана резервная копия следующих объектов:
База данных «main». Содержит учётные записи пользователей API, параметры подключения к источникам данных и их ресурсам, параметры сред и проектов, параметры подключения к LDAP-каталогу, APNs-сертификаты для отправки push-уведомлений и другие;
База данных «cache». Содержит данные кэша, запрашиваемые сервером мобильной платформы или мобильным устройством из источника данных;
База данных «local». Содержит данные источника «Локальная БД»;
Файловое хранилище «minio». Содержит загружаемые файлы и сертификаты для подключения к источникам данных;
Конфигурационные файлы. Содержат изменённую информацию об установленных лимитах оперативной памяти, используемых контейнерах и других системных настройках.
Совет. Рекомендуется установить частоту копирования объектов в зависимости от периодичности добавления новых данных. Например, для базы данных «main» определите частоту добавления учётных записей пользователей API, для базы данных «cache» определите частоту изменения данных по расписанию обновления кэша, для базы данных «local» определите частоту добавления новых данных в источник «Локальная БД».
Для создания резервной копии:
Создайте скрипт и разместите его на компьютере, который управляет кластером.
Убедитесь, что кэши источников данных не находятся в процессе обновления или удаления.
Запустите скрипт.
Скопируйте изменённые конфигурационные файлы в кластере.
Шаблон скрипта для создания резервной копии:
#!/bin/bash
set -e
# Объявление директории для размещения файлов дампа
DATA_FOLDER=$(cd "$(dirname "${BASH_SOURCE[0]}")"
; pwd -P )
# Объявление пространства имён, в котором запущен сервер мобильной
платформы
NAMESPACE=fmp
# Объявление имён подов, через который будут экспортироваться и импортироваться
данные
DASHBOARD_POD=$(kubectl -n ${NAMESPACE} get pod -l app=dashboard -o
jsonpath="{.items[0].metadata.name}")
echo "Dashboard container for operation ${DASHBOARD_POD}"
STORAGE_POD=$(kubectl -n ${NAMESPACE} get pod -l app=storage -o jsonpath="{.items[0].metadata.name}")
echo "Storage container for operation ${STORAGE_POD}"
function save_postgres_data(){
# Указание баз данных для копирования
for db_label in main cache local
do
for var in POSTGRES_${db_label^^}_HOST POSTGRES_${db_label^^}_PORT
POSTGRES_${db_label^^}_NAME POSTGRES_${db_label^^}_USERNAME POSTGRES_${db_label^^}_PASSWORD
do
# Объявление переменных для подключения
к базам данных
echo "export ${var}"
echo $(kubectl -n ${NAMESPACE} exec $DASHBOARD_POD
-- env | grep $var | cut -d "=" -f2)
done
# Создание команды для снятия дампа баз данных
DUMP_COMMAND="PGPASSWORD=\$POSTGRES_${db_label^^}_PASSWORD
pg_dump -O -x -h \$POSTGRES_${db_label^^}_HOST -p \$POSTGRES_${db_label^^}_PORT
-d \$POSTGRES_${db_label^^}_NAME -U \$POSTGRES_${db_label^^}_USERNAME
> /tmp/${db_label}db_dump.sql"
echo "Снимаем дамп ${db_label}-базы..."
kubectl -n ${NAMESPACE} exec $DASHBOARD_POD -- bash
-c "${DUMP_COMMAND}"
echo "Дамп ${db_label}-базы снят. Скачиваем
этот дамп..."
kubectl cp ${NAMESPACE}/${DASHBOARD_POD}:/tmp/${db_label}db_dump.sql
$DATA_FOLDER/${db_label}db_dump.sql
echo "Дамп ${db_label}-базы загружен. Чистим
временный файл дампа..."
kubectl -n ${NAMESPACE} exec ${DASHBOARD_POD} --
rm /tmp/${db_label}db_dump.sql
echo "Временный файл дампа ${db_label}-базы
удалён"
done
}
function save_minio_data(){
echo "Копируем файлы из локального хранилища
в ${DATA_FOLDER}/share/"
kubectl cp ${NAMESPACE}/${STORAGE_POD}:/share/ ${DATA_FOLDER}/share/
echo "Копируем медиафайлы в ${DATA_FOLDER}/media/"
kubectl cp ${NAMESPACE}/${DASHBOARD_POD}:/var/hhive/media/
${DATA_FOLDER}/media/
echo "Копируем сертификаты в ${DATA_FOLDER}/media/ssl/"
kubectl cp ${NAMESPACE}/${DASHBOARD_POD}:/var/hhive/nginx/ssl/
${DATA_FOLDER}/media/ssl/
}
save_postgres_data
save_minio_data
Примечание. Функция save_minio_data() актуальна только при использовании «Форсайт. Мобильная платформа» версии 21.02 и ниже.
Для восстановления системы из резервной копии:
Создайте скрипт и разместите его на компьютере, который управляет кластером.
Остановите работу кластера и запретите доступ пользователям к нему.
Запустите скрипт.
Вставьте копии конфигурационных файлов в кластере.
Возобновите работу кластера.
Проверьте объём данных кэша. Если объём данных не полный, то удалите кэш и добавьте его заново в подразделе «Управление кэшем».
Аннулируйте срок действия JWT для пользователей API и администраторов. Для этого измените значения параметров «Срок действия JWT токена для пользователей API», «Срок действия JWT токена для администраторов», «Срок действия refresh JWT для пользователей API и администраторов» в подразделе «Безопасность».
Заново добавьте учётные записи пользователей API, если они были добавлены после создания резервной копии.
Восстановите доступ пользователей к кластеру.
Заново авторизуйтесь, если авторизация была выполнена после создания резервной копии.
Шаблон скрипта для восстановления системы из резервной копии:
#!/bin/bash
set -e
# Объявление директории для размещения файлов дампа
DATA_FOLDER=$(cd "$(dirname "${BASH_SOURCE[0]}")"
; pwd -P )
# Объявление пространства имён, в котором запущен сервер мобильной
платформы
NAMESPACE=fmp
# Объявление имён подов, через который будут экспортироваться и импортироваться
данные
DASHBOARD_POD=$(kubectl -n ${NAMESPACE} get pod -l app=dashboard -o
jsonpath="{.items[0].metadata.name}")
echo "Dashboard container for operation ${DASHBOARD_POD}"
STORAGE_POD=$(kubectl -n ${NAMESPACE} get pod -l app=storage -o jsonpath="{.items[0].metadata.name}")
echo "Storage container for operation ${STORAGE_POD}"
function restore_postgres_data(){
# Указание баз данных для восстановления
for db_label in main cache
do
for var in POSTGRES_${db_label^^}_HOST POSTGRES_${db_label^^}_PORT
POSTGRES_${db_label^^}_NAME POSTGRES_${db_label^^}_USERNAME
POSTGRES_${db_label^^}_PASSWORD
do
# Объявление переменных для подключения
к базам данных
echo "export ${var}"
echo $(kubectl -n ${NAMESPACE} exec $DASHBOARD_POD
-- env | grep $var | cut -d "=" -f2)
done
# Создание команды для восстановления баз данных
RESTORE_COMMAND="PGPASSWORD=\$POSTGRES_${db_label^^}_PASSWORD
psql -h \$POSTGRES_${db_label^^}_HOST -p \$POSTGRES_${db_label^^}_PORT
-d \$POSTGRES_${db_label^^}_NAME -U \$POSTGRES_${db_label^^}_USERNAME
-f /tmp/${db_label}db_dump.sql > /dev/null"
echo "Закачиваем дамп $DATA_FOLDER/${db_label}db_dump.sql
в pod ${DASHBOARD_POD}..."
kubectl cp $DATA_FOLDER/${db_label}db_dump.sql ${NAMESPACE}/${DASHBOARD_POD}:/tmp/${db_label}db_dump.sql
echo "Загружаем дамп ${db_label}-базы в postgres..."
kubectl -n ${NAMESPACE} exec $DASHBOARD_POD -- bash
-c "${RESTORE_COMMAND}"
echo "Дамп ${db_label}-базы загружен. Чистим
временный файл дампа..."
kubectl -n ${NAMESPACE} exec ${DASHBOARD_POD} --
rm /tmp/${db_label}db_dump.sql
echo "Временный файл дампа ${db_label}-базы
удалён"
done
}
function restore_minio_data(){
echo "Копируем файлы из локального хранилища
в ${DATA_FOLDER}/share/"
kubectl cp ${DATA_FOLDER}/share/ ${NAMESPACE}/${STORAGE_POD}:/share/
echo "Копируем медиафайлы в ${DATA_FOLDER}/media/"
kubectl cp ${DATA_FOLDER}/media/ ${NAMESPACE}/${DASHBOARD_POD}:/var/hhive/media/
echo "Копируем сертификаты в ${DATA_FOLDER}/media/ssl/"
kubectl cp ${DATA_FOLDER}/media/ssl/ ${NAMESPACE}/${DASHBOARD_POD}:/var/hhive/nginx/ssl/
}
restore_postgres_data
restore_minio_data
Примечание. Функция restore_minio_data() актуальна только при использовании «Форсайт. Мобильная платформа» версии 21.02 и ниже.
См. также: