Обновление системы с помощью Docker

Совет

Ниже приведен пример обновления системы с версии 2.9 на 2.10

Предварительные условия

  • Сервер, на котором размещена обновляемая версия Юниверс DG, имеет доступ к интернету.

  • Установлен Git.

  • Установлен Docker Compose (версия выше 1.29).

  • Проект Юниверс DG был клонирован на сервер.

Обновление системы

Предупреждение

Начиная с версии 2.5 был осуществлен переход с Elasticsearch на OpenSearch. Если обновлять ветку, имея поднятый docker, то старый контейнер elasticsearch будет препятствовать дальнейшим запускам. Поэтому рекомендуется выполнить нижеописанные действия

Предупреждение

В версии 2.10 произошло обновление PostgreSQL. Для обновления необходимо выполнить следующие действия.

Примечание

В версии 2.10 произошло обновление Opensearch с версии 2.7.0 на версию 2.14.0. Обновление произойдет автоматически при запуске через обновленный репозитории, предоставленный менеджером компании Юниверс.

  1. Перед обновлением остановите работу образа Docker Compose через команду docker-compose down

    • Поднять контейнеры после обновления возможно через команду: docker-compose up --force-recreate -d --remove-orphans. Последняя опция очищает Elasticsearch контейнер

  2. Войдите в репозиторий Gitlab (доступ к репозиторию с дистрибутивом вашего продукта должен быть получен заранее согласно договору поставки).

  3. Переключитесь на ветку release/2.10

  4. Извлеките проект. Команда git pull

  5. При необходимости, выполните миграцию на Opensearch с потерей или сохранением данных (см. инструкцию ниже).

  6. Перейдите в каталог с кодом. Пример команды:

    cd universe-dg-deploy
    
  7. При необходимости в файле .env, расположенном в корне проекта, измените параметры для БД и параметры портов. Пример параметров ниже.

  8. Для запуска системы используйте команду:

    docker-compose up -d
    

Пример файла .env см. в статье.

Миграция и обновление БД TimescaleDB

Создание дампа БД

  • Создайте дамп БД:

    sudo docker exec unidata-dg-deploy-postgres-dg-1 pg_dump -U postgres -Fc -d postgres -f tsdb.dump
    
    sudo docker cp unidata-dg-deploy-postgres-dg-1:./tsdb.dump ./
    

Миграция БД на другой сервер

  • Произведите миграцию дампа БД на другой сервер:

    docker exec unidata-dg-deploy-postgres-dg-1 dropdb --if-exists -U postgres postgres
    docker exec unidata-dg-deploy-postgres-dg-1 createdb -U postgres postgres
    docker cp tsdb.dump unidata-dg-deploy-postgres-dg-1:./tsdb.dump
    
    docker exec unidata-dg-deploy-postgres-dg-1 psql -U postgres -d postgres -c "SELECT timescaledb_pre_restore();"
    docker exec unidata-dg-deploy-postgres-dg-1 pg_restore -U postgres -d postgres --exit-on-error tsdb.dump
    docker exec unidata-dg-deploy-postgres-dg-1 psql -U postgres -d postgres -c "SELECT timescaledb_post_restore();"
    

Примечания:

  • Версия TimescaleDB на целевом сервере должна быть как в исходном.

  • Обновление версии Postgresql должно проводиться через восстановление дампа БД.

  • Необходимо запускать только контейнер Postgresql docker-compose up -d postgres-dg.

  • Перед импортом дампа необходимо выполнить: 'SELECT timescaledb_pre_restore();' после 'SELECT timescaledb_post_restore();'.

Обновление TimescaleDB

Последовательность обновления: timescale/timescaledb:2.7.0-pg12 -> timescale/timescaledb:2.11.2-pg12 -> timescale/timescaledb:2.11.2-pg15 -> timescale/timescaledb:2.15.0-pg15

  1. Запустите контейнер с последней версией Timescaledb для установленного Postgresql (docker compose up -d postgres-dg).

  2. Выберите желаемую версию TimescaleDB.

  3. Выберите доступный образ.

  4. Сверьтесь с таблицей совместимости версий.

  5. Запустите контейнер с новой версией образа.

  6. Выполните переход на новую версию Timescaledb до подключения к БД:

    psql -U postgres -d unidata_dg -c 'ALTER EXTENSION timescaledb UPDATE;'
    
  7. Создайте дамп БД.

  8. Переименуйте/удалите папку с БД.

  9. Запустите контейнер postgres с новой версией postgres и версией timescaledb как в дампе.

  10. Выполните миграцию БД.

