Бэкап приложения и баз данных

Примечание

Для работы скриптов резервного копирования требуется утилита rsync.

  • При бэкапе на текущий сервер достаточно установить rsync только на этом сервере.

  • При переносе на новый сервер rsync должен быть установлен на обоих серверах — исходном и целевом.

Установите rsync:

На DEB-системах:

sudo apt update && sudo apt install -y rsync

На RPM-системах:

sudo dnf install -y rsync

Установка MySQL Shell для резервного копирования внешних БД

Примечание

Если используются БД, поставляемые с приложением — для резервного копирования установка MySQL Shell не требуется, и данный шаг можно пропустить.

Для резервного копирования внешних баз данных необходимо установить MySQL Shell.

Ниже приведены инструкции для систем на базе Debian/Ubuntu и RPM (например, Fedora, CentOS, RHEL). Выберите подходящий вариант.

Установка MySQL Shell на Debian/Ubuntu
  1. Откройте страницу MySQL APT Repository.

  2. На странице найдите имя файла, например: mysql-apt-config_0.8.36-1_all.deb. Версия может отличаться — используйте актуальную из списка.

  3. Скачайте пакет конфигурации репозитория, подставив актуальную версию в команду:

wget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb
  1. Установите скачанный пакет:

sudo apt install ./mysql-apt-config_0.8.36-1_all.deb

5. Во время установки откроется окно настройки репозитория MySQL. В разделе MySQL Server & Cluster выберите ту же версию MySQL, что установлена в системе. Остальные параметры оставьте по умолчанию, затем выберите «Ok» и нажмите «Enter».

  1. Обновите список пакетов и установите MySQL Shell:

sudo apt update && sudo apt install -y mysql-shell
Установка MySQL Shell на RPM
  1. Добавьте официальный репозиторий MySQL, установив RPM-пакет:

sudo dnf install https://dev.mysql.com/get/mysql80-community-release-fc36-1.noarch.rpm
  1. Установите MySQL Shell:

sudo dnf install mysql-shell

Как сделать бэкап приложения на текущем сервере?

Сохранение данных на текущий сервер

Для создания полной резервной копии приложения на текущем сервере создайте директорию для бэкапа:

mkdir /opt/backup_compass

Выполните скрипт backup_all_data.py из директории установщика:

sudo python3 script/backup_all_data.py -dst /opt/backup_compass

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

  • резервная копия данных будет сохранена на новом сервере в <dst>/<root_mount_path>, при этом root_mount_path берется не целиком, а только его последний компонент (имя директории) из global.yaml.

    Например, при -dst /opt/backup_compass и root_mount_path: /opt/compass итоговый путь будет /opt/backup_compass/compass.

  • установщик приложения также будет скопирован в директорию: <dst>/<root_mount_path>/installer.

Вместо /opt/backup_compass можно указать любую другую директорию, где будет удобно хранить резервную копию приложения. Далее в инструкции директория /opt/backup_compass/compass будет использоваться в качестве примера.

Восстановление приложения на текущем сервере

Копирование установщика

Перед восстановлением необходимо скопировать установщик из бэкапа. Это можно сделать двумя способами:

Способ 1. Восстановить в ту же директорию, где раньше был установщик (например, /opt/onpremise-installer).

Сначала переименуйте текущую директорию установщика, чтобы она сохранилась в качестве резервной копии:

mv /opt/onpremise-installer /opt/onpremise-installer.backup

Затем скопируйте установщик из бэкапа в прежнюю директорию:

cp -r /opt/backup_compass/compass/installer /opt/onpremise-installer

Способ 2. Восстановление в новую директорию (рекомендуется, если нужно сохранить старую установку нетронутой).

Создайте новую директорию:

mkdir -p /opt/on-premise/

Скопируйте установщик в эту директорию:

cp -r /opt/backup_compass/compass/installer /opt/on-premise/onpremise-installer

Примечание

Далее директория /opt/on-premise/onpremise-installer будет использоваться как основной установщик: для обновлений, изменения настроек и обслуживания приложения.

Восстановление данных

Примечание

Если вы делаете обычный резервный бэкап на случай сбоя (без переноса или изменений конфигурации), рекомендуется использовать первый вариант — восстановление в ту же директорию, где уже установлено приложение. Это самый простой и быстрый способ, так как не требует копирования данных или изменения настроек.

Вариант 1. Восстановление в ту же директорию (root_mount_path не меняется)

Перейдите в директорию скопированного установщика (вместо <путь-до-установщика> подставьте свой путь):

cd /<путь-до-установщика-onpremise-installer>

Запустите восстановление:

sudo python3 script/restore_db.py

При запуске скрипта:

  • будет предложено выбрать резервную копию из списка;

  • нужно подтвердить удаление текущих данных и остановку приложения;

  • при первом запуске скрипта может появиться предложение обновить приложение.

