166 lines
5.1 KiB
Bash
166 lines
5.1 KiB
Bash
|
|
#!/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 "=========================================="
|
||
|
|
|