При необходимости используйте вспомогательные запросы:

  • Доступные версии:

    SELECT name, version, installed
    FROM   pg_available_extension_versions
    WHERE  name = 'timescaledb';
    
  • Понизить версию:

    CREATE EXTENSION timescaledb WITH VERSION '2.7.2';
    
  • Проверить версию через psql:

    \dx
    select version();
    

Обновление PostgreSQL

Примечание

Ниже приведен пример обновления PostgreSQL с версии 12 на версию 16.3. Вы также можете воспользоваться официальной документацией PostgreSQL.

Совет

Обратите внимание, что команды должны выполняться из директории, где находится файл docker-compose.yml.

  1. Создайте резервную копию базы данных:

    $ docker exec -t unidata-dg-deploy-postgres-dg-1 pg_dump -U postgres -d postgres -F c -b -v -f /backup.dump
    
  2. Создайте копию в формате sql (на всякий случай):

    $ docker exec -t unidata-dg-deploy-postgres-dg-1 pg_dump -U postgres -d postgres > backup.sql
    
  3. Скопируйте файл дампа из контейнера на хост:

    $ docker cp unidata-dg-deploy-postgres-dg-1:/backup.dump ./backup.dump
    $ docker cp unidata-dg-deploy-postgres-dg-1:/backup.sql ./backup.sql
    

    где:

    -U postgres — пользователь базы данных;
    -d your_database_name — имя базы данных;
    -F c — формат дампа (custom);
    -b — включает большие объекты в дамп;
    -v — включает подробный вывод;
    -f backup.dump — имя файла дампа.
    
  4. Остановите и удалите контейнеры:

    $ docker-compose down
    
  5. Удалите старый том данных PostgreSQL:

    $ docker volume rm unidata-dg-deploy_dg-postgres-data
    
  6. Обновите систему.

  7. Восстановите базу данных - запустите только контейнер postgres:

    $ docker-compose up -d postgres-dg
    
  8. Скопируйте файл дампа в контейнер PostgreSQL 16.3:

    $ docker cp ./backup.dump unidata-dg-deploy-postgres-dg-1:/backup.dump
    
  9. Восстановите базу данных из дампа:

    $ docker exec -i unidata-dg-deploy-postgres-dg-1 pg_restore -U postgres -d postgres -v /backup.dump
    
  10. Запустите контейнеры с обновленной конфигурацией:

    $ docker-compose up -d
    

Переход с ElasticSearch на OpenSearch

Примечание

Шаги по переходу на OpenSearch требуются, если система Юниверс DG обновляется с версии 2.4 и старше на версию 2.5 и новее. Если переход уже был выполнен - шаги пропускаются

Переход на OpenSearch с потерей данных

  • Поскольку данные не будут перенесены, выполните операцию переиндексации данных, а при наличии правил качества - операцию переприменения данных.

Важные примечания:

  • Если в качестве хранилища для аудита выбран поисковой движок, журнал событий будет утерян — его невозможно восстановить из БД, даже если она также указана в качестве хранилища.

Переход на OpenSearch с переносом данных

  1. В docker-compose конфигурации контейнера Opensearch укажите существующий volume с данными Elasticsearch — dg-elasticsearch-data:/usr/share/opensearch/data.

  2. В случае если необходимо избавиться от упоминания Elastic, то можно оставить volume по умолчанию (dg-opensearch-data), выполнив одно из двух действий:

    • Клонировать volume. Пример:

      docker run --rm \
          -v unidata-dg-deploy_dg-elasticsearch-data:/original \
          -v unidata-dg-deploy_dg-opensearch-data:/migration \
          ubuntu:latest \
          bash -c "cp -R /original/* /migration/"
      
    • Переименовать volume:

      mv /var/lib/docker/volumes/unidata-dg-deploy_dg-elasticsearch-data /var/lib/docker/volumes/unidata-dg-deploy_dg-opensearch-data