Files
proxmox/scripts/complete-port-4000-implementation.sh

252 lines
10 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Complete Port 4000 Implementation Script
# This script attempts to complete all remaining steps for port 4000 direct route
# Usage: ./complete-port-4000-implementation.sh [proxmox-host]
set -euo pipefail
# Load IP configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true
VMID=5000
BLOCKSCOUT_IP="${IP_BLOCKSCOUT}"
BLOCKSCOUT_PORT=4000
PROXMOX_HOST="${1:-192.168.11.11}"
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
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}[⚠]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🔧 Complete Port 4000 Implementation"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "This script will attempt to complete all remaining steps:"
echo " 1. Check Blockscout configuration"
echo " 2. Fix port 4000 binding (if needed)"
echo " 3. Verify network accessibility"
echo " 4. Update NPMplus configuration"
echo " 5. Verify public domain"
echo ""
echo "VMID: $VMID"
echo "IP: $BLOCKSCOUT_IP"
echo "Port: $BLOCKSCOUT_PORT"
echo "Proxmox Host: $PROXMOX_HOST"
echo ""
# Try to detect Proxmox host access
EXEC_PREFIX=""
if command -v pct &>/dev/null; then
log_info "Running on Proxmox host (pct available)"
EXEC_PREFIX=""
elif ssh -o ConnectTimeout=5 -o BatchMode=yes -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "exit" 2>/dev/null; then
log_info "SSH access to Proxmox host available"
EXEC_PREFIX="ssh -o StrictHostKeyChecking=no root@$PROXMOX_HOST"
else
log_warn "Cannot access Proxmox host directly"
log_info "Will attempt to run checks from this machine"
EXEC_PREFIX=""
fi
# Step 1: Check current status
log_step "Step 1: Checking Current Blockscout Status..."
if [ -n "$EXEC_PREFIX" ]; then
VM_STATUS=$($EXEC_PREFIX "pct status $VMID 2>/dev/null || echo 'unknown'" || echo "unknown")
PORT_CHECK=$($EXEC_PREFIX "pct exec $VMID -- ss -tlnp 2>/dev/null | grep :$BLOCKSCOUT_PORT || echo 'not found'" || echo "not found")
else
# Try direct network test
VM_STATUS="unknown"
PORT_CHECK="unknown"
fi
NETWORK_TEST=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 "http://$BLOCKSCOUT_IP:$BLOCKSCOUT_PORT/api/v2/stats" 2>/dev/null || echo "000")
if [ "$NETWORK_TEST" = "200" ]; then
log_success "Port 4000 is already accessible!"
log_success "Blockscout is network accessible on port $BLOCKSCOUT_PORT"
SKIP_FIX=true
else
log_warn "Port 4000 is not accessible (HTTP $NETWORK_TEST)"
SKIP_FIX=false
fi
echo ""
# Step 2: Attempt to fix Blockscout (if needed)
if [ "$SKIP_FIX" = false ]; then
log_step "Step 2: Attempting to Fix Blockscout Configuration..."
if [ -z "$EXEC_PREFIX" ]; then
log_warn "Cannot fix Blockscout without Proxmox host access"
log_info "Please run from Proxmox host or ensure SSH access is configured"
log_info "Or manually fix Blockscout configuration (see implementation guide)"
echo ""
else
log_info "Checking Blockscout service status..."
# Check if Blockscout is running
SERVICE_STATUS=$($EXEC_PREFIX "pct exec $VMID -- systemctl is-active blockscout.service 2>/dev/null" || echo "inactive")
if [ "$SERVICE_STATUS" != "active" ]; then
log_info "Attempting to start Blockscout service..."
$EXEC_PREFIX "pct exec $VMID -- systemctl start blockscout.service" 2>/dev/null || log_warn "Could not start service"
sleep 3
fi
# Check Docker containers
DOCKER_CONTAINER=$($EXEC_PREFIX "pct exec $VMID -- docker ps --format '{{.Names}}' 2>/dev/null | grep -i blockscout | grep -v postgres | head -1" || echo "")
if [ -n "$DOCKER_CONTAINER" ]; then
log_info "Found Docker container: $DOCKER_CONTAINER"
log_info "Checking port binding..."
# Note: Docker port binding fix would require docker-compose.yml access
log_warn "Docker configuration fix may require manual intervention"
fi
log_info "Re-testing network accessibility..."
sleep 2
NETWORK_TEST=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 "http://$BLOCKSCOUT_IP:$BLOCKSCOUT_PORT/api/v2/stats" 2>/dev/null || echo "000")
if [ "$NETWORK_TEST" = "200" ]; then
log_success "Port 4000 is now accessible!"
SKIP_FIX=false
else
log_warn "Port 4000 still not accessible"
log_info "Manual configuration may be required"
fi
fi
echo ""
else
log_step "Step 2: Skipping fix (port already accessible)"
echo ""
fi
# Step 3: Verify network accessibility
log_step "Step 3: Verifying Network Accessibility..."
NETWORK_TEST=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 "http://$BLOCKSCOUT_IP:$BLOCKSCOUT_PORT/api/v2/stats" 2>/dev/null || echo "000")
if [ "$NETWORK_TEST" = "200" ]; then
log_success "✅ Blockscout is network accessible on port $BLOCKSCOUT_PORT"
log_success "✅ Ready for NPMplus configuration"
CAN_PROCEED=true
else
log_error "❌ Blockscout is NOT accessible on port $BLOCKSCOUT_PORT"
log_warn "Cannot proceed with NPMplus update until port 4000 is accessible"
log_info "Please fix Blockscout configuration first (see implementation guide)"
CAN_PROCEED=false
fi
echo ""
# Step 4: Update NPMplus (if Blockscout is accessible)
if [ "$CAN_PROCEED" = true ]; then
log_step "Step 4: Updating NPMplus Configuration..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Check if update script exists (explorer must use port 80 for custom SPA)
if [ -f "$PROJECT_ROOT/scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh" ]; then
log_info "Running NPMplus update script (explorer → port 80)..."
cd "$PROJECT_ROOT"
if ./scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh 2>&1 | tee /tmp/npmplus-update.log; then
log_success "NPMplus update script completed"
else
log_warn "NPMplus update script had issues"
log_info "Check /tmp/npmplus-update.log for details"
fi
else
log_warn "NPMplus update script not found"
log_info "Manual update required:"
log_info " 1. Log into NPMplus: https://192.168.0.166:81"
log_info " 2. Ensure explorer.d-bis.org Forward Port: 80 (nginx, not 4000)"
log_info " See: docs/04-configuration/EXPLORER_LINKS_FIX_NPMPLUS.md"
fi
echo ""
else
log_step "Step 4: Skipping NPMplus update (Blockscout not accessible)"
echo ""
fi
# Step 5: Verify public domain
if [ "$CAN_PROCEED" = true ]; then
log_step "Step 5: Verifying Public Domain..."
log_info "Testing: https://explorer.d-bis.org/api/v2/stats"
sleep 5 # Wait for NPMplus to reload
PUBLIC_TEST=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 10 -k "https://explorer.d-bis.org/api/v2/stats" 2>/dev/null || echo "000")
if [ "$PUBLIC_TEST" = "200" ]; then
log_success "✅ Public domain is accessible (HTTP $PUBLIC_TEST)"
log_success "✅ Direct route is working!"
elif [ "$PUBLIC_TEST" = "502" ]; then
log_error "❌ Getting 502 Bad Gateway"
log_warn "NPMplus may still be routing to port 80, or Blockscout on 4000 is not accessible"
log_info "Wait a moment and try again, or check NPMplus configuration"
else
log_warn "⚠️ Public domain returned HTTP $PUBLIC_TEST"
log_info "This may be expected if NPMplus hasn't reloaded yet"
fi
echo ""
else
log_step "Step 5: Skipping public domain test (Blockscout not accessible)"
echo ""
fi
# Final summary
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📋 Implementation Summary"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if [ "$NETWORK_TEST" = "200" ]; then
log_success "✅ Port 4000: Accessible"
if [ "$CAN_PROCEED" = true ] && [ "${PUBLIC_TEST:-000}" = "200" ]; then
log_success "✅ Public Domain: Working"
log_success "✅ Implementation: COMPLETE"
elif [ "$CAN_PROCEED" = true ]; then
log_success "✅ Port 4000: Accessible"
log_warn "⚠️ Public Domain: May need time to propagate"
log_info "Wait a few minutes and test: curl -I https://explorer.d-bis.org/api/v2/stats"
else
log_success "✅ Port 4000: Accessible"
log_info "Next: Update NPMplus configuration"
fi
else
log_error "❌ Port 4000: NOT Accessible"
log_warn "⚠️ Implementation: INCOMPLETE"
log_info "Action required: Fix Blockscout configuration"
log_info "See: docs/04-configuration/PORT_4000_IMPLEMENTATION_GUIDE.md"
fi
echo ""
# Next steps
if [ "$NETWORK_TEST" != "200" ]; then
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📋 Next Steps"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
log_info "1. Fix Blockscout to listen on 0.0.0.0:4000"
log_info "2. Restart Blockscout service"
log_info "3. Verify: curl -I http://${IP_BLOCKSCOUT}:4000/api/v2/stats"
log_info "4. Run this script again to complete NPMplus update"
echo ""
fi
exit 0