125 lines
4.8 KiB
Bash
Executable File
125 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# scripts/copy-database-for-task.sh
|
|
# Copies database from main repo to task-specific PostgreSQL instance
|
|
|
|
TASK_ID=$1
|
|
SOURCE_HOST=${2:-"localhost"}
|
|
SOURCE_PORT=${3:-"5432"}
|
|
TARGET_HOST=${4:-"localhost"}
|
|
TARGET_PORT=${5:-"5433"}
|
|
|
|
SOURCE_DB="managing"
|
|
# Convert to lowercase (compatible with bash 3.2+)
|
|
TARGET_DB="managing_$(echo "$TASK_ID" | tr '[:upper:]' '[:lower:]')"
|
|
ORLEANS_SOURCE_DB="orleans"
|
|
ORLEANS_TARGET_DB="orleans_$(echo "$TASK_ID" | tr '[:upper:]' '[:lower:]')"
|
|
|
|
DB_USER="postgres"
|
|
DB_PASSWORD="postgres"
|
|
|
|
set -e # Exit on error
|
|
|
|
echo "📦 Copying database for task: $TASK_ID"
|
|
echo " Source: $SOURCE_HOST:$SOURCE_PORT"
|
|
echo " Target: $TARGET_HOST:$TARGET_PORT"
|
|
|
|
# Wait for target PostgreSQL to be ready
|
|
echo "⏳ Waiting for target PostgreSQL..."
|
|
for i in {1..60}; do
|
|
if PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c '\q' 2>/dev/null; then
|
|
echo "✅ Target PostgreSQL is ready"
|
|
break
|
|
fi
|
|
if [ $i -eq 60 ]; then
|
|
echo "❌ Target PostgreSQL not ready after 60 attempts"
|
|
exit 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
# Verify source database is accessible
|
|
echo "🔍 Verifying source database..."
|
|
if ! PGPASSWORD=$DB_PASSWORD psql -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -d postgres -c '\q' 2>/dev/null; then
|
|
echo "❌ Cannot connect to source database at $SOURCE_HOST:$SOURCE_PORT"
|
|
exit 1
|
|
fi
|
|
|
|
# Create target databases (drop if exists for fresh copy)
|
|
echo "🗑️ Dropping existing target databases if they exist..."
|
|
PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "DROP DATABASE IF EXISTS \"$TARGET_DB\";" 2>/dev/null || true
|
|
PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "DROP DATABASE IF EXISTS \"$ORLEANS_TARGET_DB\";" 2>/dev/null || true
|
|
|
|
echo "📝 Creating target databases..."
|
|
PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "CREATE DATABASE \"$TARGET_DB\";"
|
|
PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "CREATE DATABASE \"$ORLEANS_TARGET_DB\";"
|
|
|
|
# Create temporary dump files
|
|
TEMP_DIR=$(mktemp -d)
|
|
MANAGING_DUMP="$TEMP_DIR/managing_${TASK_ID}.dump"
|
|
ORLEANS_DUMP="$TEMP_DIR/orleans_${TASK_ID}.dump"
|
|
|
|
# Dump source databases
|
|
echo "📤 Dumping source database: $SOURCE_DB..."
|
|
PGPASSWORD=$DB_PASSWORD pg_dump -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -Fc "$SOURCE_DB" > "$MANAGING_DUMP"
|
|
|
|
if [ ! -s "$MANAGING_DUMP" ]; then
|
|
echo "❌ Failed to dump source database $SOURCE_DB"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
echo "📤 Dumping Orleans database: $ORLEANS_SOURCE_DB..."
|
|
PGPASSWORD=$DB_PASSWORD pg_dump -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -Fc "$ORLEANS_SOURCE_DB" > "$ORLEANS_DUMP" 2>/dev/null || {
|
|
echo "⚠️ Orleans database not found, skipping..."
|
|
ORLEANS_DUMP=""
|
|
}
|
|
|
|
# Restore to target databases
|
|
echo "📥 Restoring to target database: $TARGET_DB..."
|
|
PGPASSWORD=$DB_PASSWORD pg_restore -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$TARGET_DB" --no-owner --no-acl --clean --if-exists "$MANAGING_DUMP"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Successfully restored $TARGET_DB"
|
|
else
|
|
echo "❌ Failed to restore $TARGET_DB"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$ORLEANS_DUMP" ] && [ -s "$ORLEANS_DUMP" ]; then
|
|
echo "📥 Restoring Orleans database: $ORLEANS_TARGET_DB..."
|
|
PGPASSWORD=$DB_PASSWORD pg_restore -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$ORLEANS_TARGET_DB" --no-owner --no-acl --clean --if-exists "$ORLEANS_DUMP"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Successfully restored $ORLEANS_TARGET_DB"
|
|
|
|
# Clean Orleans membership tables to avoid conflicts with old silos
|
|
echo "🧹 Cleaning Orleans membership tables (removing old silo entries)..."
|
|
PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$ORLEANS_TARGET_DB" <<EOF
|
|
-- Clear membership tables to start fresh (Orleans uses lowercase table names)
|
|
TRUNCATE TABLE IF EXISTS orleansmembershiptable CASCADE;
|
|
TRUNCATE TABLE IF EXISTS orleansmembershipversiontable CASCADE;
|
|
-- Note: We keep reminder and storage tables as they may contain application data
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Orleans membership tables cleaned"
|
|
else
|
|
echo "⚠️ Failed to clean Orleans membership tables (tables may not exist yet, which is OK)"
|
|
fi
|
|
else
|
|
echo "⚠️ Failed to restore Orleans database (non-critical)"
|
|
fi
|
|
else
|
|
# Even if no Orleans dump, create empty database for fresh start
|
|
echo "📝 Orleans database will be created fresh by Orleans framework"
|
|
fi
|
|
|
|
# Cleanup
|
|
rm -rf "$TEMP_DIR"
|
|
|
|
echo "✅ Database copy completed successfully"
|
|
echo " Managing DB: $TARGET_DB on port $TARGET_PORT"
|
|
echo " Orleans DB: $ORLEANS_TARGET_DB on port $TARGET_PORT"
|
|
|