Files
explorer-monorepo/scripts/fix-db-vmid5000.sh

166 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# Script to fix database password from VMID 5000 (Blockscout)
# This script provides commands to run as root in VMID 5000
set -euo pipefail
VMID=5000
echo "=========================================="
echo "Database Password Fix for VMID 5000"
echo "=========================================="
echo ""
echo "This script provides commands to fix the database password"
echo "for the explorer backend from within VMID 5000 (Blockscout)."
echo ""
echo "Choose one of the following options:"
echo ""
# Option 1: Direct commands
echo "=== OPTION 1: Run Commands Directly in VMID 5000 ==="
echo ""
echo "Execute these commands from the Proxmox host:"
echo ""
echo "# Step 1: Check if PostgreSQL is accessible"
echo "pct exec $VMID -- pg_isready -h localhost -p 5432 -U explorer || echo 'PostgreSQL not accessible'"
echo ""
echo "# Step 2: Reset password (if postgres user is accessible)"
echo "pct exec $VMID -- psql -h localhost -p 5432 -U postgres << 'SQL_EOF'"
echo "DO \\\$\\\$"
echo "BEGIN"
echo " IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'explorer') THEN"
echo " CREATE USER explorer WITH PASSWORD 'changeme';"
echo " ELSE"
echo " ALTER USER explorer WITH PASSWORD 'changeme';"
echo " END IF;"
echo "END"
echo "\\\$\\\$;"
echo "SELECT 'CREATE DATABASE explorer OWNER explorer'"
echo "WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'explorer')\\gexec"
echo "GRANT ALL PRIVILEGES ON DATABASE explorer TO explorer;"
echo "SQL_EOF"
echo ""
echo "# Step 3: Verify connection"
echo "pct exec $VMID -- bash -c \"PGPASSWORD=changeme psql -h localhost -p 5432 -U explorer -d explorer -c 'SELECT 1;'\""
echo ""
# Option 2: Interactive script
echo "=== OPTION 2: Interactive Fix Script ==="
echo ""
echo "Copy and paste this into VMID 5000 (pct enter $VMID or pct exec $VMID -- bash):"
echo ""
cat << 'INLINE_SCRIPT'
#!/bin/bash
# Run this script inside VMID 5000 as root
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_USER="explorer"
DB_PASSWORD="changeme"
DB_NAME="explorer"
echo "Fixing database password for explorer backend..."
echo "Database Host: $DB_HOST"
echo "Database Port: $DB_PORT"
echo ""
# Check if psql is available
if ! command -v psql &> /dev/null; then
echo "Installing PostgreSQL client..."
apt-get update -qq
apt-get install -y postgresql-client
fi
# Check connectivity
echo "Checking database connectivity..."
if ! pg_isready -h "$DB_HOST" -p "$DB_PORT" >/dev/null 2>&1; then
echo "ERROR: Cannot connect to PostgreSQL at $DB_HOST:$DB_PORT"
echo "Please check:"
echo " 1. PostgreSQL is running"
echo " 2. Database host is correct"
echo " 3. Network connectivity"
exit 1
fi
echo "PostgreSQL is accessible"
# Try to connect as postgres user
echo "Attempting to reset password..."
if psql -h "$DB_HOST" -p "$DB_PORT" -U postgres -c "SELECT 1;" >/dev/null 2>&1; then
# Reset password
psql -h "$DB_HOST" -p "$DB_PORT" -U postgres << SQL_EOF
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = '$DB_USER') THEN
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
RAISE NOTICE 'User $DB_USER created';
ELSE
ALTER USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
RAISE NOTICE 'User $DB_USER password updated';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE $DB_NAME OWNER $DB_USER'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DB_NAME')\gexec
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
SQL_EOF
# Verify
echo ""
echo "Verifying connection..."
if PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" >/dev/null 2>&1; then
echo "✅ SUCCESS: Database password fixed and connection verified!"
else
echo "❌ ERROR: Connection verification failed"
exit 1
fi
else
echo "ERROR: Cannot connect as postgres user"
echo "You may need to:"
echo " 1. Use a different database host"
echo " 2. Provide postgres password"
echo " 3. Check PostgreSQL authentication settings"
exit 1
fi
INLINE_SCRIPT
echo ""
echo "=== OPTION 3: If Database is in Docker Container ==="
echo ""
echo "If Blockscout uses Docker Compose, run these commands in VMID 5000:"
echo ""
cat << 'DOCKER_SCRIPT'
# Find postgres container
POSTGRES_CONTAINER=$(docker ps | grep postgres | awk '{print $1}')
# Reset password
docker exec -it $POSTGRES_CONTAINER psql -U postgres << SQL_EOF
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'explorer') THEN
CREATE USER explorer WITH PASSWORD 'changeme';
ELSE
ALTER USER explorer WITH PASSWORD 'changeme';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE explorer OWNER explorer'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'explorer')\gexec
GRANT ALL PRIVILEGES ON DATABASE explorer TO explorer;
SQL_EOF
DOCKER_SCRIPT
echo ""
echo "=========================================="
echo "After fixing the password, restart the backend:"
echo " (from the host running the backend API)"
echo " kill \$(cat /tmp/explorer_backend.pid) 2>/dev/null"
echo " ./scripts/start-backend-service.sh"
echo "=========================================="