Если такое уведомление появится, подтвердите обновление — это необходимо для корректного запуска окружения. Если приложение не было установлено ранее, никакие данные удалены не будут. После подтверждения начнется восстановление данных и перезапуск компонентов приложения.

Вариант 2. Восстановление в новую директорию (изменение root_mount_path)

Если вы хотите перенести данные приложения в другую директорию (например, /opt/compass_data), отличную от текущего root_mount_path, скопируйте данные приложения в новую директорию:

Создайте новую директорию:

sudo mkdir -p /opt/compass_data

Скопируйте данные в новую директорию:

cp -r /opt/backup_compass/compass/* /opt/compass_data/

Откройте конфигурационный файл в скопированном установщике configs/global.yaml и задайте в параметре root_mount_path путь к новой директории:

root_mount_path: /opt/compass_data

Назначьте корректные права доступа, задав переменную ROOT_PATH со значением параметра root_mount_path из файла configs/global.yaml (в примере — /opt/compass_data):

export ROOT_PATH=/opt/compass_data && \
sudo chown -R root:root "$ROOT_PATH" && \
sudo chown -R www-data:www-data \
 "$ROOT_PATH/files" \
 "$ROOT_PATH/tmp_files" \
 "$ROOT_PATH/default_file" \
 "$ROOT_PATH/company_configs"

Перейдите в директорию установщика:

cd /<путь-до-установщика>/onpremise-installer

Запустите восстановление:

sudo python3 script/restore_db.py

При запуске скрипта:

  • будет предложено выбрать резервную копию из списка;

  • нужно подтвердить удаление текущих данных и остановку приложения;

  • при первом запуске скрипта может появиться предложение обновить приложение.

Если такое уведомление появится, подтвердите обновление — это необходимо для корректного запуска окружения. Если приложение не было установлено ранее, никакие данные удалены не будут. После подтверждения начнется восстановление данных и перезапуск компонентов приложения.

Как перенести Compass на новый сервер?

Подготовка нового сервера

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

Команды для проверки характеристик
# cpu
lscpu

# ram
free -h

# объем диска
df -h

Создайте пользователя www-data:

sudo useradd -u 33 -g www-data -M -s /usr/sbin/nologin www-data
Если при создании пользователя появится ошибка
  1. Ошибка: группа www-data не существует:

useradd: group 'www-data' does not exist

Создайте группу с GID 33:

sudo groupadd -g 33 www-data
  1. Ошибка: GID 33 уже занят:

groupadd: GID '33' already exists

Проверьте, какая группа использует этот ID:

getent group 33

Если, например, это группа tape:

tape:x:33:

Переназначьте ее на другой ID (например 3333):

sudo groupmod -g 3333 tape
sudo groupadd -g 33 www-data

Создайте пользователя:

После того как группа существует (и свободна):

sudo useradd -u 33 -g www-data -M -s /usr/sbin/nologin www-data
  1. Проверьте результат:

id www-data
getent group 33
getent passwd www-data

Далее сервер, на который будет переноситься приложение, должен быть подготовлен и настроен по данной инструкции:

Скопируйте сертификаты в /etc/nginx/ssl/, проверьте конфигурацию и перезапустите nginx:

sudo nginx -t
sudo systemctl restart nginx

Если у вас был настроен автоматический перевыпуск сертификатов, то настройте его и на новом сервере.

Создать директорию, где будет располагаться бэкап:

sudo mkdir -p /opt/backup_compass

У пользователя который будет использоваться для переноса, должны быть права на данную директорию. Чтобы выдать права, из под нужного пользователя выполните команду:

sudo chmod 750 /opt/backup_compass

Сохранение и отправка данных на новый сервер

Для переноса приложения на новый сервер выполните следующие шаги:

Сгенерируйте SSH-ключ без passphrase (оставьте поле пустым при создании):

ssh-keygen -t rsa -b 4096

Прокиньте ключ на новый сервер:

ssh-copy-id remote_user@remote_host
Если подключение на новый сервер происходит только по ключу:

Прежде чем вводить команду ниже, необходимо сгенерировать ключ по первому шагу.

Введите команду, чтобы отобразить содержимое ключа на сервере, с которого переносите данные:

cat /root/.ssh/id_rsa.pub

Данный ключ необходимо добавить в /root/.ssh/authorized_keys на новом сервере.

Создайте на новом сервере директорию /opt/backup_folder для проверки подключения:

mkdir /opt/backup_folder

И проверьте подключение, выполнив команду на сервере с которого будет происходить перенос данных, передав путь до удаленного сервера и директории /opt/backup_folder:

ssh -o IdentitiesOnly=yes -i /root/.ssh/id_rsa remote_user@<new_server_ip> 'echo OK && whoami && mkdir -p /opt/backup_folder'

Если в выводе отобразится Ok — значит ключ успешно был прокинут.

Выполните скрипт backup_all_data.py, передав путь до удаленного сервера и директории, куда следует сохранить данные:

sudo python3 script/backup_all_data.py -dst remote_user@remote_host:/opt/backup_compass

После выполнения:

  • резервная копия данных будет сохранена на новом сервере в <dst>/<root_mount_path>, при этом root_mount_path берется не целиком, а только его последний компонент (имя директории) из global.yaml.

    Например, при -dst /opt/backup_compass и root_mount_path: /opt/compass итоговый путь будет /opt/backup_compass/compass.

  • установщик приложения будет скопирован в директорию: <dst>/<root_mount_path>/installer.

Далее в инструкции директория /opt/backup_compass/compass будет использоваться в качестве примера.

Разворачивание приложения на новом сервере

Скопируйте установщик из /opt/backup_compass/compass/installer в отдельную директорию, например /opt/onpremise-installer :

cp -r /opt/backup_compass/compass/installer /opt/onpremise-installer

Отредактируйте конфигурационный файл configs/global.yaml:

  • host_ip — IP нового сервера;

  • root_mount_path — путь, в котором будут размещены данные приложения;

  • jitsi.service.jvb.media_advertise_ips — заполнить, если сервер с Compass находится на NAT.

Скопируйте данные из архива в директорию, указанную в параметре root_mount_path, файла configs/global.yaml.

Например, если в конфигурации задан путь /opt/compass:

cp -r /opt/backup_compass/compass /opt/compass

Примечание

Если вы хотите использовать другую директорию, укажите ее в параметре root_mount_path в файле configs/global.yaml и скопируйте данные именно туда.

Назначьте корректные права доступа, задав переменную ROOT_PATH со значением параметра root_mount_path из файла configs/global.yaml (в примере — /opt/compass):

export ROOT_PATH=/opt/compass && \
sudo chown -R root:root "$ROOT_PATH" && \
sudo chown -R www-data:www-data \
 "$ROOT_PATH/files" \
 "$ROOT_PATH/tmp_files" \
 "$ROOT_PATH/default_file" \
 "$ROOT_PATH/company_configs"

Перейдите в директорию установщика:

cd /opt/onpremise-installer

Запустите восстановление:

sudo python3 script/restore_db.py

При запуске скрипта:

  • будет предложено выбрать резервную копию из списка;

  • нужно подтвердить удаление текущих данных и остановку приложения;

  • появится предложение обновить приложение. Подтвердите обновление — это необходимо для корректного запуска окружения.

После подтверждения начнется восстановление данных и перезапуск компонентов приложения.

Развертывание приложения занимает некоторое время. В зависимости от мощности сервера время может варьироваться от 3 до 15 минут. Текущее состояние развертывания можно узнать с помощью команды:

sudo docker service ls | grep -vE "default-file|jitsi-custom"

У всех сервисов правое и левое число в колонке REPLICAS должны совпадать (ниже пример, количество строк и значения в полях могут быть другими):

ID             NAME              MODE         REPLICAS   IMAGE                                                     PORTS
jrnsa5illaao   pivot_nginx       replicated   1/1        dockerhub.com/nginx/nginx:apline-latest                   *:31000->443/tcp
7wismhojfze5   pivot_php_pivot   replicated   1/1        docker.getcompass.com/compass-on-premise/php_pivot:1.1.0
3meydkmdpx3j   pivot_go_event    replicated   1/1        docker.getcompass.com/compass-on-premise/go_event:1.1.0

Если по истечении ожидаемого времени сервис не готов к работе, то можно получить дополнительную информацию командой:

sudo docker service ps <ID_или_NAME_сервиса> --no-trunc

После успешного разворачивания приложения на новом сервере:

  • необходимо поменять А-запись у домена на новый IP сервера (если внешний IP изменялся) и проверить, что она изменилась:

 dig +short <domain.ru> @8.8.8.8
  • Проверить основной функционал приложения работает (авторизация, отправка сообщений, звонки)

После выполненных проверок, можно удалить приложение на предыдущем сервере.

Как сделать резервные копии баз данных?

Создание резервной копии баз данных

Для снятия резервных копий баз данных необходимо выполнить скрипт backup_db.py из директории установщика:

sudo python3 script/backup_db.py

После выполнения скрипта резервная копия данных будет сохранена по пути root_mount_path/backups/data_time, где:

  • data_time — метка времени создания бэкапа.

  • root_mount_path — путь к данным приложения, указанный в файле global.yaml.

Создаются следующие архивы:

  • mysql.tgz — архив с общими данными приложения (база пользователей, очереди задач и т.д.).

  • mysql_company_1.tgz — архив с данными пространства для общения (сообщения, данные файлов, участники и т.д.). Каждое пространство для общения имеет свою собственную базу данных.

  • configs.tgz — архив конфигурационных файлов (global.protected.yaml, global.yaml).

Восстановление данных из резервной копии

Запустите скрипт для восстановления резервной копии:

sudo python3 script/restore_db.py

При запуске скрипта вам будет предложено:

  • Выбрать нужный бэкап из списка доступных копий.

  • Подтвердить удаление текущих данных и завершение работы приложения.

После подтверждения начнется процесс восстановления данных из выбранного бэкапа и обновления приложения.

Как настроить расширенные параметры бэкапа?

Для более гибкой настройки создания бэкапов вы можете использовать следующие параметры скриптов backup_db.py и backup_all_data.py.

  • --backups-folder — директория в root_mount_path, куда будут сохраняться бэкапы баз данных.

  • --free-threshold-percent — пороговое значение свободного места в процентах для ограничения создания бэкапа.

  • --auto-cleaning-limit — лимит для автоматической очистки бэкапов, если их количество превышает указанный лимит.

Пример скрипта, который создает бэкап только в случае, если свободное место на сервере не ниже 20%:

sudo python3 script/backup_db.py --free-threshold-percent 20

Пример скрипта, который автоматически удаляет старые бэкапы, если их количество превышает 10:

sudo python3 script/backup_db.py --auto-cleaning-limit 10

Примечание

Параметр --auto-cleaning-limit применяется только к бэкапам, созданным с тем же шаблоном имени, который задан через параметр --backup-name-format. Это сделано для того, чтобы при автоматической очистке не были случайно удалены другие файлы или каталоги, находящиеся в директории бэкапов.

Например, если вы создавали бэкапы с именами по шаблону:

--backup-name-format "backup-%Y-%m-%d"

то при изменении шаблона, например, на

--backup-name-format "Резервная копия %Y-%m-%d"

старые бэкапы, созданные по предыдущему формату, не будут автоматически удалены.

Настройка уведомления, если заканчивается свободное место для создания бэкапа

В скрипт добавлена возможность отправки предупреждающего уведомления, если при указанном параметре free-threshold-percent будет ограничено создание бэкапа.
Для этого используйте следующие параметры скрипта backup_db.py или backup_all_data.py :

  • --userbot-notice-chat-id — id группового чата, куда будут отправляться уведомления.

  • --userbot-notice-token — токен вашего бота в приложении Compass.

  • --userbot-notice-domain — домен вашего приложения, на который будет отправлено сообщение.

  • --userbot-notice-text — текст для уведомления от бота (по умолчанию передается текст «Не смогли создать бэкап на сервере»).

Пример скрипта, который отправит уведомление о том, что заканчивается место для создания бэкапа, если на сервере останется меньше 10% свободного места:

sudo python3 script/backup_db.py \
   --free-threshold-percent 10 \
   --userbot-notice-token <токен-бота> \
   --userbot-notice-domain <ваш-домен> \
   --userbot-notice-chat-id <chat-id-чата>

Как настроить регулярное создание бэкапов?

Чтобы настроить регулярное создание резервных копий баз данных или приложения, добавьте выполнение скрипта в root-crontab.

Откройте crontab для редактирования, выполнив команду:

sudo crontab -e

Затем добавьте нужное задание (все они будут выполняться от имени root):

  1. Резервное копирование баз данных каждый день в 02:00:

0 2 * * * python3 /полный/путь/к/backup_db.py >> /var/log/backup_db.log 2>&1
  1. Полный бэкап приложения (данные + БД) каждый день в 03:00:

0 3 * * * python3 /полный/путь/к/backup_all_data.py -dst /opt/backup_compass >> /var/log/backup_app.log 2>&1
  1. Полный бэкап приложения с отправкой на другой сервер каждый день в 04:00 (замените remote_user, remote_host и путь на актуальные):

0 4 * * * python3 /полный/путь/к/backup_all_data.py -dst remote_user@remote_host:/opt/backup_compass >> /var/log/backup_remote.log 2>&1

Для настройки расписания выполнения бэкапа, можно воспользоваться сайтом crontab guru, который поможет легко подобрать нужное время. Полный путь к файлам backup_db.py и backup_all_data.py можно получить командой, выполняемой в директории установщика:

realpath script/backup_db.py
realpath script/backup_all_data.py

Внимание

Пожалуйста, обратитесь к специалистам Compass в пространстве поддержки On-premise, Telegram или на почту support@getcompass.ru, чтобы получить индивидуальную поддержку.


Напишите нам в пространстве поддержки On-premise, Telegram или на почту support@getcompass.ru, чтобы получить индивидуальную демонстрацию функционала и помощь по вопросам интеграции мессенджера в вашей компании.