Общее описание

Для перехода со схемы, использующей однохостовую установку, на схему с резервированием требуется выполнить миграцию данных БД. Это необходимо, т. к. контейнер БД PostgreSQL, предназначенный для работы в схеме с резервированием БД имеет отдельный образ, в состав которого включен "Replication manager for PostgreSQL clusters" (далее repmng).

Данная особенность образа БД, предназначенного для использования в схеме с резервированием, не позволяет выполнить прямую миграцию данных. Для этого требуется выполнить резервное копирование БД, развернуть БД с резервированием с "нуля" и выполнить восстановление БД.

Версия NAICEНазвание образа и версия
1.0postgres: 1.0.6
1.0postgres-repmgr: 1.0.6

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

Порядок миграции БД

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

Этап 1. Выгрузка файла бэкапа текущих настроек БД.

  • Выгрузка скриптом резервной копии БД (скрипты включены в образ БД).

Этап 2. Разворачивание на новых хостах кластера БД PostgreSQL.

  • Удаление текущей однохостовой установки, если планируется использовать его как часть кластера. 
  • Установка кластера БД в соответствии с инструкцией v1.0_3.4 Установка с резервированием

Этап 3. Загрузка ранее выгруженного бэкапа данных в кластер БД PostgreSQL.

  • Загрузка ранее выгруженного бэкапа данных БД скриптом;
  • Установка сервисов NAICE.

Выполнение миграции БД

Этап 1. Выгрузка файла бэкапа текущих данных БД однохостовой установки

1. Передать в контейнер postgres команду на запуск скрипта для формирования бэкапа:

sudo docker exec -it naice-postgres /scripts/backup/backup.sh
Пример успешного выполнение команды на создание резервной копии
$ sudo docker exec -it naice-postgres /scripts/backup/backup.sh
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.32] INFO  ==> Validation required env variables for backup
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.32] INFO  ==> Checking variables..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.33] DEBUG ==>   'BACKUPS_DIR' = /var/backups
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.33] DEBUG ==>   'URSUS_POSTGRES_DB' = ursus
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.33] DEBUG ==>   'LEPUS_POSTGRES_DB' = lepus
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.34] DEBUG ==>   'AQUILA_POSTGRES_DB' = aquila
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.34] DEBUG ==>   'MUSTELA_POSTGRES_DB' = mustela
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.34] DEBUG ==>   'OVIS_OVIS_POSTGRES_DB' = ovis
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.35] DEBUG ==>   'POSTGRES_USER' = postgres
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.35] DEBUG ==>   'POSTGRES_PASSWORD' = postgres
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.36] INFO  ==> Ok, all required variables are set
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.36] INFO  ==> Directory for backups from env. variable '$BACKUPS_DIR:/var/backups'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.37] INFO  ==> Creating directory '/var/backups'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.37] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.37] INFO  ==> ok, directory is created
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.38] INFO  ==> Starting backup of database 'ursus' to /var/backups/ursus_2025-11-14_08-25-02_318.sql with excluded data for tables events..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.38] DEBUG ==> Call 'PGPASSWORD=postgres pg_dump -U postgres -d ursus -f /var/backups/ursus_2025-11-14_08-25-02_318.sql --inserts -c --if-exists --exclude-table-data events'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.58] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.59] INFO  ==> Ok, backup is created.
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.59] INFO  ==> Starting backup of database 'lepus' to /var/backups/lepus_2025-11-14_08-25-02_318.sql..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.59] DEBUG ==> Call 'PGPASSWORD=postgres pg_dump -U postgres -d lepus -f /var/backups/lepus_2025-11-14_08-25-02_318.sql --inserts -c --if-exists'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.72] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.73] INFO  ==> Ok, backup is created.
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.73] INFO  ==> Starting backup of database 'aquila' to /var/backups/aquila_2025-11-14_08-25-02_318.sql with excluded data for tables tacacs_sessions|tacacs_accounting..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.74] DEBUG ==> Call 'PGPASSWORD=postgres pg_dump -U postgres -d aquila -f /var/backups/aquila_2025-11-14_08-25-02_318.sql --inserts -c --if-exists --exclude-table-data tacacs_sessions|tacacs_accounting'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.84] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.85] INFO  ==> Ok, backup is created.
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.85] INFO  ==> Starting backup of database 'mustela' to /var/backups/mustela_2025-11-14_08-25-02_318.sql with excluded data for tables events..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.86] DEBUG ==> Call 'PGPASSWORD=postgres pg_dump -U postgres -d mustela -f /var/backups/mustela_2025-11-14_08-25-02_318.sql --inserts -c --if-exists --exclude-table-data events'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.97] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.97] INFO  ==> Ok, backup is created.
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.98] INFO  ==> Starting backup of database 'ovis' to /var/backups/ovis_2025-11-14_08-25-02_318.sql with excluded data for tables radius_sessions..
[BACKUP] [2025-11-14_08-25-02_318] [08:25:02.98] DEBUG ==> Call 'PGPASSWORD=postgres pg_dump -U postgres -d ovis -f /var/backups/ovis_2025-11-14_08-25-02_318.sql --inserts -c --if-exists --exclude-table-data radius_sessions'
[BACKUP] [2025-11-14_08-25-02_318] [08:25:03.07] 
[BACKUP] [2025-11-14_08-25-02_318] [08:25:03.07] INFO  ==> Ok, backup is created.
[BACKUP] [2025-11-14_08-25-02_318] [08:25:03.08] INFO  ==> Start compressing backups to file naice_2025-11-14_08-25-02_318.tar.gz
[BACKUP] [2025-11-14_08-25-02_318] [08:25:03.10] INFO  ==> The backup was successfully compressed to '/var/backups/naice_2025-11-14_08-25-02_318.tar.gz'

