Files
basango/projects/backend/bin/migration.sh
T
2025-10-18 22:47:49 +02:00

115 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONSOLE_BIN="$PROJECT_ROOT/bin/console"
APPLY_MIGRATIONS=0
PGLOADER_EXTRA_ARGS=()
SOURCE_DSN=""
TARGET_DSN=""
usage() {
cat <<USAGE
Usage: $(basename "$0") [options] <mariadb_dsn> <postgres_dsn>
Environment variables:
SOURCE_DATABASE_URL MariaDB connection string (fallback for <mariadb_dsn>)
TARGET_DATABASE_URL PostgreSQL connection string (fallback for <postgres_dsn>)
Options:
--apply-migrations Run Doctrine migrations after data transfer (uses local PHP runtime)
--pgloader-arg ARG Append a raw argument when calling pgloader (can be provided multiple times)
-h, --help Show this help message
Examples:
SOURCE_DATABASE_URL="mysql://user:pass@host/db" \\
TARGET_DATABASE_URL="postgresql://user:pass@host/db" \\
$(basename "$0") --apply-migrations
$(basename "$0") --pgloader-arg "--with no schema" \\
mysql://root:root@127.0.0.1:3306/app \\
postgresql://app:secret@127.0.0.1:5432/app
USAGE
}
log() {
printf '[migration] %s\n' "$*"
}
while [[ $# -gt 0 ]]; do
case "$1" in
--apply-migrations)
APPLY_MIGRATIONS=1
;;
--pgloader-arg)
shift
if [[ $# -eq 0 ]]; then
echo "--pgloader-arg requires a value" >&2
exit 1
fi
PGLOADER_EXTRA_ARGS+=("$1")
;;
-h|--help)
usage
exit 0
;;
--)
shift
break
;;
*)
if [[ -z "$SOURCE_DSN" ]]; then
SOURCE_DSN="$1"
elif [[ -z "$TARGET_DSN" ]]; then
TARGET_DSN="$1"
else
PGLOADER_EXTRA_ARGS+=("$1")
fi
;;
esac
shift
done
if [[ -z "$SOURCE_DSN" ]]; then
SOURCE_DSN="${SOURCE_DATABASE_URL:-}"
fi
if [[ -z "$TARGET_DSN" ]]; then
TARGET_DSN="${TARGET_DATABASE_URL:-}"
fi
if [[ -z "$SOURCE_DSN" || -z "$TARGET_DSN" ]]; then
echo "Source and target DSNs are required (pass as arguments or set SOURCE_DATABASE_URL/TARGET_DATABASE_URL)." >&2
usage >&2
exit 1
fi
if ! command -v pgloader >/dev/null 2>&1; then
echo "pgloader is required but not available on PATH. Install it (https://pgloader.readthedocs.io) and retry." >&2
exit 1
fi
log "Starting data copy"
log " source : $SOURCE_DSN"
log " target : $TARGET_DSN"
pgloader "${PGLOADER_EXTRA_ARGS[@]}" "$SOURCE_DSN" "$TARGET_DSN"
log "Data copy finished"
if [[ $APPLY_MIGRATIONS -eq 1 ]]; then
if ! command -v php >/dev/null 2>&1; then
echo "PHP CLI is required to run Doctrine migrations." >&2
exit 1
fi
if [[ ! -x "$CONSOLE_BIN" ]]; then
echo "Symfony console not found at $CONSOLE_BIN" >&2
exit 1
fi
log "Running Doctrine migrations"
(cd "$PROJECT_ROOT" && php "$CONSOLE_BIN" doctrine:migrations:migrate --no-interaction)
fi
log "Migration helper completed"