- Organized 252 files across project - Root directory: 187 → 2 files (98.9% reduction) - Moved configuration guides to docs/04-configuration/ - Moved troubleshooting guides to docs/09-troubleshooting/ - Moved quick start guides to docs/01-getting-started/ - Moved reports to reports/ directory - Archived temporary files - Generated comprehensive reports and documentation - Created maintenance scripts and guides All files organized according to established standards.
290 lines
10 KiB
Bash
Executable File
290 lines
10 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Complete fix for Blockscout Explorer - fixes all issues
|
|
# Usage: ./fix-blockscout-explorer.sh [VMID] [IP]
|
|
# Defaults: VMID=5000, IP=192.168.11.140
|
|
|
|
set -euo pipefail
|
|
|
|
VMID="${1:-5000}"
|
|
IP="${2:-192.168.11.140}"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
log_section() { echo -e "${CYAN}════════════════════════════════════════${NC}"; }
|
|
|
|
PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}"
|
|
|
|
# Function to find which node has the container
|
|
find_container_node() {
|
|
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "for n in ml110 pve pve2; do if pvesh get /nodes/\$n/lxc/$VMID/status/current --output-format json >/dev/null 2>&1; then echo \$n; break; fi; done" 2>/dev/null || echo ""
|
|
}
|
|
|
|
# Function to execute command in container
|
|
exec_container() {
|
|
local cmd="$1"
|
|
# Check if we're already on the Proxmox host (command exists locally)
|
|
if command -v pct >/dev/null 2>&1; then
|
|
# Running directly on Proxmox host - use pct directly
|
|
pct exec $VMID -- bash -c "$cmd" 2>/dev/null || echo ""
|
|
elif [ -n "$CONTAINER_NODE" ]; then
|
|
# Try via pct via SSH first
|
|
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pct exec $VMID -- bash -c '$cmd'" 2>/dev/null || echo ""
|
|
else
|
|
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pct exec $VMID -- bash -c '$cmd'" 2>/dev/null || echo ""
|
|
fi
|
|
}
|
|
|
|
log_section
|
|
log_info "Blockscout Explorer Fix Script"
|
|
log_info "VMID: $VMID"
|
|
log_info "IP: $IP"
|
|
log_section
|
|
echo ""
|
|
|
|
# Step 1: Check container status
|
|
log_section
|
|
log_info "Step 1: Checking container status..."
|
|
log_section
|
|
|
|
# Check if we're on Proxmox host directly
|
|
if command -v pct >/dev/null 2>&1; then
|
|
# Running on Proxmox host - check status directly
|
|
CONTAINER_STATUS=$(pct status $VMID 2>/dev/null | awk '{print $2}' || echo "missing")
|
|
if [ "$CONTAINER_STATUS" != "missing" ]; then
|
|
# Get the node name from hostname or pvecm
|
|
CONTAINER_NODE=$(hostname 2>/dev/null || echo "")
|
|
fi
|
|
else
|
|
# Find which node has the container via SSH
|
|
CONTAINER_NODE=""
|
|
CONTAINER_NODE=$(find_container_node || echo "")
|
|
if [ -z "$CONTAINER_NODE" ]; then
|
|
CONTAINER_STATUS="missing"
|
|
else
|
|
CONTAINER_STATUS=$(ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pvesh get /nodes/$CONTAINER_NODE/lxc/$VMID/status/current --output-format json 2>/dev/null | grep -oP '\"status\":\s*\"\\K[^\"]+' | head -1 || echo 'unknown'")
|
|
fi
|
|
fi
|
|
|
|
if [ "$CONTAINER_STATUS" = "missing" ]; then
|
|
log_error "Container $VMID does not exist"
|
|
log_info "Attempting to deploy Blockscout container..."
|
|
|
|
# Check if deployment script exists
|
|
DEPLOY_SCRIPT="$SCRIPT_DIR/../smom-dbis-138-proxmox/scripts/deployment/deploy-explorer.sh"
|
|
if [ ! -f "$DEPLOY_SCRIPT" ]; then
|
|
log_error "Deployment script not found: $DEPLOY_SCRIPT"
|
|
log_info "Please deploy Blockscout container manually:"
|
|
log_info " cd smom-dbis-138-proxmox/scripts/deployment"
|
|
log_info " ./deploy-explorer.sh"
|
|
log_info ""
|
|
log_info "Note: You may need to update VMID_EXPLORER_START in config/proxmox.conf to $VMID"
|
|
exit 1
|
|
fi
|
|
|
|
# Try to deploy (this may require being run on the Proxmox host)
|
|
log_warn "Deployment must be run on Proxmox host. Please run:"
|
|
log_info " ssh root@$PROXMOX_HOST"
|
|
log_info " cd /home/intlc/projects/proxmox/smom-dbis-138-proxmox/scripts/deployment"
|
|
log_info " # Update config to use VMID $VMID if needed"
|
|
log_info " ./deploy-explorer.sh"
|
|
log_info ""
|
|
log_info "After deployment, run this fix script again."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$CONTAINER_STATUS" != "running" ]; then
|
|
log_warn "Container is not running. Starting container..."
|
|
if command -v pct >/dev/null 2>&1; then
|
|
# Running directly on Proxmox host
|
|
pct start $VMID 2>&1 || {
|
|
log_error "Failed to start container $VMID"
|
|
exit 1
|
|
}
|
|
elif [ -n "$CONTAINER_NODE" ]; then
|
|
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pvesh create /nodes/$CONTAINER_NODE/lxc/$VMID/status/start 2>&1" || {
|
|
log_error "Failed to start container $VMID on node $CONTAINER_NODE"
|
|
exit 1
|
|
}
|
|
else
|
|
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pct start $VMID 2>&1" || {
|
|
log_error "Failed to start container $VMID"
|
|
exit 1
|
|
}
|
|
fi
|
|
sleep 5
|
|
log_success "Container started"
|
|
else
|
|
log_success "Container is running on node: ${CONTAINER_NODE:-$(hostname 2>/dev/null || echo 'unknown')}"
|
|
fi
|
|
|
|
# Step 2: Check Blockscout service
|
|
log_section
|
|
log_info "Step 2: Checking Blockscout service..."
|
|
log_section
|
|
|
|
BLOCKSCOUT_STATUS=$(exec_container "systemctl is-active blockscout 2>/dev/null || echo 'inactive'")
|
|
if [ "$BLOCKSCOUT_STATUS" != "active" ]; then
|
|
log_warn "Blockscout service is not running. Starting service..."
|
|
exec_container "systemctl start blockscout" || {
|
|
log_warn "Failed to start blockscout service, checking Docker containers..."
|
|
# Try to start via docker-compose
|
|
exec_container "cd /opt/blockscout && docker-compose up -d" || {
|
|
log_error "Failed to start Blockscout. Please check logs:"
|
|
log_info " pct exec $VMID -- journalctl -u blockscout -n 50"
|
|
log_info " pct exec $VMID -- docker-compose -f /opt/blockscout/docker-compose.yml logs"
|
|
}
|
|
}
|
|
log_info "Waiting for Blockscout to start (this may take 1-2 minutes)..."
|
|
sleep 30
|
|
else
|
|
log_success "Blockscout service is running"
|
|
fi
|
|
|
|
# Check if Blockscout is responding
|
|
log_info "Checking if Blockscout is responding on port 4000..."
|
|
BLOCKSCOUT_RESPONSE=$(exec_container "timeout 5 curl -s http://127.0.0.1:4000/api/v2/status 2>&1 || echo 'FAILED'")
|
|
if echo "$BLOCKSCOUT_RESPONSE" | grep -q "success\|chain_id"; then
|
|
log_success "Blockscout is responding on port 4000"
|
|
else
|
|
log_warn "Blockscout may still be starting up"
|
|
log_info "Response: $BLOCKSCOUT_RESPONSE"
|
|
log_info "This is normal if Blockscout was just started - it may take 1-2 minutes to fully start"
|
|
fi
|
|
|
|
# Step 3: Install and configure Nginx
|
|
log_section
|
|
log_info "Step 3: Installing and configuring Nginx..."
|
|
log_section
|
|
|
|
if exec_container "command -v nginx >/dev/null 2>&1"; then
|
|
log_info "Nginx is already installed"
|
|
else
|
|
log_info "Installing Nginx..."
|
|
"$SCRIPT_DIR/install-nginx-blockscout.sh" "$VMID" "$IP" || {
|
|
log_error "Failed to install Nginx"
|
|
exit 1
|
|
}
|
|
fi
|
|
|
|
# Step 4: Test Nginx configuration
|
|
log_section
|
|
log_info "Step 4: Testing Nginx configuration..."
|
|
log_section
|
|
|
|
NGINX_TEST=$(exec_container "nginx -t 2>&1")
|
|
if echo "$NGINX_TEST" | grep -q "syntax is ok\|test is successful"; then
|
|
log_success "Nginx configuration is valid"
|
|
else
|
|
log_error "Nginx configuration has errors:"
|
|
echo "$NGINX_TEST"
|
|
exit 1
|
|
fi
|
|
|
|
# Restart Nginx to ensure it's running
|
|
exec_container "systemctl restart nginx" || {
|
|
log_error "Failed to restart Nginx"
|
|
exit 1
|
|
}
|
|
|
|
# Test Nginx proxy
|
|
log_info "Testing Nginx proxy..."
|
|
NGINX_RESPONSE=$(exec_container "timeout 5 curl -s -k http://127.0.0.1/health 2>&1 || echo 'FAILED'")
|
|
if echo "$NGINX_RESPONSE" | grep -q "success\|chain_id"; then
|
|
log_success "Nginx proxy is working correctly"
|
|
else
|
|
log_warn "Nginx proxy test returned: $NGINX_RESPONSE"
|
|
log_info "This may be normal if Blockscout is still starting"
|
|
fi
|
|
|
|
# Step 5: Configure Cloudflare
|
|
log_section
|
|
log_info "Step 5: Configuring Cloudflare DNS/tunnel..."
|
|
log_section
|
|
|
|
if [ -f "$SCRIPT_DIR/../.env" ]; then
|
|
log_info "Found .env file, configuring Cloudflare..."
|
|
cd "$SCRIPT_DIR/.."
|
|
"$SCRIPT_DIR/configure-cloudflare-explorer.sh" || {
|
|
log_warn "Cloudflare configuration failed, but continuing..."
|
|
log_info "You may need to configure Cloudflare manually:"
|
|
log_info " - DNS: CNAME explorer.d-bis.org → <tunnel-id>.cfargotunnel.com (🟠 Proxied)"
|
|
log_info " - Tunnel: explorer.d-bis.org → http://$IP:80"
|
|
}
|
|
else
|
|
log_warn ".env file not found, skipping Cloudflare configuration"
|
|
log_info "To configure Cloudflare later, run:"
|
|
log_info " ./scripts/configure-cloudflare-explorer.sh"
|
|
fi
|
|
|
|
# Step 6: Final verification
|
|
log_section
|
|
log_info "Step 6: Final verification..."
|
|
log_section
|
|
|
|
# Check container status
|
|
CONTAINER_STATUS=$(ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "pct status $VMID 2>/dev/null | awk '{print \$2}'")
|
|
log_info "Container status: $CONTAINER_STATUS"
|
|
|
|
# Check Blockscout service
|
|
BLOCKSCOUT_STATUS=$(exec_container "systemctl is-active blockscout 2>/dev/null || echo 'inactive'")
|
|
log_info "Blockscout service: $BLOCKSCOUT_STATUS"
|
|
|
|
# Check Nginx
|
|
NGINX_STATUS=$(exec_container "systemctl is-active nginx 2>/dev/null || echo 'inactive'")
|
|
log_info "Nginx service: $NGINX_STATUS"
|
|
|
|
# Check listening ports
|
|
PORTS=$(exec_container "ss -tlnp 2>&1 | grep -E ':80|:443|:4000' || echo ''")
|
|
if echo "$PORTS" | grep -q ':4000'; then
|
|
log_success "Port 4000 (Blockscout) is listening"
|
|
else
|
|
log_warn "Port 4000 may not be listening"
|
|
fi
|
|
|
|
if echo "$PORTS" | grep -q ':80'; then
|
|
log_success "Port 80 (Nginx HTTP) is listening"
|
|
else
|
|
log_warn "Port 80 may not be listening"
|
|
fi
|
|
|
|
if echo "$PORTS" | grep -q ':443'; then
|
|
log_success "Port 443 (Nginx HTTPS) is listening"
|
|
else
|
|
log_warn "Port 443 may not be listening"
|
|
fi
|
|
|
|
# Summary
|
|
log_section
|
|
log_success "Blockscout Explorer fix completed!"
|
|
log_section
|
|
echo ""
|
|
log_info "Summary:"
|
|
log_info " - Container: $VMID ($CONTAINER_STATUS)"
|
|
log_info " - Blockscout: $BLOCKSCOUT_STATUS"
|
|
log_info " - Nginx: $NGINX_STATUS"
|
|
log_info " - Internal URL: http://$IP"
|
|
log_info " - Public URL: https://explorer.d-bis.org (after DNS propagation)"
|
|
echo ""
|
|
log_info "Test URLs:"
|
|
log_info " - Direct Blockscout: curl http://$IP:4000/api/v2/status"
|
|
log_info " - Via Nginx (HTTP): curl http://$IP/health"
|
|
log_info " - Via Nginx (HTTPS): curl -k https://$IP/health"
|
|
log_info " - Public (after DNS): curl https://explorer.d-bis.org/health"
|
|
echo ""
|
|
log_info "If explorer.d-bis.org is still not accessible:"
|
|
log_info " 1. Verify Cloudflare DNS/tunnel configuration"
|
|
log_info " 2. Wait for DNS propagation (1-5 minutes)"
|
|
log_info " 3. Check Cloudflare tunnel status"
|
|
log_info " 4. Verify firewall rules allow port 80/443"
|