Обновление до v19.02

В версии v19.02 существенно улучшена работа с базой данных, чтобы не возникало проблем после обновлений (например, игнорирования некоторых настроек). Однако штатное обновление до версии v19.02 не работает. Нужно пользоваться специальной процедурой.

Процедура обновления

Предполагается, что Mitigator старой версии в рабочем состоянии, а также выполнен вход в хранилище образов:

docker login docker.mitigator.ru

В ходе процедуры будет указано, когда и как сделать резервные копии. На случай проблем предусмотрен откат изменений.

  1. Сделать резервные копии Compose-файлов:

    cp docker-compose.yml docker-compose.bak
    cp docker-compose.override.yml docker-compose.override.bak || true
    
    1. Переключиться на специальные версии Postgres и бэкенда. Для этого в файле docker-compose.override.yml их свойства image должны быть такими:
    version: "3"
    services:
        backend:
            image: docker.mitigator.ru/product/backend:pre-v19.02
        postgres:
            image: docker.mitigator.ru/product/postgres:v19.01
    

    Если этот файл не используется, можно просто записать в него эти строки.

  2. Обновить только бэкенд:

    docker-compose pull backend postgres
    docker-compose up -d backend postgres
    docker-compose logs -f backend | grep -m1 'was started'
    
    1. Остановить бэкенд:
    docker-compose rm -sf backend
    
  3. Сохранить данные из базы:

    docker-compose exec postgres pg_dump --user mitigator \
        --data-only --inserts --column-inserts --schema public \
        >backup.sql
    
    1. Остановить Mitigator:
    docker-compose down
    
  4. Сохранить полную резервную копию базы данных на случай проблем:

    tar -czf postgres.tgz -C /var/lib/docker/volumes/mitigator_postgres _data
    
    1. Удалить том с данными:
    docker volume rm mitigator_postgres
    
  5. Вернуть docker-compose.override.yml в прежнее состояние (удалить, если его не было):

    mv docker-compose.override.bak docker-compose.override.yml ||
            rm docker-compose.override.yml
    
    1. Обновить Compose-файл:
    wget https://docker.mitigator.ru/dist/docker-compose.yml \
            -O docker-compose.yml
    
  6. Указать версию системы v19.02:

    sed -e 's:^VERSION=.*:VERSION=v19.02:' -i .env
    
    1. Загрузить все образы новой версии:
    docker-compose pull
    
  7. Запустить только базу данных:

    docker-compose up -d postgres
    
    1. Подготовить данные из старой базы к загрузке в новую:
    sed -e "s:INTO public.:INTO backend.:" -i backup.sql
    sed -e "s:setval('public.:setval('backend.:" -i backup.sql
    
  8. Восстановить данные из резервной копии (это может занять минуты):

    docker-compose exec -T postgres psql -U postgres mitigator \
            <backup.sql >restore.log
    

    Сообщения базы об ошибках на этом шаге можно игнорировать.

    1. Загрузить дополнительный скрипт миграции данных и запустить его:
    wget https://docker.mitigator.ru/kb/update-v19.02/migrate.sql
    
    docker-compose exec -T postgres psql -U postgres mitigator \
            <migrate.sql >migrate.log
    
    1. Запустить новую версию системы:
    docker-compose up -d
    

Откат изменений

  1. Остановить Mitigator:

    docker-compose down
    
    1. Удалить базу данных:

      docker volume rm mitigator_postgres
      
    2. Восстановить базу данных из резервной копии:

    mkdir -p /var/lib/docker/volumes/mitigator_postgres
    tar -C /var/lib/docker/volumes/mitigator_postgres -xf postgres.tgz
    
  2. Убедиться, что docker-compose.yml и docker-compose.override.yml (если используется) соответствуют старой версии:

    cp docker-compose.bak docker-compose.yml
    test -f docker-compose.override.bak && \
        cp docker-compose.override.bak docker-compose.override.yml || \
        rm docker-compose.override.yml
    
    1. Убедиться, что в .env есть одна строка с VERSION, соответствующая версии, к которой делается откат, например, VERSION=v19.01.

    2. Запустить Mitigator:

    docker-compose up -d