Инструкция по обновлению сервера SmartPlayer в Docker сборке
Описание ситуации
Данная страница содержит в себе информацию связанную с обновлением сервера SmartPlayer при работе со сборщиком Docker. Ниже будет представлен алгоритм, который позволит настроить данный процесс правильно.
Глоссарий
- Серверное приложение - в контексте данной страницы это nodejs-приложение
- Личный кабинет (ЛК) - frontend js приложение
- Машина заказчика - физический сервер, который следует обновить
Сборка
Необходимо получить дистрибутивы от представителя SmartPlayer.
Сборка серверного приложения
Для обновления серверного приложения необходимо собрать серверное приложение определённой, последней версии и обновить серверное приложение. Если данный шаг не нужен, то его можно пропустить. Кроме серверного приложения необходимо получить у специалиста технической поддержки собранный node modules.
Сборка ЛК
Если требуется обновить ЛК, то необходимо получить у специалиста технической поддержки собранный ЛК той версии, на которую следует обновить ЛК. Если данный шаг не нужен, то его можно пропустить.
Передача файлов
Собранные архивы серверного приложения, node modules, ЛК следует разместить на машине заказчика. Перед обновлением серверного приложения проводится тестирований миграций, для чего с машины пользователя снимается дамп базы данных и переносится на тестовую машину.
Перед обновлением серверного приложения и личного кабинета
Производится проверка личного кабинета и фиксируется какие компоненты системы работают, какие нет, а также сколько устройств онлайн/оффлайн для того чтобы после обновления понимать:
- Что работало и сломали
- Что не работало и починили
- Что не работало и продолжает не работать
- Что работало и продолжает работать
Обновление серверного приложения
Ниже будет представлен алгоритм, по которому происходит обновление серверного приложения.
Тестирование миграций
Перед обновлением серверного приложения на машине пользователя следует провести тестирование миграций по инструкции, запросить которую можно у специалиста технической поддержки SmartPlayer.
Бэкапы (Backup)
Логика работы бэкапов
Пользователь подключается к сервер по протоколу “SSH”. С помощью команд создаёт бэкап и выгружает его к себе, с помощью специальной утилиты “SCP“.

