Миграция MariaDB на orchestrator-db:v5.9.2+ контейнер#
⚠️ Важно: Для перехода на
orchestrator-db:v5.9.1+ безопаснее использовать миграцию через логический dump и новый volume. Это исключает риск повреждения старого каталога данных и позволяет откатиться без потери информации.
1. Что важно знать заранее#
В образах Sherpa Orchestrator на Chainguard для MariaDB используется:
- только
MYSQL_ROOT_PASSWORDдля инициализации; - существующий mount
./backend/config/my.cnf:/etc/mysql/conf.d/my.cnf.
Старые параметры MYSQL_ALLOW_EMPTY_PASSWORD, MYSQL_USER, MYSQL_PASSWORD для встроенного контейнера больше использовать не нужно.
2. Проверить текущую конфигурацию#
cd /opt/SherpaOrchestrator
grep -E "^(DB_ENGINE|MYSQL_HOST|MYSQL_PORT|MYSQL_USER|MYSQL_PASSWORD|MYSQL_DB)=" .env
Для встроенной MariaDB должны быть корректны как минимум:
DB_ENGINE=mysqlMYSQL_HOST=orchestrator-dbMYSQL_DB=orchestrator
Проверьте текущий контейнер и volume:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep orchestrator-db
docker volume ls | grep orchestrator-mysql-data
3. Перевести приложение в режим обслуживания#
Остановите сервисы приложения, чтобы во время dump не было новых записей:
docker compose stop orchestrator orchestrator-nginx orchestrator-websocket orchestrator-vnc-proxy orchestrator-autopilot
Убедитесь, что контейнер orchestrator-db остался работать:
docker ps --format "table {{.Names}}\t{{.Status}}" | grep orchestrator-db
4. Сделать логический backup MariaDB#
Создайте каталог:
sudo mkdir -p ./backups/mariadb
sudo chown -R "$USER:$USER" ./backups
export DB_MIGRATION_TS="$(date +%Y%m%d_%H%M%S)"
export DB_BACKUP_FILE="./backups/mariadb/orchestrator_${DB_MIGRATION_TS}.sql"
Сделайте dump рабочих БД:
docker exec orchestrator-db sh -lc 'mariadb-dump \
-uroot \
-p"$MYSQL_ROOT_PASSWORD" \
--databases orchestrator orchestrator_archive \
--single-transaction \
--routines \
--events \
--triggers' > "$DB_BACKUP_FILE"
Проверьте результат:
ls -lh "${DB_BACKUP_FILE}"
tail -n 20 "${DB_BACKUP_FILE}"
💡 Почему именно mariadb-dump
Логический dump переносит данные на уровне SQL и не привязывает вас к внутреннему формату datadir. Старый volume остается нетронутым, а новый контейнер поднимается на чистом каталоге.
5. Остановить старый MariaDB контейнер#
docker compose stop orchestrator-db
docker ps -a --format "table {{.Names}}\t{{.Status}}" | grep orchestrator-db
Старый volume пока не удаляйте.
6. Создать новый volume для Chainguard MariaDB#
Проверьте старый volume:
docker volume ls | grep orchestrator-mysql-data
Создайте новый:
docker volume create orchestrator-mysql-data-chainguard
Проверьте его:
docker volume inspect orchestrator-mysql-data-chainguard
7. Переключить client compose на новый volume#
Откройте docker-compose.client.yml и в сервисе orchestrator-db оставьте старый volume закомментированным, а новый включенным:
volumes:
# Старый volume оставлен как ориентир на период миграции:
# - orchestrator-mysql-data:/var/lib/mysql
- orchestrator-mysql-data-chainguard:/var/lib/mysql
В секции volumes: внизу файла тоже должен быть активен новый volume, а старый оставлен закомментированным:
volumes:
# orchestrator-mysql-data:
# driver: local
orchestrator-mysql-data-chainguard:
driver: local
Проверьте, что в environment осталось только:
environment:
MYSQL_ROOT_PASSWORD: '${MYSQL_PASSWORD}'
💡 Почему это важно
Для нового контейнера MariaDB на Chainguard безопаснее использовать один root password без legacy-комбинации MYSQL_ALLOW_EMPTY_PASSWORD и дополнительных bootstrap-пользователей. Это убирает лишние точки отказа на пустом volume.
8. Поднять новый контейнер MariaDB#
docker compose --profile mariadb up -d orchestrator-db
Проверьте логи:
docker logs -f --tail=100 orchestrator-db
Проверьте готовность к запросам:
docker exec orchestrator-db sh -lc 'mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" -Nse "SELECT 1;"'
Ожидаемый результат:
1
9. Восстановить backup в новый контейнер#
docker exec -i orchestrator-db sh -lc 'mariadb \
-uroot \
-p"$MYSQL_ROOT_PASSWORD"' < "$DB_BACKUP_FILE"
10. Проверить базы и конфигурацию#
Проверьте, что обе БД на месте:
docker exec orchestrator-db sh -lc 'mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" -Nse "SHOW DATABASES LIKE '\''orchestrator'\'';"'
docker exec orchestrator-db sh -lc 'mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" -Nse "SHOW DATABASES LIKE '\''orchestrator_archive'\'';"'
Проверьте тестовые выборки:
docker exec orchestrator-db sh -lc 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mariadb \
-uroot \
orchestrator \
-Nse "SELECT COUNT(*) FROM accounts;"'
docker exec orchestrator-db sh -lc 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mariadb \
-uroot \
orchestrator \
-Nse "SELECT COUNT(*) FROM processes;"'
Проверьте, что кастомный my.cnf применился:
docker exec orchestrator-db sh -lc 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mariadb \
-uroot \
-Nse "SHOW VARIABLES LIKE '\''max_allowed_packet'\'';"'
Если mount конфигурации подключен правильно, вы увидите актуальное значение из backend/config/my.cnf.
11. Поднять приложение обратно#
docker compose up -d orchestrator orchestrator-websocket orchestrator-nginx
При необходимости запустите дополнительные сервисы:
docker compose up -d orchestrator-vnc-proxy
docker compose up -d orchestrator-autopilot
docker compose up -d orchestrator-vault
Проверьте backend-логи:
docker logs --tail=100 orchestrator
Проверьте вход в UI и несколько рабочих экранов.
12. Rollback при проблеме#
Если новая MariaDB работает некорректно:
- Остановите сервисы:
docker compose stop orchestrator orchestrator-nginx orchestrator-websocket orchestrator-db
- Верните старый volume в
docker-compose.yml:
volumes:
- orchestrator-mysql-data:/var/lib/mysql
- Поднимите старый проверенный образ MariaDB, на котором изначально работал volume.
- Запустите контейнеры обратно:
docker compose --profile mariadb up -d orchestrator-db
docker compose up -d orchestrator orchestrator-websocket orchestrator-nginx
13. Что удалить после успешной миграции#
Сразу после перехода не удаляйте:
- SQL backup;
- старый volume;
- старые архивы образов.
После периода наблюдения можно удалить старый volume:
docker volume rm orchestrator-mysql-data
Делайте это только после полной проверки.