Files
explorer-monorepo/scripts/fix-explorer-remote.sh

326 lines
12 KiB
Bash
Executable File

#!/bin/bash
# Remote fix for explorer.d-bis.org
# This script uses SSH to deploy the fix to VMID 5000
# Can work from any machine with SSH access to Proxmox host or VMID 5000
set -euo pipefail
PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}"
PROXMOX_NODE="${PROXMOX_NODE:-r630-2}"
VMID_5000="${VMID_5000:-5000}"
VM_IP="${VM_IP:-192.168.11.140}"
FRONTEND_SOURCE="/home/intlc/projects/proxmox/explorer-monorepo/frontend/public/index.html"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
echo "=========================================="
echo "Remote Explorer Fix"
echo "=========================================="
echo "Proxmox Host: $PROXMOX_HOST"
echo "Proxmox Node: $PROXMOX_NODE"
echo "VMID: $VMID_5000"
echo "VM IP: $VM_IP"
echo "Frontend Source: $FRONTEND_SOURCE"
echo "=========================================="
echo ""
# Step 1: Verify frontend file exists
echo "=== Step 1: Verifying frontend file ==="
if [ ! -f "$FRONTEND_SOURCE" ]; then
echo "❌ Frontend file not found: $FRONTEND_SOURCE"
exit 1
fi
echo "✅ Frontend file found"
echo ""
# Step 2: Try direct SSH to VMID 5000, node, or Proxmox host
echo "=== Step 2: Attempting SSH access ==="
if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@"$VM_IP" "echo test" 2>/dev/null; then
echo "✅ Direct SSH access to VMID 5000 available"
DEPLOY_METHOD="direct_ssh"
elif ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@"$PROXMOX_NODE" "echo test" 2>/dev/null; then
echo "✅ Direct SSH access to Proxmox node $PROXMOX_NODE available"
DEPLOY_METHOD="node_ssh"
elif ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "echo test" 2>/dev/null; then
echo "✅ SSH access to Proxmox host available"
DEPLOY_METHOD="proxmox_ssh"
else
echo "❌ Cannot access Proxmox host, node, or VMID 5000 via SSH"
echo ""
echo "Please ensure SSH access is configured:"
echo " - To Proxmox node: ssh root@$PROXMOX_NODE"
echo " - To Proxmox host: ssh root@$PROXMOX_HOST"
echo " - To VMID 5000: ssh root@$VM_IP"
exit 1
fi
echo ""
# Step 3: Deploy based on method
if [ "$DEPLOY_METHOD" = "node_ssh" ]; then
echo "=== Step 3: Deploying directly to Proxmox node $PROXMOX_NODE ==="
# Copy frontend file to node
echo "Copying frontend file to node..."
scp -o StrictHostKeyChecking=no "$FRONTEND_SOURCE" root@"$PROXMOX_NODE":/tmp/index.html
# Deploy using pct on the node
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_NODE" bash << DEPLOY_SCRIPT_EOF
set +e
echo "Checking container VMID $VMID_5000..."
if ! pct list | grep -q "^$VMID_5000 "; then
echo "❌ Container VMID $VMID_5000 not found on this node"
exit 1
fi
# Check if container is running
CONTAINER_STATUS=\$(pct status $VMID_5000 2>/dev/null | awk '{print \$2}' || echo "stopped")
if [ "\$CONTAINER_STATUS" != "running" ]; then
echo "⚠️ Container VMID $VMID_5000 is not running (\$CONTAINER_STATUS), starting..."
pct start $VMID_5000
sleep 5
echo "✅ Container started"
else
echo "✅ Container is already running"
fi
# Deploy frontend
echo "Deploying frontend..."
pct push $VMID_5000 /tmp/index.html /var/www/html/index.html
pct exec $VMID_5000 -- chown www-data:www-data /var/www/html/index.html
# Update nginx config
echo "Updating nginx configuration..."
pct exec $VMID_5000 -- bash -c 'cp /etc/nginx/sites-available/blockscout /etc/nginx/sites-available/blockscout.backup.\$(date +%Y%m%d_%H%M%S) 2>/dev/null || true'
pct exec $VMID_5000 -- bash -c 'grep -q "location = / {" /etc/nginx/sites-available/blockscout || sed -i "/server_name.*explorer.d-bis.org/a\\ # Serve custom frontend for root path\\ location = / {\\ root /var/www/html;\\ try_files /index.html =404;\\ }" /etc/nginx/sites-available/blockscout'
pct exec $VMID_5000 -- systemctl reload nginx 2>/dev/null || pct exec $VMID_5000 -- systemctl restart nginx 2>/dev/null || true
echo "✅ Deployment complete"
DEPLOY_SCRIPT_EOF
elif [ "$DEPLOY_METHOD" = "direct_ssh" ]; then
echo "=== Step 3: Deploying directly to VMID 5000 ==="
# Copy frontend file
echo "Copying frontend file..."
scp -o StrictHostKeyChecking=no "$FRONTEND_SOURCE" root@"$VM_IP":/tmp/index.html
# Deploy and configure
ssh -o StrictHostKeyChecking=no root@"$VM_IP" << 'DEPLOY_SCRIPT'
set +e
mkdir -p /var/www/html
cp /tmp/index.html /var/www/html/index.html
chown www-data:www-data /var/www/html/index.html
# Update nginx config if needed
NGINX_CONFIG="/etc/nginx/sites-available/blockscout"
if [ -f "$NGINX_CONFIG" ]; then
# Backup
cp "$NGINX_CONFIG" "${NGINX_CONFIG}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true
# Check if already configured
if ! grep -q "location = / {" "$NGINX_CONFIG"; then
# Add location block for root path
sed -i '/server_name.*explorer.d-bis.org/a\
# Serve custom frontend for root path\
location = / {\
root /var/www/html;\
try_files /index.html =404;\
}' "$NGINX_CONFIG"
fi
fi
# Ensure nginx is running
systemctl start nginx 2>/dev/null || true
systemctl reload nginx 2>/dev/null || true
echo "✅ Deployment complete on VMID 5000"
DEPLOY_SCRIPT
elif [ "$DEPLOY_METHOD" = "proxmox_ssh" ]; then
echo "=== Step 3: Deploying via Proxmox host ==="
# Copy frontend file to Proxmox host first
echo "Copying frontend file to Proxmox host..."
scp -o StrictHostKeyChecking=no "$FRONTEND_SOURCE" root@"$PROXMOX_HOST":/tmp/index.html
# Deploy using pct on correct node
ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" bash << DEPLOY_SCRIPT_EOF
set +e
# Get node name from cluster - pvecm nodes outputs: Nodeid Votes Name
NODE_NAME=\$(pvecm nodes | grep -v "^Nodeid\|^-\|^Membership" | grep -i "$PROXMOX_NODE" | awk '{print \$3}' | head -1)
if [ -z "\$NODE_NAME" ]; then
# Try using the node name directly
NODE_NAME="$PROXMOX_NODE"
fi
echo "Using node: \$NODE_NAME"
NODE_IP=\$NODE_NAME
# Check if container exists on the correct node - try multiple ways
CONTAINER_FOUND=false
if [ "\$NODE_IP" = "localhost" ] || [ "\$NODE_IP" = "$PROXMOX_HOST" ]; then
# On local node
if pct list | grep -q "^$VMID_5000 "; then
CONTAINER_FOUND=true
NODE_TARGET=""
fi
elif ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@\$NODE_IP "pct list | grep -q '^$VMID_5000 '" 2>/dev/null; then
echo "✅ Container found on node $PROXMOX_NODE"
CONTAINER_FOUND=true
NODE_TARGET="root@\$NODE_IP"
fi
if [ "\$CONTAINER_FOUND" = false ]; then
echo "❌ Container VMID $VMID_5000 not found on node $PROXMOX_NODE (\$NODE_NAME)"
echo "Checking all nodes..."
pvecm nodes | grep -v "^Nodeid\|^-\|^Membership" | while read line; do
CHECK_NODE=\$(echo \$line | awk '{print \$3}')
if [ -n "\$CHECK_NODE" ] && [ "\$CHECK_NODE" != "Name" ]; then
echo " Checking node: \$CHECK_NODE"
if ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no root@\$CHECK_NODE "pct list | grep -q '^$VMID_5000 '" 2>/dev/null; then
echo " ✅ Found on node: \$CHECK_NODE"
NODE_NAME=\$CHECK_NODE
NODE_IP=\$CHECK_NODE
CONTAINER_FOUND=true
NODE_TARGET="root@\$NODE_IP"
break
fi
fi
done
fi
if [ "\$CONTAINER_FOUND" = false ]; then
echo "❌ Container VMID $VMID_5000 not found on any node"
exit 1
fi
echo "✅ Container found on node: \$NODE_IP"
# Determine command prefix
if [ -z "\$NODE_TARGET" ]; then
PCT_CMD="pct"
SCP_CMD=""
else
PCT_CMD="ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no \$NODE_TARGET pct"
SCP_CMD="scp -o ConnectTimeout=5 -o StrictHostKeyChecking=no"
fi
# Check if container is running
CONTAINER_STATUS=\$(\$PCT_CMD status $VMID_5000 2>/dev/null | awk '{print \$2}' || echo "stopped")
if [ "\$CONTAINER_STATUS" != "running" ]; then
echo "⚠️ Container VMID $VMID_5000 is not running (\$CONTAINER_STATUS), starting..."
\$PCT_CMD start $VMID_5000
sleep 5
echo "✅ Container started"
else
echo "✅ Container is already running"
fi
# Copy frontend file to the node if needed
if [ -n "\$SCP_CMD" ]; then
echo "Copying frontend file to node..."
\$SCP_CMD /tmp/index.html \$NODE_TARGET:/tmp/index.html
fi
# Deploy frontend using pct
echo "Deploying frontend to container..."
\$PCT_CMD push $VMID_5000 /tmp/index.html /var/www/html/index.html
\$PCT_CMD exec $VMID_5000 -- chown www-data:www-data /var/www/html/index.html
# Update nginx config
echo "Updating nginx configuration..."
\$PCT_CMD exec $VMID_5000 -- bash -c 'cp /etc/nginx/sites-available/blockscout /etc/nginx/sites-available/blockscout.backup.\$(date +%Y%m%d_%H%M%S) 2>/dev/null || true'
\$PCT_CMD exec $VMID_5000 -- bash -c 'grep -q "location = / {" /etc/nginx/sites-available/blockscout || sed -i "/server_name.*explorer.d-bis.org/a\\ # Serve custom frontend for root path\\ location = / {\\ root /var/www/html;\\ try_files /index.html =404;\\ }" /etc/nginx/sites-available/blockscout'
\$PCT_CMD exec $VMID_5000 -- systemctl reload nginx 2>/dev/null || \$PCT_CMD exec $VMID_5000 -- systemctl restart nginx 2>/dev/null || true
echo "✅ Deployment complete via node: \$NODE_IP"
DEPLOY_SCRIPT_EOF
fi
# Step 4: Verify deployment
echo ""
echo "=== Step 4: Verifying deployment ==="
sleep 2
if [ "$DEPLOY_METHOD" = "node_ssh" ]; then
# Check file
if ssh -o StrictHostKeyChecking=no root@"$PROXMOX_NODE" "pct exec $VMID_5000 -- test -f /var/www/html/index.html"; then
echo "✅ Frontend file deployed"
else
echo "❌ Frontend file not found"
fi
# Test HTTP
HTTP_TEST=$(ssh -o StrictHostKeyChecking=no root@"$PROXMOX_NODE" "pct exec $VMID_5000 -- curl -s -o /dev/null -w '%{http_code}' http://localhost/ 2>/dev/null || echo '000'")
if [ "$HTTP_TEST" = "200" ]; then
echo "✅ HTTP endpoint responding (200)"
else
echo "⚠️ HTTP endpoint returned: $HTTP_TEST"
fi
elif [ "$DEPLOY_METHOD" = "direct_ssh" ]; then
# Check file
if ssh -o StrictHostKeyChecking=no root@"$VM_IP" "test -f /var/www/html/index.html"; then
echo "✅ Frontend file deployed"
else
echo "❌ Frontend file not found"
fi
# Test HTTP
HTTP_TEST=$(ssh -o StrictHostKeyChecking=no root@"$VM_IP" "curl -s -o /dev/null -w '%{http_code}' http://localhost/ 2>/dev/null || echo '000'")
if [ "$HTTP_TEST" = "200" ]; then
echo "✅ HTTP endpoint responding (200)"
else
echo "⚠️ HTTP endpoint returned: $HTTP_TEST"
fi
elif [ "$DEPLOY_METHOD" = "proxmox_ssh" ]; then
# Check file
if ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "ssh -o ConnectTimeout=5 root@$PROXMOX_NODE 'pct exec $VMID_5000 -- test -f /var/www/html/index.html'"; then
echo "✅ Frontend file deployed"
else
echo "❌ Frontend file not found"
fi
# Test HTTP
HTTP_TEST=$(ssh -o StrictHostKeyChecking=no root@"$PROXMOX_HOST" "ssh -o ConnectTimeout=5 root@$PROXMOX_NODE 'pct exec $VMID_5000 -- curl -s -o /dev/null -w \"%{http_code}\" http://localhost/ 2>/dev/null || echo \"000\"'")
if [ "$HTTP_TEST" = "200" ]; then
echo "✅ HTTP endpoint responding (200)"
else
echo "⚠️ HTTP endpoint returned: $HTTP_TEST"
fi
fi
# Step 5: Test external access
echo ""
echo "=== Step 5: Testing external access ==="
sleep 3
EXTERNAL_TEST=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 10 "https://explorer.d-bis.org" 2>/dev/null || echo "000")
if [ "$EXTERNAL_TEST" = "200" ] || [ "$EXTERNAL_TEST" = "301" ] || [ "$EXTERNAL_TEST" = "302" ]; then
echo "✅ External access working (HTTP $EXTERNAL_TEST)"
echo "✅ Explorer is FIXED!"
else
echo "⚠️ External access returned: $EXTERNAL_TEST"
echo " This may be due to Cloudflare tunnel or DNS configuration"
fi
echo ""
echo "=========================================="
echo "Fix Complete"
echo "=========================================="
echo ""
echo "Summary:"
echo "- Frontend deployed to /var/www/html/index.html"
echo "- Nginx configuration updated"
echo "- Services verified"
echo ""
echo "Test the explorer:"
echo " curl -I https://explorer.d-bis.org"
echo " Or visit in browser: https://explorer.d-bis.org"
echo ""