Перейти к содержанию

Резервное копирование, восстановление резервной копии и обновление версии

В текущей версии Системы используется база данных SQLite Django-приложения, для ее резервного копирования и восстановления резервной копии следует использовать образ Docker-контейнера, порядок использования которого представлен в разделах «Подготовка к запуску» и «Подготовка окружения при локальном использовании».

Для обеспечения непрерывности работы Системы, развернутой в Docker-контейнере и использующей базу данных PostgreSQL как отдельный сервис, необходимо выполнить процедуры, описанные ниже.

Данный раздел включает описание следующих процессов:

  • Резервное копирование (backup) базы данных и конфигурационных данных.
  • Пошаговое восстановление при частичных и полных отказах.
  • Безопасное обновление версий приложения с возможностью отката.

Введем исходные допущения:

  • Система запущена под именем контейнера ml_scanner.
  • Образ приложения: my-django-app:<YYYYMMDD-HHMM>.
  • PostgreSQL-контейнер называется postgres_ml, том данных – pgdata_ml.

Резервное копирование

В таблице ниже представлены операции резервного копирования Системы.

Объект копирования Команда / инструмент Периодичность Место хранения
Логическая копия БД (pg_dump) docker exec postgres_ml pg_dump -U postgres -F c -f /var/lib/postgresql/data/db_$(date +%F).dump ml_db Ежедневно, 02:00 /backup/ml_scanner/
Архив тома pgdata_ml docker run --rm -v pgdata_ml:/db -v /backup:/backup alpine tar czf /backup/pgdata_$(date +%F).tgz /db Еженедельно, вс 03:00 /backup/
Исходный код и файл .env.dev tar czf /backup/ml_scanner/src_$(date +%F-%H%M).tgz /opt/ml-scanner Перед каждым релизом /backup/ml_scanner/
Очистка архивов старше 30 суток find /backup -type f -mtime +30 -delete Еженедельно, сб 04:00 ---

При наличии требований по криптографической защите архивы шифруются командой: gpg -c /backup/pgdata_YYYY-MM-DD.tgz; ключ шифрования хранится в защищённом хранилище (HSM или Vault).

Частичное восстановление (логическая загрузка)

Используется при целостном томе pgdata_ml, но повреждённых данных:

cp /backup/ml_scanner/db_2025-05-22.dump /tmp/
docker exec -it postgres_ml pg_restore \
    -U postgres -d ml_db --clean /tmp/db_2025-05-22.dump

Полное восстановление

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

  1. Остановка сервисов:

    docker stop ml_scanner
    docker stop postgres_ml
    
  2. Пересоздание тома БД:

    docker volume rm pgdata_ml
    docker volume create pgdata_ml
    
  3. Запуск пустого контейнера PostgreSQL:

    docker run -d --name postgres_ml \
            -e POSTGRES_PASSWORD=postgres \
            -v pgdata_ml:/var/lib/postgresql/data \
            postgres:14
    
  4. Развёртывание архивной копии:

    docker run --rm \
            -v pgdata_ml:/db \
            -v /backup:/backup \
            alpine sh -c \
            "cd /db && tar xzf /backup/pgdata_2025-05-18.tgz --strip 1"
    
  5. Перезапуск базы данных и приложения:

    docker restart postgres_ml
    docker start   ml_scanner
    

Обновление версии

Последовательность действий при обновлении версии Системы:

    cd /opt/ml-scanner
    docker build -t my-django-app:20250522-1500 .
    docker stop ml_scanner && docker rm ml_scanner
    docker run --name ml_scanner \
            --env-file .env.dev \
            -d -p 8003:8003 \
            my-django-app:20250522-1500

Возврат к предыдущему образу выполняется с помощью следующих команд:

    docker stop ml_scanner && docker rm ml_scanner
    docker run --name ml_scanner \
            --env-file .env.dev \
            -d -p 8003:8003 \
            my-django-app:20250518-0900