137 lines
4.4 KiB
Bash
Executable File
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"
|
|
|