Механика работы бэкапов
Для начала стоит уточнить что делается полноценный Backup базы данных. Чтобы получить Backup базы данных необходимо подключиться к серверу используя технологию SSH.
После подключения пользователю необходимо прописать команду :
~$ cd smartplayer
~$ cd - команда отвечающая за перенаправление в конкретную папку/
После перехода в нужную папку необходимо запустить команду для создания бэкапа. Это команда:
./mysql_backup/mysql_backup.sh
Следующим шагом необходимо найти строку:
Backups dir
В ней прописан путь до всех бэкапов. В этом пути и хранятся все бэкапы.
Рассмотренный в нашем случае путь: "/home/smartplayer/smartplayer/data/mysql-dumps/"
После выполнений предыдущих действий необходимо прописать две команды:
cd /home/smartplayer/smartplayer/data/mysql-dumps/- позволяет пользователю использовать папку где хранятся бэкапы$ls- показывает все хранящиеся файлы
Далее пользователю необходимо обратить внимание на строку:
Dump filename:
В ней находится название файла. В данном случае это: "./smartplayer.2023-09-05_10-04-21.sql.gz"
После находим самый последний бэкап. Его необходимо перенести на компьютер, с помощью специальной программы: “SCP“.
Чтобы выкачать последний бэкап к пользователю на компьютер, необходимо использовать команду:
scp smartplayer@<Ip-адрес сервера на котором работает платформа>/:<путь до бэкапа> ~/<Путь куда необходимо перенести файл>
Итог
После этого действия файл бэкапа должен появится у пользователя на ПК.
Получить дистрибутивы от представителя SmartPlayer
Получить дистрибутив сервера и личного кабинет можно URL-ссылке https://jenkins_dists_update_platform.hb.bizmrg.com/sp_update_ver_buildNumber_numb.zip
Обновление серверного приложения на машине заказчика
Команды, указанные в данной инструкции, выполняются от имени пользователя smartplayer и папки, которую обычно называют smartplayer, она содержит всю сборку, в том числе и файл .env и docker-compose.yml
Если приложение установлено под пользователем с root-правами, тогда и обновление необходимо производить под этим пользователем. Владельца приложения можно определить по выводу команды ls (на скриншоте выше). Необходимо зайти в личный кабинет и зафиксировать какие компоненты системы работают/не работают, а также сколько устройств онлайн/оффлайн.
Следующим шагом остановите nginx с помощью команды:
docker-compose stop web
Далее необходимо остановить серверное приложение с помощью команды:
docker exec -it smartplayer_backend_1 bash -c "pm2 stop all"
Создаем дамп базы данных:
./mysql_backup/mysql_backup.sh
Также проверяем дамп что он не пустой:
ls -lah1 ./data/mysql-dumps/
Создать бэкап старой версии серверного приложения.
Ниже приведена последовательность команд, которая создает папку /backend/app_v_version, где version — это номер версии серверного приложения (получаемый из файла package.json), в которую переносит содержимое папки /backend/app/.
SERVER_APP_BACKUP_DIR="$(docker exec smartplayer_backend_1 bash -c 'node -p "require(\"./package.json\").version"')"
SERVER_APP_BACKUP_DIR="backend/app_v$SERVER_APP_BACKUP_DIR"
mkdir "$SERVER_APP_BACKUP_DIR"
mv backend/app/{*,.[^.]*} "$SERVER_APP_BACKUP_DIR"
В процессе выполнения команды появится сообщение о невозможности переноса папки backend/app/logs из за отсутствия прав на нее, потому что доступ к папке имеет пользователь с root-правами. Такое сообщение появляется, если выполнять команду от имени пользователя smartplayer. Необходимость копирования папки logs отсутствует, так как после обновления сервера, логи продолжат создаваться в этой же папке. Если команда выполнена под пользователем с root-правами, тогда и папка logs будет перенесена – это надо будет учитывать, при копировании новой версии серверного приложения.
Произвести проверку содержимого папки с созданной копией:
ls -la $SERVER_APP_BACKUP_DIR
Содержимое папки /backend/app/ должно быть пустым, за исключением папки logs:
ls -la ./backend/app/
Создаётся бэкап старой версии личного кабинет:
FRONTEND_BACKUP_DIR=$(date +"cms/cms_%Y%m%d%H%M%S")
mkdir "$FRONTEND_BACKUP_DIR"
mv cms/cms/{*,.[^.]*} "$FRONTEND_BACKUP_DIR"
Еще одним шагом является проверка содержимого папки с созданной копией:
ls -la $FRONTEND_BACKUP_DIR
Содержимое папки /cms/cms/ должно быть пустым:
ls -la ./cms/cms/
= Обновление файлов серверного приложения
Разархивируем .zip-архив в папку update:
unzip sp_update_bv_v2.version_buildNumber_number.zip -d update
Копируем из папки /update/cms/ все файлы в папку /cms/cms/:
cp -r ./update/cms/. ./cms/cms/
Копируем из папки /update/server/ все файлы в папку /backend/app/:
cp -r ./update/server/. ./backend/app/
Копируем из папки /update/serverAdminLicensing/ все файлы в папку /cms/admin/:
cp -r ./update/serverAdminLicensing/. ./cms/admin/
Копируем из папки /update/widgets/ все файлы в папку /widgets/:
cp -r ./update/widgets/. ./widgets/
Переносим папки и конфигурации из архива в новую версию: logs, pm2.app.config.js, config/*.
cp -t backend/app "$SERVER_APP_BACKUP_DIR/pm2.app.config.js"
cp -n -R -t backend/app/config $SERVER_APP_BACKUP_DIR/config/*
Перезапускаем docker-compose:
docker-compose down && docker-compose up -d
Выполняем миграции MySQL:
docker exec -i smartplayer_backend_1 bash -c "LOG_LEVEL=DEBUG ./cli.js db migrate" > mig_2024.03.24.log 2> migration_error.log
Если миграции завершились логом "All migrations are rolled.", то они выполнены успешно. Если нет, то обратиться к представителю компании SmartPlayer для дальнейший переадресации проблемы в команду разработку, чтобы выяснить причину не произошедшей миграции.
Выполняем миграции Mongo:
docker exec $(docker ps -q -f name=backend | head -n1) bash -c "./cli.js db mongo-migrate"
Проверяем работоспособность серверного приложения.
Для этого, в течении двух минут вызывать список процессов pm2 и убедиться, что процессы не «падают» (в поле uptime время должно расти. В соседнем поле, обозначающем количество перезапусков, значение изменяться не должно):
docker exec -it smartplayer_backend_1 bash -c "pm2 list"
Произвести проверку работы личного кабинета. Количество устройств on-line должно равняться количеству устройств в сети до обновления.
Удаление файлов обновления:
rm -r -f ./update/
rm sp_update_bv_v2.version_buildNumber_number.zip
Обновление личного кабинета
- Загрузить архив с личным кабинетом на машину пользователя доступным способом
- Зайти в личный кабинет и зафиксировать какие компоненты системы работают, какие нет, сколько устройств онлайн/оффлайн
- Создать бэкап старой версии личного кабинета:
FRONTEND_BACKUP_DIR=$(date +"cms/cms_%Y%m%d%H%M%S") && \
mkdir "$FRONTEND_BACKUP_DIR" && \
mv cms/cms/{*,.[^.]*} "$FRONTEND_BACKUP_DIR"
- Распаковать ЛК новой версии:
unzip frontend_2.103.23_api.smartplayer.org.zip -d cms/cms
- Осуществить проверку работоспособности сервера и ЛК, запросив у специалистов технической поддержки специальный чек-лист проверки работоспособности сервера и личного кабинета после установки обновления
"Откат" серверного приложения на прежнюю версию
- Убедиться, что "pm2" процессы остановлены:
docker exec -it smartplayer_backend_1 bash -c "pm2 list"
- Если процессы не остановлены, то остановить:
docker exec -it smartplayer_backend_1 bash -c "pm2 stop all"
- Если осуществлялся запуск миграций, то откатить миграции, восстановив базу данных из дампа:
source .env
zcat dumpfile.sql.gz | docker exec -i smartplayer_mysql_1 mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
- Вернуть папки "logs", "public", "assets" в бэкап
- Вернуть серверного приложение из бэкапа, заменив содержимое папки "backend/app"
- Проверить конфиги
- Запустить "pm2":
docker exec -it smartplayer_backend_1 bash -c "pm2 start pm2.app.config.js"
- Запустить Nginx:
docker-compose start web