Files
explorer-monorepo/scripts/fix-blockscout-migrations-complete.sh

137 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# Complete fix for Blockscout migrations issue
# Runs migrations in one-off container and updates docker-compose.yml
set -euo pipefail
VMID=5000
echo "=========================================="
echo "Complete Blockscout Migrations 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: Get Blockscout container
echo "Step 1: Finding Blockscout container..."
BLOCKSCOUT_CONTAINER=$($EXEC_PREFIX docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
if [ -z "$BLOCKSCOUT_CONTAINER" ]; then
echo "❌ Blockscout container not found"
exit 1
fi
echo "✅ Found container: $BLOCKSCOUT_CONTAINER"
echo ""
# Step 2: Run migrations in one-off container
echo "Step 2: Running migrations in one-off container..."
echo "This may take a few minutes..."
$EXEC_PREFIX docker run --rm \
--network container:$BLOCKSCOUT_CONTAINER \
-e DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout \
blockscout/blockscout:latest \
bin/blockscout eval "Explorer.Release.migrate()"
if [ $? -eq 0 ]; then
echo "✅ Migrations completed successfully"
else
echo "❌ Migrations failed"
exit 1
fi
echo ""
# Step 3: Verify tables were created
echo "Step 3: Verifying tables were created..."
$EXEC_PREFIX docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SELECT
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'migrations_status')
THEN '✅ migrations_status' ELSE '❌ MISSING' END,
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'blocks')
THEN '✅ blocks' ELSE '❌ MISSING' END,
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'transactions')
THEN '✅ transactions' ELSE '❌ MISSING' END,
CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'addresses')
THEN '✅ addresses' ELSE '❌ MISSING' END;
" 2>&1
echo ""
# Step 4: Find docker-compose.yml
echo "Step 4: Updating docker-compose.yml to run migrations on startup..."
BLOCKSCOUT_DIR=""
if [ -d /opt/blockscout ]; then
BLOCKSCOUT_DIR="/opt/blockscout"
elif [ -d /root/blockscout ]; then
BLOCKSCOUT_DIR="/root/blockscout"
else
echo "❌ Cannot find Blockscout directory"
exit 1
fi
cd "$BLOCKSCOUT_DIR"
if [ ! -f docker-compose.yml ]; then
echo "❌ docker-compose.yml not found in $BLOCKSCOUT_DIR"
exit 1
fi
# Backup
cp docker-compose.yml docker-compose.yml.backup.$(date +%Y%m%d_%H%M%S)
echo "✅ Created backup: docker-compose.yml.backup.*"
# Update command to run migrations before start
if grep -q "command:" docker-compose.yml; then
# Replace existing command
sed -i 's|command:.*blockscout start|command: sh -c "bin/blockscout eval '\''Explorer.Release.migrate()'\'' \&\& bin/blockscout start"|' docker-compose.yml
sed -i 's|command:.*/app/bin/blockscout start|command: sh -c "bin/blockscout eval '\''Explorer.Release.migrate()'\'' \&\& bin/blockscout start"|' docker-compose.yml
else
# Add command if it doesn't exist
sed -i '/blockscout:/a\ command: sh -c "bin/blockscout eval '\''Explorer.Release.migrate()'\'' \&\& bin/blockscout start"' docker-compose.yml
fi
echo "✅ Updated docker-compose.yml"
echo ""
# Step 5: Restart Blockscout
echo "Step 5: Restarting Blockscout..."
$EXEC_PREFIX cd "$BLOCKSCOUT_DIR" && docker compose down blockscout 2>/dev/null || true
sleep 2
$EXEC_PREFIX cd "$BLOCKSCOUT_DIR" && docker compose up -d blockscout
echo "✅ Blockscout restarted"
echo ""
# Step 6: Wait and check status
echo "Step 6: Waiting for Blockscout to start (30 seconds)..."
sleep 30
echo ""
echo "Checking container status..."
$EXEC_PREFIX docker ps | grep blockscout || echo "⚠️ Container not running"
echo ""
echo "Recent logs:"
$EXEC_PREFIX docker logs blockscout 2>&1 | tail -20
echo ""
echo "=========================================="
echo "Fix Complete!"
echo "=========================================="
echo ""
echo "If container is still crashing, check logs:"
echo " docker logs blockscout 2>&1 | tail -50"
echo ""
echo "To verify API is working:"
echo " curl -s http://localhost:4000/api/v2/stats | head -20"