#!/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 VMID=5000 BLOCKSCOUT_IP="192.168.11.140" 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 if [ -f "$PROJECT_ROOT/scripts/apply-direct-blockscout-route.sh" ]; then log_info "Running NPMplus update script..." cd "$PROJECT_ROOT" if ./scripts/apply-direct-blockscout-route.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. Update explorer.d-bis.org Forward Port: 80 → 4000" 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://192.168.11.140:4000/api/v2/stats" log_info "4. Run this script again to complete NPMplus update" echo "" fi exit 0