#!/bin/bash set -e SERVICE=$1 BACKUP_DIR="${2:-./backups}" if [ -z "$SERVICE" ]; then echo "Usage: $0 [backup-dir]" echo "Example: $0 auth-service" exit 1 fi mkdir -p "$BACKUP_DIR" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/${SERVICE}_${TIMESTAMP}.sql" echo "💾 Backing up database for $SERVICE..." # Extract database URL from .env or environment cd "services/$SERVICE" if [ -z "$DATABASE_URL" ]; then if [ -f ".env" ]; then DATABASE_URL=$(grep DATABASE_URL .env | cut -d '=' -f2- | tr -d '"' | tr -d "'") elif [ -f "../../deployments/local/.env.local" ]; then DATABASE_URL=$(grep DATABASE_URL ../../deployments/local/.env.local | cut -d '=' -f2- | tr -d '"' | tr -d "'") fi fi if [ -z "$DATABASE_URL" ]; then echo "❌ DATABASE_URL not found. Please set it in:" echo " - services/$SERVICE/.env" echo " - deployments/local/.env.local" echo " - Or as environment variable" exit 1 fi # Use pg_dump directly with DATABASE_URL (works with Neon and standard PostgreSQL) # Neon URLs format: postgresql://user:pass@ep-xxx.region.neon.tech/dbname?sslmode=require # Standard format: postgresql://user:pass@host:port/dbname # Check if pg_dump supports connection string (PostgreSQL 11+) if pg_dump --version | grep -qE "1[1-9]|2[0-9]"; then # Use connection string directly (supports Neon) pg_dump "$DATABASE_URL" > "../$BACKUP_FILE" else # Fallback: Parse connection string for older pg_dump # Remove query parameters for parsing CLEAN_URL=$(echo $DATABASE_URL | sed 's/?.*//') DB_USER=$(echo $CLEAN_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p') DB_PASS=$(echo $CLEAN_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p') DB_HOST=$(echo $CLEAN_URL | sed -n 's/.*@\([^:]*\):.*/\1/p') DB_PORT=$(echo $CLEAN_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p') DB_NAME=$(echo $CLEAN_URL | sed -n 's/.*\/\([^?]*\).*/\1/p') PGPASSWORD=$DB_PASS pg_dump -h $DB_HOST -p ${DB_PORT:-5432} -U $DB_USER -d $DB_NAME > "../$BACKUP_FILE" fi echo "✅ Backup created: $BACKUP_FILE"