Миграция 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=mysql
  • MYSQL_HOST=orchestrator-db
  • MYSQL_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 работает некорректно:

  1. Остановите сервисы:
docker compose stop orchestrator orchestrator-nginx orchestrator-websocket orchestrator-db
  1. Верните старый volume в docker-compose.yml:
volumes:
  - orchestrator-mysql-data:/var/lib/mysql
  1. Поднимите старый проверенный образ MariaDB, на котором изначально работал volume.
  2. Запустите контейнеры обратно:
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

Делайте это только после полной проверки.