Files
proxui/scripts/migrate.sh
T
2026-06-10 15:04:52 +02:00

94 lines
1.9 KiB
Bash
Executable File

#!/bin/sh
set -eu
usage() {
echo "Usage: $0 up|down|force|version [argument]" >&2
exit 2
}
if [ "$#" -lt 1 ]; then
usage
fi
command="$1"
shift
case "$command" in
up|down|force|version) ;;
*) usage ;;
esac
repo_root="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
migrations_dir="$repo_root/migrations"
env_file_value() {
file="$1"
key="$2"
if [ ! -f "$file" ]; then
return 0
fi
awk -F= -v key="$key" '
$1 == key {
sub(/^[^=]*=/, "")
gsub(/^[ \t047"]+|[ \t047"]+$/, "")
print
exit
}
' "$file"
}
root_env="$repo_root/.env"
supabase_env="$repo_root/deploy/supabase/.env"
env_value() {
key="$1"
eval "current=\${$key:-}"
if [ -n "$current" ]; then
printf '%s' "$current"
return 0
fi
value="$(env_file_value "$root_env" "$key")"
if [ -n "$value" ]; then
printf '%s' "$value"
return 0
fi
env_file_value "$supabase_env" "$key"
}
pooler_tenant_id="$(env_value POOLER_TENANT_ID)"
if [ -z "$pooler_tenant_id" ]; then
pooler_tenant_id="proxui"
fi
database_url="$(env_value MIGRATE_DATABASE_URL)"
if [ -z "$database_url" ]; then
database_url="$(env_value DATABASE_DIRECT_URL)"
if [ -z "$database_url" ]; then
postgres_password="$(env_value POSTGRES_PASSWORD)"
fi
if [ -n "${postgres_password:-}" ]; then
MIGRATE_DATABASE_URL="postgres://postgres.${pooler_tenant_id}:${postgres_password}@localhost:6543/postgres?sslmode=disable"
else
echo "MIGRATE_DATABASE_URL, DATABASE_DIRECT_URL or POSTGRES_PASSWORD must be set." >&2
exit 1
fi
database_url="$MIGRATE_DATABASE_URL"
fi
if command -v migrate >/dev/null 2>&1; then
exec migrate -path "$migrations_dir" -database "$database_url" "$command" "$@"
fi
docker_database_url="$(printf '%s' "$database_url" | sed 's/@localhost:/@host.docker.internal:/')"
exec docker run --rm \
-v "$migrations_dir:/migrations:ro" \
migrate/migrate:v4.18.3 \
-path=/migrations \
-database "$docker_database_url" \
"$command" "$@"