119 lines
4.7 KiB
Bash
119 lines
4.7 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
# Script to diagnose and fix Blockscout database connection issue
|
||
|
|
# Blockscout can't see tables even though they exist
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
VMID=5000
|
||
|
|
|
||
|
|
echo "=========================================="
|
||
|
|
echo "Blockscout Database Connection Fix"
|
||
|
|
echo "=========================================="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if running from Proxmox host or inside container
|
||
|
|
if [ -f "/proc/1/cgroup" ] && grep -q "lxc" /proc/1/cgroup 2>/dev/null; then
|
||
|
|
EXEC_PREFIX=""
|
||
|
|
echo "Running inside VMID 5000"
|
||
|
|
else
|
||
|
|
EXEC_PREFIX="pct exec $VMID --"
|
||
|
|
echo "Running from Proxmox host, executing in VMID 5000"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Step 1: Check what database Blockscout is connecting to
|
||
|
|
echo "=== Step 1: Checking Blockscout DATABASE_URL ==="
|
||
|
|
BLOCKSCOUT_CONTAINER=$($EXEC_PREFIX docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
|
||
|
|
if [ -n "$BLOCKSCOUT_CONTAINER" ]; then
|
||
|
|
DATABASE_URL=$($EXEC_PREFIX docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' $BLOCKSCOUT_CONTAINER | grep "^DATABASE_URL=" | cut -d= -f2-)
|
||
|
|
echo "Blockscout DATABASE_URL: $DATABASE_URL"
|
||
|
|
|
||
|
|
# Extract components
|
||
|
|
DB_USER=$(echo "$DATABASE_URL" | sed -n 's|.*://\([^:]*\):.*|\1|p')
|
||
|
|
DB_PASS=$(echo "$DATABASE_URL" | sed -n 's|.*://[^:]*:\([^@]*\)@.*|\1|p')
|
||
|
|
DB_HOST=$(echo "$DATABASE_URL" | sed -n 's|.*@\([^:]*\):.*|\1|p')
|
||
|
|
DB_PORT=$(echo "$DATABASE_URL" | sed -n 's|.*@[^:]*:\([^/]*\)/.*|\1|p')
|
||
|
|
DB_NAME=$(echo "$DATABASE_URL" | sed -n 's|.*/\([^?]*\).*|\1|p')
|
||
|
|
|
||
|
|
echo " User: $DB_USER"
|
||
|
|
echo " Host: $DB_HOST"
|
||
|
|
echo " Port: $DB_PORT"
|
||
|
|
echo " Database: $DB_NAME"
|
||
|
|
else
|
||
|
|
echo "❌ Blockscout container not found"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 2: Verify tables exist in that specific database
|
||
|
|
echo "=== Step 2: Verifying tables in database '$DB_NAME' ==="
|
||
|
|
$EXEC_PREFIX docker exec blockscout-postgres psql -U "$DB_USER" -d "$DB_NAME" -c "
|
||
|
|
SELECT
|
||
|
|
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'migrations_status')
|
||
|
|
THEN '✅ migrations_status' ELSE '❌ migrations_status MISSING' END,
|
||
|
|
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'blocks')
|
||
|
|
THEN '✅ blocks' ELSE '❌ blocks MISSING' END,
|
||
|
|
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'transactions')
|
||
|
|
THEN '✅ transactions' ELSE '❌ transactions MISSING' END;
|
||
|
|
" 2>&1
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 3: Check current search_path for that database
|
||
|
|
echo "=== Step 3: Checking search_path ==="
|
||
|
|
$EXEC_PREFIX docker exec blockscout-postgres psql -U "$DB_USER" -d "$DB_NAME" -c "SHOW search_path;" 2>&1
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 4: Test query from Blockscout's perspective
|
||
|
|
echo "=== Step 4: Testing query from Blockscout container ==="
|
||
|
|
if $EXEC_PREFIX docker start $BLOCKSCOUT_CONTAINER 2>/dev/null; then
|
||
|
|
sleep 5
|
||
|
|
echo "Attempting to query from Blockscout..."
|
||
|
|
$EXEC_PREFIX docker exec -it $BLOCKSCOUT_CONTAINER bin/blockscout eval "
|
||
|
|
IO.puts(\"Testing database connection...\")
|
||
|
|
case Explorer.Repo.query(\"SELECT current_database(), current_schema()\") do
|
||
|
|
{:ok, %{rows: [[db, schema]]}} ->
|
||
|
|
IO.puts(\"✅ Connected to database: #{db}, schema: #{schema}\")
|
||
|
|
error ->
|
||
|
|
IO.puts(\"❌ Connection error: #{inspect(error)}\")
|
||
|
|
end
|
||
|
|
|
||
|
|
IO.puts(\"\\nTesting migrations_status table...\")
|
||
|
|
case Explorer.Repo.query(\"SELECT COUNT(*) FROM migrations_status\") do
|
||
|
|
{:ok, %{rows: [[count]]}} ->
|
||
|
|
IO.puts(\"✅ migrations_status accessible, count: #{count}\")
|
||
|
|
{:error, error} ->
|
||
|
|
IO.puts(\"❌ Cannot access migrations_status: #{inspect(error)}\")
|
||
|
|
end
|
||
|
|
" 2>&1 | head -20 || echo "⚠️ Cannot query from container"
|
||
|
|
else
|
||
|
|
echo "⚠️ Cannot start container for testing"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 5: Check if there are multiple databases
|
||
|
|
echo "=== Step 5: Checking for multiple databases ==="
|
||
|
|
$EXEC_PREFIX docker exec blockscout-postgres psql -U blockscout -d postgres -c "\l" 2>&1 | grep -E "Name|blockscout" | head -5
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 6: Verify connection string format
|
||
|
|
echo "=== Step 6: Recommended Fix ==="
|
||
|
|
echo "If Blockscout can't see tables, try:"
|
||
|
|
echo ""
|
||
|
|
echo "1. Ensure DATABASE_URL is correct in docker-compose.yml:"
|
||
|
|
echo " DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout"
|
||
|
|
echo ""
|
||
|
|
echo "2. Run migrations in a one-off container:"
|
||
|
|
echo " docker run --rm --network container:$BLOCKSCOUT_CONTAINER \\"
|
||
|
|
echo " -e DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout \\"
|
||
|
|
echo " blockscout/blockscout:latest \\"
|
||
|
|
echo " bin/blockscout eval 'Explorer.Release.migrate()'"
|
||
|
|
echo ""
|
||
|
|
echo "3. Update docker-compose.yml to run migrations before start:"
|
||
|
|
echo " command: sh -c \"bin/blockscout eval 'Explorer.Release.migrate()' && bin/blockscout start\""
|
||
|
|
|
||
|
|
|