Files

53 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
PG_APP="blade-and-brawn-db"
API_APP="blade-and-brawn-api"
LOCAL_PORT=5433
proxy_pid=""
cleanup() {
if [[ -n "$proxy_pid" ]]; then
kill "$proxy_pid" 2>/dev/null || true
fi
}
trap cleanup EXIT
echo "Fetching production DATABASE_URL from $API_APP..." >&2
prod_url=$(fly ssh console -a "$API_APP" -C "printenv DATABASE_URL" 2>/dev/null | grep -m1 '^postgres')
if [[ -z "$prod_url" ]]; then
echo "Failed to fetch DATABASE_URL from $API_APP" >&2
exit 1
fi
tunneled_url=$(echo "$prod_url" | sed -E "s#@[^/]+/#@localhost:${LOCAL_PORT}/#")
echo "Starting tunnel to $PG_APP on localhost:${LOCAL_PORT}..." >&2
fly proxy "${LOCAL_PORT}:5432" -a "$PG_APP" &
proxy_pid=$!
echo "Waiting for tunnel..." >&2
for _ in $(seq 1 30); do
nc -z localhost "$LOCAL_PORT" 2>/dev/null && break
sleep 0.5
done
target="${1:-migrate}"
case "$target" in
migrate)
DATABASE_URL="$tunneled_url" bun run --filter @blade-and-brawn/api db:migrate:latest
;;
seed)
DATABASE_URL="$tunneled_url" bun run --filter @blade-and-brawn/api db:seed
;;
both)
DATABASE_URL="$tunneled_url" bun run --filter @blade-and-brawn/api db:migrate:latest
DATABASE_URL="$tunneled_url" bun run --filter @blade-and-brawn/api db:seed
;;
*)
echo "Usage: $0 [migrate|seed|both]" >&2
exit 1
;;
esac