Выгрузка резервной копии БД выполняется на хост в папку <путь установки NAICE>/backups. По умолчанию это папка /etc/docker-naice/backups/.

2. Убедиться, что в папке присутствует файл с резервной копией БД с именем, которое отображалось в логах при создании резервной копии.

Этап 2. Разворачивание на новых хостах кластера БД PostgreSQL

1. Если планируется переиспользование текущей однохостовой установки в качестве части кластера, то предварительно необходимо перенести файл резервной копии из папки установки NAICE (по умолчанию - /etc/docker-naice/) и удалить эту папку:

$ sudo mv /etc/docker-naice/backups/naice_2025-11-14_08-25-02_318.tar.gz ~
$ docker compose -f /etc/docker-naice/docker-compose.yml down
$ sudo rm -rf /etc/docker-naice/

2. Установить кластер БД в соответствии с инструкцией v1.0_3.4 Установка с резервированием в разделе Установка кластера СУБД PostgreSQL. Сервисы NAICE на данном этапе устанавливать не нужно!

Этап 3. Загрузка ранее выгруженного бэкапа данных в кластер БД PostgreSQL

Внимание! Загрузка резервной копии данных в БД, использующую кластерную схему резервирования, возможна только на ноде, находящейся в состоянии Primary!

1. Определить, какая нода находится в состоянии Primary (описано в v1.0_3.4 Установка с резервированием в разделе Проверка состояния кластера PostgreSQL).

2. Перенести ранее выгруженный файл данных с сервера с однохостовой установкой на ноду кластера БД PostgreSQL в состоянии Primary.

3. Файл с резервной копией необходимо поместить в папку <путь к БД>/postgres/backups. Эта папка доступна пользователю с правами root.

Пример переноса архива данных БД при выполнении на хосте, где работает нода кластера PostgreSQL
$ sudo scp tester@100.110.2.202:/etc/docker-naice/backups/naice_2025-11-14_08-25-02_318.tar.gz /etc/docker-naice/postgres/backups
The authenticity of host '100.110.2.202 (100.110.2.202)' can't be established.
ED25519 key fingerprint is SHA256:4YUjqgXmieg9JM9kU49/yk5BA9+ndhEK78sX8flb2+w.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '100.110.2.202' (ED25519) to the list of known hosts.
tester@100.110.2.202's password:
naice_2025-11-14_08-25-02_318.tar.gz                                                                                                                                 100%   21KB   8.3MB/s   00:00

4. В зависимости от того, какая надо находится в состоянии Primary, передать в контейнер команду на запуск скрипта для восстановления данных из резервной копии:

Команда для ноды 1 кластера PostgreSQL:

sudo docker exec -it naice-postgres-1 /home/worker/scripts/backup/restore.sh

Команда для ноды 2 кластера PostgreSQL:

sudo docker exec -it naice-postgres-2 /home/worker/scripts/backup/restore.sh

В конце лога выполнения команды появится сообщение:

[RESTORE] [naice_2025-11-14_08-25-02_318] [08:55:15.90] INFO  ==> Ok, restoring is completed.
[RESTORE] [naice_2025-11-14_08-25-02_318] [08:55:15.90] INFO  ==> All databases were successfully restored from available dumps.

5. Выполнить установку сервисов NAICE в соответствии с инструкцией v1.0_3.4 Установка с резервированием в разделе Установка кластера NAICE.

  • Нет меток