Инструкция по миграции MySQL → PostgreSQL#
Введение#
ВАЖНО! ЕСЛИ у вас версия AI Server равна или меньше 2.0.0 то в вашей версии используется MySQL и PostgreSQL 16 версии одновременно. В новой версии 2.1.0+ используется только PostgreSQL 17 версии.
Вам необходимо сделать миграцию с mysql на PostgreSQL, а так же выполнить миграцию данных с 16 версии PostgreSQL на 17 версию.
Эта инструкция описывает процесс миграции базы данных Sherpa AI Server с MySQL на PostgreSQL. Миграция включает перенос данных, обновление конфигураций и переход на новую систему управления базами данных.
ВНИМАНИЕ! Если у вас есть возможность ОТКАЗАТЬСЯ ОТ ДАННЫХ (ЕСЛИ ОНИ ВАМ НЕ НУЖНЫ) рекомендуем вместо выполнения данной инструкции перейти к инструкции по установке c нуля:
Системные требования#
Минимальные требования для миграции:#
- Свободное место на диске: минимум 2x размер базы данных (для исходных данных + миграция)
- Оперативная память: минимум 4 ГБ RAM для pgloader
- Docker: версия 20.10+ с поддержкой Docker Compose
- Сетевое подключение: стабильное соединение с базами данных
Предварительные проверки#
Перед запуском миграции выполните следующие проверки:
# Проверьте доступное место на диске
df -h
# Проверьте доступную оперативную память
free -h
# Проверьте статус Docker
docker --version
docker compose version
# Проверьте доступность баз данных
docker ps | grep -E "(mysql|postgres)"
💡 Комментарии к проверкам
df -h - показывает использование дискового пространства в человеко-читаемом формате
- Проверьте, что свободного места минимум в 2 раза больше размера вашей базы данных
free -h - показывает информацию об оперативной памяти
- Для pgloader требуется минимум 4 ГБ RAM
- При недостатке памяти миграция может завершиться с ошибкой "Heap exhausted"
docker --version - проверяет версию Docker
- Требуется Docker 20.10+ для корректной работы всех функций
docker compose version - проверяет версию Docker Compose
- Убедитесь, что compose поддерживает современный синтаксис
docker ps - показывает запущенные контейнеры
- Должны быть видны контейнеры mysql/postgres для доступа к данным
Подготовка к миграции#
Скачивание необходимых файлов#
Если контур закрыт, необходимо скачать заранее АРХИВЫ ДЛЯ УСТАНОВКИ и в дополнение следующие файлы:
curl -fSL -OJ https://sherparpa.ru/downloads/private/SherpaAIServer/pgloader_image.tar
curl -fSL -OJ https://sherparpa.ru/downloads/private/SherpaAIServer/alpine_image.tar
💡 Комментарии к скачиванию файлов
curl -fSL -OJ - скачивает файлы с сервера
-f- тихо завершается при ошибках сервера-S- показывает ошибки даже при использовании -f-L- следует редиректам-O- сохраняет файл с именем с сервера-J- использует имя файла, предоставленное сервером
pgloader_image.tar - Docker-образ с инструментом pgloader для переноса данных alpine_image.tar - легковесный Linux-образ для операций с файлами
Создайте директорию /opt/SherpaAIServerNew и поместите в нее все скачанные архивы И ФАЙЛЫ ИЗ ИНСТРУКЦИИ ПО УСТАНОВКЕ:
# Создайте новую директорию для миграции
sudo mkdir -p /opt/SherpaAIServerNew
# Переместите скачанные файлы в новую директорию (и файлы из подготовки к скачиванию)
sudo mv pgloader_image.tar /opt/SherpaAIServerNew/
sudo mv alpine_image.tar /opt/SherpaAIServerNew/
💡 Комментарии к подготовке директории
sudo mkdir -p - создает директорию с родительскими папками
-pпредотвращает ошибку если директория уже существует
sudo mv - перемещает файлы в новую директорию
- Перемещение в
/opt/SherpaAIServerNewизолирует файлы миграции от текущей установки
Что скачивается:
pgloader_image.tar- Docker-образ с pgloader и необходимыми инструментамиalpine_image.tar- легковесный образ Alpine Linux для работы с volume (не влияет на вашу текущую операционную систему)
Остановка сервисов#
- Остановка контейнеров кроме баз данных:
# перейти в старую директорию
cd /opt/SherpaAIServer/
docker compose stop orchestrator embed nginx vllm
docker-compose stop orchestrator embed nginx vllm
# перейти в новую директорию
cd /opt/SherpaAIServerNew/
💡 Комментарии к остановке сервисов
docker compose stop - останавливает указанные сервисы без удаления
orchestrator- основной сервис оркестрацииembed- сервис для работы с эмбеддингамиnginx- веб-сервер и проксиvllm- сервис языковой модели
Две команды - выполнены обе версии синтаксиса для совместимости Оставшиеся сервисы - pgembeding (PostgreSQL с эмбеддингами) и orchestrator-db (MySQL) должны продолжать работать для доступа к данным
Почему останавливаем сервисы: Во время миграции необходимо исключить любые изменения в базе данных, чтобы обеспечить консистентность данных.
Примечание: Не нужно удалять контейнеры, только остановить. Должны остаться pgembeding и orchestrator-db.
Создание резервных копий#
Определение имен volumes:
Сначала найдите правильные имена volumes в вашей системе:
docker volume list
💡 Комментарии к определению volumes
docker volume list - показывает все Docker volumes в системе
DRIVER- тип драйвера (обычно local)VOLUME NAME- уникальное имя volume
Префикс имен - зависит от названия папки проекта:
- Для папки
SherpaAIServer→ префиксsherpaaiserver_ - Для папки
myproject→ префиксmyproject_
Основные volumes:
*orchestrator-mysql-data- данные MySQL базы*pgdata- данные PostgreSQL базы*storage- файловое хранилище
Пример вывода:
DRIVER VOLUME NAME
local sherpaaiserver_orchestrator-mysql-data
local sherpaaiserver_pgdata
local sherpaaiserver_storage
Создание бэкапов volume:
Замените имена volumes на актуальные из вашего списка:
# Бэкап MySQL данных (замените VOLUME_NAME на реальное имя)
docker run --rm -v VOLUME_NAME:/data -v $(pwd)/backup_mysql:/backup pgembeding tar czf /backup/mysql_backup.tar.gz -C /data .
# Бэкап PostgreSQL данных (если существуют) (замените VOLUME_NAME на реальное имя с postgres)
docker run --rm -v VOLUME_NAME:/data -v $(pwd)/backup_pg:/backup pgembeding tar czf /backup/pg_backup.tar.gz -C /data .
💡 Комментарии к созданию бэкапов
docker run --rm - запускает контейнер и автоматически удаляет его после выполнения
--rmпредотвращает накопление остановленных контейнеров
Монтирование volumes:
-v VOLUME_NAME:/data- монтирует Docker volume в контейнер-v $(pwd)/backup_mysql:/backup- монтирует локальную папку для сохранения архива
tar czf - создает сжатый архив
c- создать архивz- сжать с помощью gzipf- указать имя файла-C /data .- изменяет директорию на /data перед архивацией
pgembeding - использует существующий образ PostgreSQL с инструментами
Примеры с конкретными именами:
Для проекта в папке SherpaAIServer:
docker run --rm -v sherpaaiserver_orchestrator-mysql-data:/data -v $(pwd)/backup_mysql:/backup pgembeding tar czf /backup/mysql_backup.tar.gz -C /data .
docker run --rm -v sherpaaiserver_pgdata:/data -v $(pwd)/backup_pg:/backup pgembeding tar czf /backup/pg_backup.tar.gz -C /data .
💡 Пример для Sherpa AI Server
Первый volume: sherpaaiserver_orchestrator-mysql-data
- Содержит данные MySQL базы orchestrator
- Архив сохраняется в
backup_mysql/mysql_backup.tar.gz
Второй volume: sherpaaiserver_pgdata
- Содержит данные PostgreSQL базы (если есть)
- Архив сохраняется в
backup_pg/pg_backup.tar.gz
Для проекта в папке myproject:
docker run --rm -v myproject_orchestrator-mysql-data:/data -v $(pwd)/backup_mysql:/backup pgembeding tar czf /backup/mysql_backup.tar.gz -C /data .
docker run --rm -v myproject_pgdata:/data -v $(pwd)/backup_pg:/backup pgembeding tar czf /backup/pg_backup.tar.gz -C /data .
💡 Пример для myproject
Первый volume: myproject_orchestrator-mysql-data
- Аналогично, но с префиксом
myproject_ - Используйте реальное имя папки вашего проекта
Второй volume: myproject_pgdata
- PostgreSQL данные с соответствующим префиксом
💡 Что делают эти команды
- Создают сжатые архивы всех данных из Docker volume
- Архивы сохраняются в локальные директории
backup_mysqlиbackup_pg
Проверка созданных бэкапов:
# Проверьте размер архивов
ls -lh backup_mysql/ backup_pg/
# Проверьте содержимое архивов
tar -tzf backup_mysql/mysql_backup.tar.gz | head -20
💡 Комментарии к проверке бэкапов
ls -lh - показывает подробную информацию о файлах
-l- длинный формат-h- размеры в человеко-читаемом виде- Проверьте, что архивы имеют разумный размер
tar -tzf - показывает содержимое архива без распаковки
-t- список содержимого-z- распаковать с помощью gzip-f- указать имя файла| head -20- показывает первые 20 файлов
Рекомендация: Убедитесь, что архивы не пустые и содержат ожидаемые файлы базы данных
Основная логика миграции#
Разархивирование и подготовка инструментов#
- Разархивировать client files:
tar -xvzf "$(ls client_files_*.tgz | sort -V | tail -n 1)"
💡 Комментарии к разархивированию
tar -xvzf - распаковывает архив
-x- извлечь-v- подробный вывод-z- распаковать с помощью gzip-f- указать имя файла
Подкоманда выбора файла:
ls client_files_*.tgz- находит все архивы client-filessort -V- сортирует по версии (1.0, 1.1, 2.0 и т.д.)tail -n 1- берет последний (самый свежий) файл
Результат: Создается папка pgloader с инструментами миграции
- Перейти в директорию pgloader:
cd pgloader
💡 Комментарии к переходу в директорию
cd pgloader - переходит в папку с инструментами миграции
- Все последующие команды выполняются из этой директории
- Содержит скрипты и конфигурации для pgloader
- Загрузка Docker-образа pgloader:
./load_pgloader.sh
💡 Комментарии к загрузке образа
./load_pgloader.sh - скрипт загрузки Docker-образа
- Импортирует
pgloader_image.tarв локальный Docker daemon - После выполнения образ становится доступен как
pgloader:latest - Может занять несколько минут в зависимости от размера образа
- Сборка контейнера для миграции:
./run.sh build
💡 Комментарии к сборке контейнера
./run.sh build - собирает Docker-контейнер для миграции
- Создает контейнер на основе загруженного образа pgloader
- Настраивает все необходимые зависимости и инструменты
- После сборки контейнер готов к выполнению миграции
Настройка конфигурации миграции#
Создание файла .env с параметрами подключения:
Все пароли можно найти в файле oais/backend/config/config.ini.
cp .env.template .env
nano .env
# URI для исходной MySQL базы данных
MIGRATE_MYSQL="mysql://user:pass@host:port/db"
# URI для целевой PostgreSQL базы данных
MIGRATE_PG="postgres://user:pass@host:port/db"
# Параметры для создания дампа (опционально)
DUMP_PATH="/path/для/дампа"
DUMP_URI="mysql://user:pass@host/db"
# Параметры для восстановления (опционально)
RESTORE_URI="postgres://user:pass@host/db"
RESTORE_PATH="/path/к/дампу.sql"
💡 Комментарии к переменным окружения
MIGRATE_MYSQL - URI подключения к исходной MySQL базе
- Формат:
mysql://username:password@host:port/database - Используется pgloader для чтения данных
MIGRATE_PG - URI подключения к целевой PostgreSQL базе
- Формат:
postgres://username:password@host:port/database - Должна быть доступна для записи данных
DUMP_ / RESTORE_ ** - опциональные параметры для создания/восстановления дампов
- Полезны для отладки или поэтапной миграции
Пример рабочей конфигурации:
# Для MySQL базы данных
DUMP_URI="mysql://root:pass@91.206.149.183:3306/orchestrator"
MIGRATE_MYSQL="mysql://root:pass@91.206.149.183:3306/orchestrator"
# Для PostgreSQL базы данных
MIGRATE_PG="postgres://postgres:pass@91.206.149.183:5432/postgres"
💡 Пример конфигурации
MySQL параметры:
- Хост:
91.206.149.183(внешний сервер) - Порт:
3306(стандартный для MySQL) - База:
orchestrator - Пользователь:
root(с полными правами)
PostgreSQL параметры:
- Хост: тот же сервер
- Порт:
5432(стандартный для PostgreSQL) - База:
postgres(системная база) - Пользователь:
postgres(администратор)
Важно: Пароли должны быть взяты из существующего config.ini
Важно: Убедитесь, что порты и хосты доступны из контейнера Docker.
Выполнение миграции#
Тестовый запуск (рекомендуется)
./run.sh dry-run
💡 Комментарии к тестовому запуску
./run.sh dry-run - симуляция миграции без изменений
- Подключается к обеим базам данных
- Анализирует структуру и данные
- Показывает план миграции и потенциальные проблемы
- Не вносит никаких изменений в PostgreSQL
Проверяет:
- Доступность и корректность подключений
- Совместимость типов данных MySQL → PostgreSQL
- Наличие всех таблиц и связей
- Ожидаемый объем данных для переноса
Рекомендация: Всегда выполняйте dry-run перед реальной миграцией
Основная миграция
./run.sh migrate
💡 Комментарии к основной миграции
./run.sh migrate - выполняет фактическую миграцию данных
- Создает схему
orchestratorв PostgreSQL - Переносит структуру таблиц с преобразованием типов
- Копирует все данные из MySQL в PostgreSQL
- Создает индексы и ограничения целостности
Этапы выполнения:
- Проверка подключений и прав доступа
- Создание схемы базы данных
- Миграция структуры (таблицы, типы данных)
- Перенос данных с оптимизацией производительности
- Создание индексов и ограничений
Важно: Процесс может быть долгим для больших баз данных
Опции миграции:
--force- выполнить миграцию даже если схема уже существует--build- пересобрать контейнер перед запуском--rmi- удалить образ после завершения
Время выполнения: Зависит от размера базы данных. Для баз до 10 ГБ - от 30 минут до нескольких часов. Для больших баз - может занять несколько часов или дней.
Очистка после миграции#
# Удаление Docker-образа pgloader (опционально)
./run.sh rmi
# Возврат в корневую директорию проекта
cd ..
💡 Комментарии к очистке
./run.sh rmi - удаляет Docker-образ pgloader
- Освобождает дисковое пространство
- Удаляет временные образы и контейнеры
- Опционально - можно оставить для повторного использования
cd .. - возвращает в родительскую директорию
- Выходит из папки pgloader
- Возвращает в корень проекта SherpaAIServer
Рекомендация: Выполняйте очистку только после успешного завершения и тестирования миграции
Копирование данных в новые volumes#
После успешной миграции базы данных может потребоваться перенос файлового хранилища между Docker volumes.
Загрузка Alpine образа#
docker load -i alpine_image.tar
💡 Комментарии к загрузке Alpine
docker load -i - импортирует Docker-образ из tar-архива
-i- читать из локально сохраненного tar-архива- Загружает образ в локальный Docker daemon
Alpine Linux - минималистичный дистрибутив Linux
- Размер образа ~5-10 МБ (в сравнении с Ubuntu ~100+ МБ)
- Содержит только необходимые инструменты (cp, ls, tar и т.д.)
- Идеален для операций с файлами в контейнерах
Использование: Для копирования данных между Docker volumes
Создание нового volume#
docker volume create aiserver-storage
💡 Комментарии к созданию volume
docker volume create - создает новый именованный Docker volume
aiserver-storage- имя для нового volume- Volume создается пустым и готовым для использования
Характеристики volume:
- Управляется Docker автоматически
- Доступен всем контейнерам на хосте
- Сохраняется при перезапуске Docker daemon
- Поддерживает snapshot и backup операции
Назначение: Хранилище файлов Sherpa AIServer (загрузки, кэш, логи и т.д.)
Определение текущих volumes#
Найти имена используемых volumes:
docker volume list
💡 Повторное определение volumes
docker volume list - повторная проверка списка volumes
- Убеждаемся, что все volumes доступны
- Проверяем корректность имен перед копированием данных
Важно: Сравните с результатами первой проверки
- Убедитесь, что volumes не были случайно удалены
- Проверьте доступность всех необходимых данных
Пример вывода (имена зависят от названия папки проекта):
DRIVER VOLUME NAME
local sherpaaiserver_orchestrator-mysql-data
local sherpaaiserver_pgdata
local sherpaaiserver_storage
Или, если папка проекта называется иначе (например, myproject):
DRIVER VOLUME NAME
local myproject_orchestrator-mysql-data
local myproject_pgdata
local myproject_storage
Перенос данных между volumes#
Определить источник данных:
В команде ниже замените STORAGE_DATA на имя вашего текущего volume для хранения данных (например, sherpaaiserver_storage):
docker run --rm \
-v STORAGE_DATA:/from \
-v aiserver-storage:/to \
alpine ash -c "cp -av /from/. /to/"
💡 Комментарии к переносу данных
docker run --rm - запускает временный контейнер Alpine
--rm- контейнер удалится после выполнения
Монтирование volumes:
-v STORAGE_DATA:/from- исходный volume монтируется в /from-v aiserver-storage:/to- целевой volume монтируется в /to
ash -c - выполняет команду в shell Alpine
ash- Almquist shell (легковесный)-c- выполнить команду
cp -av /from/. /to/ - копирует все файлы
-a- режим архивации (сохраняет права, владельцев, временные метки)-v- подробный вывод/from/.- копирует содержимое, а не саму папку /from/to/- в целевую директорию
Пример замены: STORAGE_DATA → sherpaaiserver_storage
Проверка успешности копирования:
# Проверить содержимое нового volume
docker run --rm -v aiserver-storage:/data alpine ls -la /data
# Сравнить размеры (примерные)
docker run --rm -v STORAGE_DATA:/data alpine du -sh /data
docker run --rm -v aiserver-storage:/data alpine du -sh /data
💡 Комментарии к проверке копирования
docker run --rm -v aiserver-storage:/data alpine ls -la /data
- Проверяет содержимое нового volume
ls -laпоказывает все файлы с правами доступа и размерами- Убеждаемся, что файлы скопировались корректно
docker run --rm -v STORAGE_DATA:/data alpine du -sh /data
- Проверяет размер исходного volume
du -sh- использование диска, сводка, человеко-читаемый формат- Сравниваем размеры для проверки полноты копирования
Ожидания:
- Количество файлов должно совпадать
- Размеры должны быть примерно равны
- Структура директорий должна быть идентичной
Если размеры отличаются: Проверьте логи копирования на ошибки
Миграция с PostgreSQL 16 на 17 версию#
Подготовка к обновлению версии PostgreSQL#
Предварительные действия:
- Оставить старую базу данных запущенной - контейнер
pgembedingдолжен продолжать работать - Распаковать новые client-files - в архиве должны быть обновленные
docker-compose.ymlи.env - Перенести конфигурацию - скопировать параметры подключения из старой версии
/opt/SherpaAIServer/oais/backend/config/config.iniв новый.env - Изменить порт - временно установить порт 5433 для новой PostgreSQL, чтобы избежать конфликта
Распаковка архива с клиентскими файлами#
# Найдите и распакуйте архив (автоматически выбирается самая свежая версия)
tar -xvzf "$(ls client_files_*.tgz | sort -V | tail -n 1)"
💡 Что делает эта команда
ls client_files_*.tgz- находит все файлы архивовsort -V- сортирует версии естественно (1.0 < 1.1 < 1.10)tail -n 1- выбирает самый свежий файлtar -xvzf- распаковывает архив с выводом содержимого
Ожидаемый результат: Будет создана директория sh_scripts/ с исполняемыми скриптами и другие необходимые файлы.
Подготовка скриптов к выполнению#
# Перейдите в директорию со скриптами
cd sh_scripts/
# Сделайте все скрипты исполняемыми
chmod +x *.sh
# Вернитесь в корневую директорию проекта
cd ..
💡 Что делают эти команды
chmod +x *.sh- устанавливает права исполнения для всех shell-скриптов- Это необходимо для запуска скриптов в следующих этапах установки
Структура распакованного архива:#
После распаковки вы должны увидеть следующие файлы и директории:
sh_scripts/- директория с установочными скриптамиdownload_all_latest_docker_images.sh- скрипт для скачивания Docker-образовload_all_docker_images.sh- скрипт для загрузки образов в Dockerextract_models.sh- скрипт для распаковки моделей ИИextract_llama.sh- скрипт для распаковки LLM-моделей
docker-compose.yml- конфигурация Docker Compose для клиентской установки.env- файл с переменными окружения для настройки системы
Загрузка Docker-образов#
# Запустите скрипт загрузки Docker-образов
sudo ./sh_scripts/load_all_docker_images.sh
💡 Что делает скрипт
- Загружает все Docker-образы из скачанных .tar.gz файлов
- Импортирует образы в локальный Docker registry
- Проверяет успешность загрузки
Распаковка моделей ИИ#
# Запустите скрипт распаковки основных моделей
sudo ./sh_scripts/extract_models.sh
💡 Что делает скрипт
- Распаковывает модель Whisper для распознавания речи
- Распаковывает модель BGE Reranker для улучшения поиска
- Распаковывает модели для генерации эмбеддингов
- Создает необходимые директории
- Проверяет успешность распаковки
# Запустите скрипт распаковки LLM модели
sudo ./sh_scripts/extract_llama.sh
💡 Что делает скрипт
- Распаковывает модель Llama 3 для языкового моделирования
- Удаляет префикс
model-store/из путей файлов - Помещает файлы непосредственно в директорию моделей
- Проверяет содержимое после распаковки
Структура директорий после распаковки(примерная):#
./whisper/
└── models/
├── base.pt
└── ...
./bge_reranker/
└── models/
└── bge-reranker-large/
├── config.json
├── model.bin
└── ...
./embed-server/app/
└── model-store/
└── sentence-transformers/
└── paraphrase-multilingual-MiniLM-L12-v2/
├── config.json
├── pytorch_model.bin
└── ...
./llm-server/models/
├── meta-llama/
│ └── Meta-Llama-3-8B-Instruct/
│ ├── config.json
│ ├── model-00001-of-00004.safetensors
│ ├── model-00002-of-00004.safetensors
│ └── ...
└── tokenizer.json
Запуск новой версии PostgreSQL#
docker compose up -d
💡 Комментарии к запуску новой версии
docker compose up -d - запускает сервисы в фоне
-d- отсоединенный режим (работа в фоне)- Запускает все сервисы из docker-compose.yml
- Включает PostgreSQL 17 в контейнере aiserver-pg
Важно:
- Старая база данных должна продолжать работать
- Новая версия запускается на другом порту (5433)
- Процесс инициализации может занять несколько минут
Мониторинг запуска:
# Следить за логами инициализации
docker logs aiserver
# Проверить статус контейнеров
docker ps | grep aiserver
💡 Комментарии к мониторингу
docker logs aiserver - показывает логи контейнера
- Следит за процессом инициализации PostgreSQL
- Ищет сообщения об успешном запуске и применении миграций
- Прерывать можно Ctrl+C
docker ps | grep aiserver - проверяет статус
docker ps- показывает запущенные контейнерыgrep aiserver- фильтрует по имени- Должен показать контейнер aiserver-pg в состоянии Up
Остановка сервисов для переноса данных#
Остановить все сервисы кроме новой базы данных:
docker-compose stop aiserver aiserver-code_interpreter aiserver-llm-server aiserver-embed aiserver-whisper aiserver-bge_reranker
docker compose stop aiserver aiserver-code_interpreter aiserver-llm-server aiserver-embed aiserver-whisper aiserver-bge_reranker
💡 Комментарии к остановке сервисов
docker compose stop - останавливает указанные сервисы
- Выполняются обе версии синтаксиса для совместимости
- Останавливаются все сервисы Sherpa AIServer кроме базы данных
Останавливаемые сервисы:
aiserver- основной веб-серверaiserver-code_interpreter- интерпретатор кодаaiserver-llm-server- языковая модельaiserver-embed- сервис эмбеддинговaiserver-whisper- сервис распознавания речиaiserver-bge_reranker- сервис ранжирования
Результат: Только aiserver-pg (новая PostgreSQL) продолжает работать
Перенос данных между версиями#
Выполнить последовательность команд для переноса данных:
# 1. Создать дамп из старой базы
docker exec -t postgres pg_dump -U postgres -d postgres -Fc -f /tmp/postgres.dump && \
# 2. Скопировать дамп на хост
docker cp postgres:/tmp/postgres.dump ./postgres.dump && \
# 3. Удалить старую базу в новом контейнере
docker exec -it aiserver-pg psql -U postgres -d template1 -c "DROP DATABASE IF EXISTS postgres;" && \
# 4. Создать новую базу
docker exec -it aiserver-pg psql -U postgres -d template1 -c "CREATE DATABASE postgres;" && \
# 5. Создать необходимые расширения
docker exec -it aiserver-pg psql -U postgres -d postgres -c "CREATE EXTENSION IF NOT EXISTS embedding;" && \
docker exec -it aiserver-pg psql -U postgres -d postgres -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";" && \
# 6. Скопировать дамп в новый контейнер
docker cp ./postgres.dump aiserver-pg:/tmp/postgres.dump && \
# 7. Восстановить данные
docker exec -t aiserver-pg pg_restore -U postgres -d postgres /tmp/postgres.dump
💡 Комментарии к переносу между версиями PostgreSQL
Шаг 1: Создание дампа из старой базы
docker exec -t postgres- выполняет команду в контейнере postgres (версия 16)pg_dump -U postgres -d postgres -Fc- создает специальный формат дампа-Fc- сжатый специальный формат (лучше для больших БД)- Сохраняется в
/tmp/postgres.dumpвнутри контейнера
Шаг 2: Копирование дампа на хост
docker cp postgres:/tmp/postgres.dump ./postgres.dump- Переносит дамп из контейнера на локальный диск
- Необходим для передачи между контейнерами
Шаг 3: Удаление старой базы в новом контейнере
- Подключается к системной базе template1
- Удаляет существующую базу postgres (если есть)
Шаг 4: Создание новой базы
- Создает чистую базу данных postgres в контейнере aiserver-pg
Шаг 5: Создание расширений
embedding- расширение для векторных эмбеддинговuuid-ossp- генерация UUID (нужно для некоторых таблиц)
Шаг 6: Копирование дампа в новый контейнер
- Обратная операция копирования
- Помещает дамп в контейнер aiserver-pg
Шаг 7: Восстановление данных
pg_restore- восстанавливает из специального формата дампа-t- выделяет TTY для прогресса- Автоматически создает таблицы, индексы и данные
Валидация результатов миграции#
Проверка корректности переноса данных#
Базовые проверки:
# Подключиться к новой базе данных
docker exec -it aiserver-pg psql -U postgres -d postgres
# Проверить количество таблиц
\dt orchestrator.*
# Проверить количество записей в основных таблицах
SELECT schemaname, tablename, n_tup_ins AS rows
FROM pg_stat_user_tables
WHERE schemaname = 'orchestrator'
ORDER BY n_tup_ins DESC;
# Проверить наличие расширений
\dx
# Выйти из psql
\q
💡 Комментарии к базовым проверкам
docker exec -it aiserver-pg psql -U postgres -d postgres
- Подключается к PostgreSQL в интерактивном режиме
-it- интерактивный терминал-U postgres- пользователь postgres-d postgres- база данных postgres
\dt orchestrator.* - показывает все таблицы в схеме orchestrator
\dt- список таблицorchestrator.*- фильтр по схеме
SELECT ... FROM pg_stat_user_tables - статистика по таблицам
n_tup_ins- количество вставленных строк (примерное количество записей)- Сортировка по убыванию показывает самые большие таблицы
\dx - показывает установленные расширения
- Должны быть видны
embeddingиuuid-ossp
\q - выход из psql
Тестирование функциональности#
- Запустить основные сервисы Sherpa AI Server
- Выполнить тестовые запросы к API
- Проверить работу веб-интерфейса
- Выполнить базовые операции с данными
Диагностика и устранение проблем#
Распространенные ошибки и решения#
Если возникли ошибки миграции обратитесь за помощью в техподдержку, а пока вы можете вернутся в старую директорию /opt/SherpaAIServer и запустить на прошлых настройках Sherpa AI Server
"Heap exhausted" или нехватка памяти
Решение: Увеличить лимит памяти для pgloader
export SBCL_DYNAMIC_SPACE_SIZE=8192
Ошибка подключения к базе данных
Проверки:
- Проверить доступность портов: telnet host port
- Проверить корректность учетных данных
- Проверить сетевую доступность контейнеров
Нарушение целостности данных
Действия:
1. Проверить логи pgloader: cat migrate.log
2. Сравнить количество записей в исходной и целевой БД
3. Проверить наличие всех таблиц и индексов
Прерывание миграции
Действия:
- Не перезапускать миграцию
- Обратиться в техническую поддержку с логами
- Предоставить: migrate.log, конфигурацию .env, размер базы данных
💡 Комментарии к мониторингу миграции
tail -f migrate.log - следит за логами в реальном времени
-f- следить (обновляется при добавлении новых строк)- Показывает прогресс миграции pgloader
- Ищет ошибки или предупреждения
docker stats - мониторит использование ресурсов контейнерами
- Показывает CPU, память, сеть, диск для всех контейнеров
- Полезно для отслеживания нагрузки на систему
- Прерывать Ctrl+C
watch -n 30 - повторяет команду каждые 30 секунд
- Подсчитывает общее количество записей во всех таблицах orchestrator
watch- утилита для периодического выполнения команд-n 30- интервал 30 секунд
Использование: Держать эти команды в отдельных терминалах во время миграции
Завершение миграции#
После успешного выполнения всех шагов:
- Запустить все сервисы Sherpa AI Server
- Выполнить финальное тестирование системы
- Удалить временные файлы и старые контейнеры (при необходимости)
Рекомендация: Сохраните логи миграции и конфигурационные файлы для будущих ссылок.