Инструкция по обновлению сервера SmartPlayer в Docker сборке: различия между версиями
Нет описания правки |
S.Kargin (обсуждение | вклад) Нет описания правки |
||
| (не показано 6 промежуточных версий 1 участника) | |||
| Строка 23: | Строка 23: | ||
=== '''Тестирование миграций''' === | === '''Тестирование миграций''' === | ||
Перед обновлением серверного приложения на машине пользователя следует провести тестирование миграций по инструкции, запросить которую можно у специалиста технической поддержки SmartPlayer. | Перед обновлением серверного приложения на машине пользователя следует провести тестирование миграций по инструкции, запросить которую можно у специалиста технической поддержки SmartPlayer. | ||
== '''Бэкапы (Backup)''' == | |||
{{Note|Бэкап (или резервное копирование) — это процесс создания копии данных или информации с целью восстановления в случае потери, повреждения или удаления оригинальных данных.|warn}} | |||
=== '''Логика работы бэкапов''' === | |||
Пользователь подключается к сервер по протоколу “SSH”. С помощью команд создаёт бэкап и выгружает его к себе, с помощью специальной утилиты “SCP“. | |||
[[File:Бэкапы.png|thumb|center| Пример отображения логики работы бэкапов|800px]] | |||
== '''Механика работы бэкапов''' == | |||
Для начала стоит уточнить что делается полноценный Backup базы данных. | |||
Чтобы получить Backup базы данных необходимо подключиться к серверу используя технологию SSH. | |||
{{Note|SSH (Secure Shell) — это сетевой протокол, который позволяет пользователям безопасно управлять серверами и другими компьютерами через незащищенные сети, такие как интернет. SSH используется для безопасного взаимодействия с удаленными системами и обычно служит безопасной альтернативой нешифрованным протоколам,|warn}} | |||
После подключения пользователю необходимо прописать команду : | |||
<code>~$ cd smartplayer</code> | |||
~$ cd - команда отвечающая за перенаправление в конкретную папку/<br> | |||
После перехода в нужную папку необходимо запустить команду для создания бэкапа. Это команда: | |||
<code>./mysql_backup/mysql_backup.sh</code> | |||
Следующим шагом необходимо найти строку: | |||
<code>Backups dir</code> | |||
В ней прописан путь до всех бэкапов. В этом пути и хранятся все бэкапы.<br> | |||
Рассмотренный в нашем случае путь: "/home/smartplayer/smartplayer/data/mysql-dumps/"<br> | |||
После выполнений предыдущих действий необходимо прописать две команды: | |||
# <code>cd /home/smartplayer/smartplayer/data/mysql-dumps/</code> - позволяет пользователю использовать папку где хранятся бэкапы | |||
# <code>$ls</code> - показывает все хранящиеся файлы | |||
[[File:Команды.png|thumb|center| Пример команд|800px]] | |||
[[File:Список_файлов.png|thumb|center| Пример отображения списка файлов после выполнения команд|800px]] | |||
[[File:Результат_работ.png|thumb|center| Пример отображения результата описанного выше процесса|800px]] | |||
Далее пользователю необходимо обратить внимание на строку: | |||
<code>Dump filename:</code> | |||
В ней находится название файла. В данном случае это: "./smartplayer.2023-09-05_10-04-21.sql.gz"<br> | |||
После находим самый последний бэкап. Его необходимо перенести на компьютер, с помощью специальной программы: “SCP“.<br> | |||
Чтобы выкачать последний бэкап к пользователю на компьютер, необходимо использовать команду: | |||
<code>scp smartplayer@<Ip-адрес сервера на котором работает платформа>/:<путь до бэкапа> ~/<Путь куда необходимо перенести файл></code> | |||
{{Note|В фрагменте “~/<путь куда необходимо перенести файл>“ - пользователь может прописать любую директорию на своём устройстве.|warn}} | |||
[[File:Информация.png|thumb|center| Пример информации|800px]] | |||
=== '''Итог''' === | |||
После этого действия файл бэкапа должен появится у пользователя на ПК. | |||
=== '''Обновление серверного приложения на машине заказчика''' === | === '''Обновление серверного приложения на машине заказчика''' === | ||
{{Note|Команды, указанные в данной инструкции выполняются из папки, которую обычно назsвают "smartplayer". Она содержит всю docker-сборку, в том числе и файл ".env".|warn}} | {{Note|Команды, указанные в данной инструкции выполняются из папки, которую обычно назsвают "smartplayer". Она содержит всю docker-сборку, в том числе и файл ".env".|warn}} | ||
Алгоритм обновления серверного приложения: | Алгоритм обновления серверного приложения: | ||
* Загрузить архив с серверным приложением и "node modules" на машину пользователя доступным способом | |||
* Зайти в личный кабинет и зафиксировать какие компоненты системы работают, какие нет, сколько устройств онлайн/оффлайн | |||
* Остановить Nginx: | |||
<code>docker-compose stop web</code> | <code>docker-compose stop web</code> | ||
* Остановить серверное приложение: | |||
<code>docker exec -it smartplayer_backend_1 bash -c "pm2 stop all"</code> | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 stop all"</code> | ||
* Создать дамп базы данных: | |||
<code>./mysql_backup/mysql_backup.sh</code> | <code>./mysql_backup/mysql_backup.sh</code> | ||
* Убедиться, что дамп базы данных создан и не является пустым: | |||
<code>ls -lah1 ./data/mysql-dumps/</code> | <code>ls -lah1 ./data/mysql-dumps/</code> | ||
* Создать бэкап старой версии серверного приложения: | |||
<code>SERVER_APP_BACKUP_DIR="$(docker exec smartplayer_backend_1 bash -c 'node -p "require(\"./package.json\").version"')" && \</code> | <code>SERVER_APP_BACKUP_DIR="$(docker exec smartplayer_backend_1 bash -c 'node -p "require(\"./package.json\").version"')" && \</code><br> | ||
<code>SERVER_APP_BACKUP_DIR="backend/app_v$SERVER_APP_BACKUP_DIR" && \</code> | <code>SERVER_APP_BACKUP_DIR="backend/app_v$SERVER_APP_BACKUP_DIR" && \</code><br> | ||
<code>mkdir "$SERVER_APP_BACKUP_DIR" && \</code> | <code>mkdir "$SERVER_APP_BACKUP_DIR" && \</code><br> | ||
<code>mv backend/app/{*,.[^.]*} "$SERVER_APP_BACKUP_DIR"</code></code> | <code>mv backend/app/{*,.[^.]*} "$SERVER_APP_BACKUP_DIR"</code></code> | ||
{{Note|Внимание! Если вы отошли от этого пункта и сделали бэкап методом перемещения папки "app" серверного приложения (т.е. пересоздали её в файловой системе), то перед выполнением миграций нужно перезапустить докер. Тогда подтянет измененную папку "app". Обратите внимание, что скрипт переносит внутреннее содержимое папки в новую папку, созданную для бэкапа серверного приложения.|warn}} | {{Note|Внимание! Если вы отошли от этого пункта и сделали бэкап методом перемещения папки "app" серверного приложения (т.е. пересоздали её в файловой системе), то перед выполнением миграций нужно перезапустить докер. Тогда подтянет измененную папку "app". Обратите внимание, что скрипт переносит внутреннее содержимое папки в новую папку, созданную для бэкапа серверного приложения.|warn}} | ||
* Распаковать серверное приложение новой версии: | |||
<code>unzip nodejs_production_v2.103.0_uoa.zip -d backend/app</code> | <code>unzip nodejs_production_v2.103.0_uoa.zip -d backend/app</code> | ||
* Перенести папки logs, public: | |||
<code>mv -t backend/app "$SERVER_APP_BACKUP_DIR/logs/" "$SERVER_APP_BACKUP_DIR/public/"</code> | <code>mv -t backend/app "$SERVER_APP_BACKUP_DIR/logs/" "$SERVER_APP_BACKUP_DIR/public/"</code> | ||
* Если серверное приложение было собрано без демонстрационного контента (папка "assets"), то перенести папку с демонстрационным контентом: | |||
<code>mv -n -t backend/app "$SERVER_APP_BACKUP_DIR/assets/"</code> | <code>mv -n -t backend/app "$SERVER_APP_BACKUP_DIR/assets/"</code> | ||
* Перенести старые конфиги (при этом существующие файлы внутри новой сборки "config/default.js" и "config/default.schema.json" удалять не надо): | |||
<code>cp -t backend/app "$SERVER_APP_BACKUP_DIR/pm2.app.config.js" "$SERVER_APP_BACKUP_DIR/.init-db"</code> | <code>cp -t backend/app "$SERVER_APP_BACKUP_DIR/pm2.app.config.js" "$SERVER_APP_BACKUP_DIR/.init-db"</code><br> | ||
<code>cp -n -R -t backend/app/config $SERVER_APP_BACKUP_DIR/config/*</code> | <code>cp -n -R -t backend/app/config $SERVER_APP_BACKUP_DIR/config/*</code> | ||
* Дополнить параметры в конфигурационных файлах при необходимости. | |||
* Выполнить миграции с записью вывода в файл: | |||
<code>MIG_LOG_FILE_NAME=$(date +"./mig_%Y%m%d%H%M%S.log") && \</code> | <code>MIG_LOG_FILE_NAME=$(date +"./mig_%Y%m%d%H%M%S.log") && \</code><br> | ||
<code>docker exec -i smartplayer_backend_1 bash -c "LOG_LEVEL=DEBUG ./cli.js db migrate" &> "$MIG_LOG_FILE_NAME"</code> | <code>docker exec -i smartplayer_backend_1 bash -c "LOG_LEVEL=DEBUG ./cli.js db migrate" &> "$MIG_LOG_FILE_NAME"</code> | ||
* Отслеживать ход выполнения миграций командой: | |||
<code>tail -f "$MIG_LOG_FILE_NAME"</code> | <code>tail -f "$MIG_LOG_FILE_NAME"</code> | ||
* Если миграции завершились логом "All migrations are rolled.", то они выполнены успешно. Если нет, то обратиться к специалисту технической поддержки SmartPlayer для выяснения причин почему миграции не прошли | |||
* Запустить серверное приложение: | |||
<code>docker exec -it smartplayer_backend_1 bash -c "pm2 start pm2.app.config.js"</code> | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 start pm2.app.config.js"</code> | ||
* Проверить работоспособность серверного приложения. Для этого, в течении 2 минут вызывать список процессов "pm2" и убедиться, что процессы не падают (в поле "uptime" время должно расти, в соседнем поле, обозначающем количество перезапусков значение изменяться не должно): | |||
<code>docker exec -it smartplayer_backend_1 bash -c "pm2 list"</code> | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 list"</code> | ||
* Если необходимо обновить личный кабинет, то смотрим инструкцию на странице | |||
* Запустить Nginx: | |||
<code>docker-compose start web</code> | <code>docker-compose start web</code> | ||
* Осуществить проверку работоспособности сервера и ЛК, запросив у специалистов технической поддержки специальный чек-лист проверки работоспособности сервера и личного кабинета после установки обновления | |||
== '''Обновление личного кабинета''' == | == '''Обновление личного кабинета''' == | ||
* Загрузить архив с личным кабинетом на машину пользователя доступным способом | |||
* Зайти в личный кабинет и зафиксировать какие компоненты системы работают, какие нет, сколько устройств онлайн/оффлайн | |||
* Создать бэкап старой версии личного кабинета: | |||
<code>FRONTEND_BACKUP_DIR=$(date +"cms/cms_%Y%m%d%H%M%S") && \</code> | <code>FRONTEND_BACKUP_DIR=$(date +"cms/cms_%Y%m%d%H%M%S") && \</code><br> | ||
<code>mkdir "$FRONTEND_BACKUP_DIR" && \</code> | <code>mkdir "$FRONTEND_BACKUP_DIR" && \</code><br> | ||
<code>mv cms/cms/{*,.[^.]*} "$FRONTEND_BACKUP_DIR"</code> | <code>mv cms/cms/{*,.[^.]*} "$FRONTEND_BACKUP_DIR"</code> | ||
* Распаковать ЛК новой версии: | |||
<code>unzip frontend_2.103.23_api.smartplayer.org.zip -d cms/cms</code> | <code>unzip frontend_2.103.23_api.smartplayer.org.zip -d cms/cms</code> | ||
* Осуществить проверку работоспособности сервера и ЛК, запросив у специалистов технической поддержки специальный чек-лист проверки работоспособности сервера и личного кабинета после установки обновления | |||
== '''"Откат" серверного приложения на прежнюю версию''' == | == '''"Откат" серверного приложения на прежнюю версию''' == | ||
* Убедиться, что "pm2" процессы остановлены: | |||
<code>docker exec -it | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 list"</code> | ||
* Если процессы не остановлены, то остановить: | |||
<code>docker exec -it | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 stop all"</code> | ||
* Если осуществлялся запуск миграций, то откатить миграции, восстановив базу данных из дампа: | |||
<code>source .env</code> | <code>source .env</code><br> | ||
<code>zcat dumpfile.sql.gz | docker exec -i smartplayer_mysql_1 mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE</code> | <code>zcat dumpfile.sql.gz | docker exec -i smartplayer_mysql_1 mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE</code> | ||
* Вернуть папки "logs", "public", "assets" в бэкап | |||
* Вернуть серверного приложение из бэкапа, заменив содержимое папки "backend/app" | |||
* Проверить конфиги | |||
* Запустить "pm2": | |||
<code>docker exec -it | <code>docker exec -it smartplayer_backend_1 bash -c "pm2 start pm2.app.config.js"</code> | ||
* Запустить Nginx: | |||
<code>docker-compose start web</code> | <code>docker-compose start web</code> | ||
Текущая версия от 11:45, 21 мая 2025
Описание ситуации
Данная страница содержит в себе информацию связанную с обновлением сервера 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-адрес сервера на котором работает платформа>/:<путь до бэкапа> ~/<Путь куда необходимо перенести файл>

Итог
После этого действия файл бэкапа должен появится у пользователя на ПК.
Обновление серверного приложения на машине заказчика
Алгоритм обновления серверного приложения:
- Загрузить архив с серверным приложением и "node modules" на машину пользователя доступным способом
- Зайти в личный кабинет и зафиксировать какие компоненты системы работают, какие нет, сколько устройств онлайн/оффлайн
- Остановить 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/
- Создать бэкап старой версии серверного приложения:
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"
- Распаковать серверное приложение новой версии:
unzip nodejs_production_v2.103.0_uoa.zip -d backend/app
- Перенести папки logs, public:
mv -t backend/app "$SERVER_APP_BACKUP_DIR/logs/" "$SERVER_APP_BACKUP_DIR/public/"
- Если серверное приложение было собрано без демонстрационного контента (папка "assets"), то перенести папку с демонстрационным контентом:
mv -n -t backend/app "$SERVER_APP_BACKUP_DIR/assets/"
- Перенести старые конфиги (при этом существующие файлы внутри новой сборки "config/default.js" и "config/default.schema.json" удалять не надо):
cp -t backend/app "$SERVER_APP_BACKUP_DIR/pm2.app.config.js" "$SERVER_APP_BACKUP_DIR/.init-db"
cp -n -R -t backend/app/config $SERVER_APP_BACKUP_DIR/config/*
- Дополнить параметры в конфигурационных файлах при необходимости.
- Выполнить миграции с записью вывода в файл:
MIG_LOG_FILE_NAME=$(date +"./mig_%Y%m%d%H%M%S.log") && \
docker exec -i smartplayer_backend_1 bash -c "LOG_LEVEL=DEBUG ./cli.js db migrate" &> "$MIG_LOG_FILE_NAME"
- Отслеживать ход выполнения миграций командой:
tail -f "$MIG_LOG_FILE_NAME"
- Если миграции завершились логом "All migrations are rolled.", то они выполнены успешно. Если нет, то обратиться к специалисту технической поддержки SmartPlayer для выяснения причин почему миграции не прошли
- Запустить серверное приложение:
docker exec -it smartplayer_backend_1 bash -c "pm2 start pm2.app.config.js"
- Проверить работоспособность серверного приложения. Для этого, в течении 2 минут вызывать список процессов "pm2" и убедиться, что процессы не падают (в поле "uptime" время должно расти, в соседнем поле, обозначающем количество перезапусков значение изменяться не должно):
docker exec -it smartplayer_backend_1 bash -c "pm2 list"
- Если необходимо обновить личный кабинет, то смотрим инструкцию на странице
- Запустить Nginx:
docker-compose start web
- Осуществить проверку работоспособности сервера и ЛК, запросив у специалистов технической поддержки специальный чек-лист проверки работоспособности сервера и личного кабинета после установки обновления
Обновление личного кабинета
- Загрузить архив с личным кабинетом на машину пользователя доступным способом
- Зайти в личный кабинет и зафиксировать какие компоненты системы работают, какие нет, сколько устройств онлайн/оффлайн
- Создать бэкап старой версии личного кабинета:
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