Files
explorer-monorepo/scripts/fix-502-blockscout.sh

122 lines
5.5 KiB
Bash

#!/usr/bin/env bash
# Fix 502 Bad Gateway by ensuring Blockscout is running and responding on port 4000.
# Run on Proxmox host with VMID 5000, or: EXPLORER_VM_HOST=root@192.168.11.12 bash scripts/fix-502-blockscout.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
[ -f "$REPO_ROOT/../.env" ] && source "$REPO_ROOT/../.env" 2>/dev/null || true
[ -f "$REPO_ROOT/.env" ] && source "$REPO_ROOT/.env" 2>/dev/null || true
VMID="${EXPLORER_VMID:-5000}"
EXPLORER_NODE="${EXPLORER_VM_HOST:-${PROXMOX_R630_02:-192.168.11.12}}"
if [[ "$EXPLORER_NODE" == *"@"* ]]; then SSH_TARGET="$EXPLORER_NODE"; else SSH_TARGET="root@$EXPLORER_NODE"; fi
# Remote mode: no pct, run on node via SSH
if ! command -v pct &>/dev/null || ! pct list 2>/dev/null | grep -q "^$VMID "; then
if [ -n "${EXPLORER_VM_HOST:-}" ] || [ -n "${PROXMOX_R630_02:-}" ]; then
echo "Running on Proxmox node via SSH: $SSH_TARGET"
scp -o StrictHostKeyChecking=no -o ConnectTimeout=10 "$SCRIPT_DIR/fix-502-blockscout.sh" "$SSH_TARGET:/tmp/fix-502-blockscout.sh" 2>/dev/null || true
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "$SSH_TARGET" "EXPLORER_VM_HOST= bash /tmp/fix-502-blockscout.sh"
exit $?
else
echo "Run this on the Proxmox host that has VMID $VMID, or set EXPLORER_VM_HOST=root@<node-ip>"
exit 1
fi
fi
EXEC_PREFIX="pct exec $VMID --"
echo "=============================================="
echo "Fix 502: Start Blockscout (VMID $VMID)"
echo "=============================================="
echo ""
# 1) Start postgres if present
echo "=== 1. PostgreSQL ==="
$EXEC_PREFIX docker start blockscout-postgres 2>/dev/null || true
$EXEC_PREFIX docker ps -a --format '{{.Names}} {{.Status}}' | grep -E "postgres|blockscout" || true
sleep 2
echo ""
# 2) Get Blockscout container name and restart it (app may have died inside)
echo "=== 2. Blockscout container (restart to recover app) ==="
CONTAINER=$($EXEC_PREFIX docker ps -a --format '{{.Names}}' 2>/dev/null | grep -E "blockscout" | grep -v postgres | head -1 | tr -d '\n\r' || true)
if [ -z "$CONTAINER" ]; then
echo "⚠️ No Blockscout container found. Trying to create it from /opt/blockscout..."
$EXEC_PREFIX bash -c 'cd /opt/blockscout 2>/dev/null && docker compose up -d blockscout 2>/dev/null || docker compose up -d 2>/dev/null' 2>&1 || true
sleep 5
CONTAINER=$($EXEC_PREFIX docker ps -a --format '{{.Names}}' 2>/dev/null | grep -E "blockscout" | grep -v postgres | head -1 | tr -d '\n\r' || true)
fi
if [ -z "$CONTAINER" ]; then
echo "❌ Still no Blockscout container. Listing all:"
$EXEC_PREFIX docker ps -a --format '{{.Names}}' 2>/dev/null || true
echo ""
echo "Start it manually: pct exec $VMID -- bash -c 'cd /opt/blockscout && docker compose up -d'"
exit 1
else
echo "Restarting container: $CONTAINER"
RESTART_OUT=$($EXEC_PREFIX docker restart "$CONTAINER" 2>&1) || true
echo "$RESTART_OUT"
if echo "$RESTART_OUT" | grep -q "no space left on device"; then
echo ""
echo "❌ Disk full on VMID $VMID. Free space first, then rerun this script."
echo " From your machine: EXPLORER_VM_HOST=root@192.168.11.12 bash scripts/free-disk-vmid5000.sh"
echo " Or on Proxmox host: pct exec $VMID -- docker system prune -f; pct exec $VMID -- docker volume prune -f"
exit 1
fi
echo "✅ Restart sent (waiting 15s for app to bind 4000...)"
sleep 15
fi
echo ""
# 3) Show container status and recent logs
echo "=== 3. Container status & logs ==="
$EXEC_PREFIX docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E "NAMES|blockscout|postgres" || true
CONTAINER=$($EXEC_PREFIX docker ps -a --format '{{.Names}}' 2>/dev/null | grep -E "blockscout" | grep -v postgres | head -1 | tr -d '\n\r' || true)
if [ -n "$CONTAINER" ]; then
echo ""
echo "Recent logs ($CONTAINER):"
$EXEC_PREFIX docker logs "$CONTAINER" 2>&1 | tail -30
else
echo "⚠️ Could not get container name for logs"
fi
echo ""
# 4) Wait for port 4000
echo "=== 4. Waiting for API (port 4000) ==="
WAIT_MAX="${BLOCKSCOUT_WAIT_MAX:-60}"
WAIT_DONE=0
while [ $WAIT_DONE -lt $WAIT_MAX ]; do
if $EXEC_PREFIX curl -sS -f -o /dev/null -w "%{http_code}" --connect-timeout 3 http://127.0.0.1:4000/api/v2/stats 2>/dev/null | grep -q 200; then
echo "✅ Blockscout API responding"
break
fi
sleep 5
WAIT_DONE=$((WAIT_DONE + 5))
echo " ... ${WAIT_DONE}s"
done
if [ $WAIT_DONE -ge $WAIT_MAX ]; then
echo "❌ API did not respond in ${WAIT_MAX}s. Common causes:"
echo " - Container exited: check logs above; run: pct exec $VMID -- docker logs $CONTAINER"
echo " - Database not ready or migrations needed: pct exec $VMID -- bash scripts/blockscout-quick-fix.sh (inside VM)"
echo " - Missing startup command in docker-compose: add 'command: bin/blockscout start' under blockscout service"
exit 1
fi
echo ""
# 5) Quick public check
echo "=== 5. Public API check ==="
BASE="${EXPLORER_BASE_URL:-https://explorer.d-bis.org}"
CODE=$(curl -sS -o /dev/null -w "%{http_code}" --connect-timeout 10 "$BASE/api/v2/stats" 2>/dev/null || echo "000")
if [ "$CODE" = "200" ]; then
echo "$BASE/api/v2/stats → 200"
else
echo "⚠️ $BASE/api/v2/stats → $CODE (nginx/tunnel may need a moment)"
fi
echo ""
echo "=============================================="
echo "Done. If still 502, see docs/EXPLORER_API_ACCESS.md"
echo "=============================================="