Files
metamask-integration/scripts/deploy-to-explorer.sh
2026-03-02 12:14:14 -08:00

310 lines
10 KiB
Bash
Executable File

#!/usr/bin/env bash
# Deploy all MetaMask integration changes to explorer.d-bis.org (VMID 5000)
# Phases: 1) Backend API, 2) Frontend, 3) Verify, 4) Optional enhancements
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# VMID 5000 connection
VMID=5000
VMID_IP="192.168.11.140"
PROXMOX_HOST="192.168.11.12" # r630-02
PROXMOX_USER="${PROXMOX_USER:-root}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_ok() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_fail() { echo -e "${RED}[FAIL]${NC} $1"; }
# Check SSH access
check_access() {
log_info "Checking access to VMID $VMID..."
if ! ssh -o ConnectTimeout=5 -o BatchMode=yes "$PROXMOX_USER@$PROXMOX_HOST" "pct status $VMID" &>/dev/null; then
log_fail "Cannot access VMID $VMID via $PROXMOX_HOST. Check SSH keys and network."
exit 1
fi
log_ok "Access confirmed"
}
# Phase 1: Deploy backend API with config routes
deploy_backend_api() {
log_info "========================================="
log_info "PHASE 1: Deploy backend API (config routes)"
log_info "========================================="
# Build Go API
log_info "Building Go API..."
(cd "$REPO_ROOT/explorer-monorepo/backend" && go build -o bin/api-server ./api/rest/cmd/)
log_ok "Go API built: explorer-monorepo/backend/bin/api-server"
# Copy to VMID 5000
log_info "Copying API server to VMID $VMID..."
scp -o ConnectTimeout=10 "$REPO_ROOT/explorer-monorepo/backend/bin/api-server" \
"$PROXMOX_USER@$PROXMOX_HOST:/tmp/api-server-config"
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $VMID /tmp/api-server-config /usr/local/bin/explorer-config-api && \
pct exec $VMID -- chmod +x /usr/local/bin/explorer-config-api"
log_ok "API server copied to VMID $VMID:/usr/local/bin/explorer-config-api"
# Create systemd service
log_info "Creating systemd service for config API..."
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- bash -c 'cat > /etc/systemd/system/explorer-config-api.service <<EOF
[Unit]
Description=Explorer Config API (MetaMask networks and token list)
After=network.target postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/explorer
Environment=\"PORT=8081\"
Environment=\"CHAIN_ID=138\"
Environment=\"DATABASE_URL=postgresql://explorer:explorer@localhost:5432/explorer_db\"
ExecStart=/usr/local/bin/explorer-config-api
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
'"
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- systemctl daemon-reload && \
pct exec $VMID -- systemctl enable explorer-config-api && \
pct exec $VMID -- systemctl start explorer-config-api"
sleep 3
if ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- systemctl is-active explorer-config-api" | grep -q "active"; then
log_ok "Config API service started on port 8081"
else
log_warn "Config API service may not be running; check logs: journalctl -u explorer-config-api -n 50"
fi
# Update nginx to proxy /api/config
log_info "Updating nginx config for /api/config proxy..."
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- bash -c '
NGINX_CONF=\$(find /etc/nginx/sites-enabled -name \"*blockscout*\" -o -name \"default\" | head -1)
if [ -z \"\$NGINX_CONF\" ]; then NGINX_CONF=\"/etc/nginx/sites-enabled/default\"; fi
# Add /api/config location if not present
if ! grep -q \"location /api/config\" \"\$NGINX_CONF\"; then
sed -i \"/server_name.*explorer.d-bis.org/a\\
# MetaMask config API\\
location /api/config/ {\\
proxy_pass http://127.0.0.1:8081/api/config/;\\
proxy_set_header Host \\\$host;\\
proxy_set_header X-Real-IP \\\$remote_addr;\\
add_header Access-Control-Allow-Origin \"*\" always;\\
add_header Cache-Control \"public, max-age=3600\";\\
}\" \"\$NGINX_CONF\"
nginx -t && systemctl reload nginx
echo \"Nginx updated and reloaded\"
else
echo \"/api/config already configured\"
fi
'"
log_ok "Phase 1 complete: Backend API deployed"
echo ""
}
# Phase 2: Deploy frontend with Wallet page
deploy_frontend() {
log_info "========================================="
log_info "PHASE 2: Deploy frontend (Wallet page)"
log_info "========================================="
# Build frontend with production env
log_info "Building frontend for production..."
(cd "$REPO_ROOT/explorer-monorepo/frontend" && \
echo "NEXT_PUBLIC_API_URL=https://explorer.d-bis.org" > .env.production && \
echo "NEXT_PUBLIC_CHAIN_ID=138" >> .env.production && \
pnpm run build)
log_ok "Frontend built"
# Create deployment tarball
log_info "Creating deployment package..."
(cd "$REPO_ROOT/explorer-monorepo/frontend" && \
tar czf /tmp/explorer-frontend.tar.gz .next public src package.json next.config.js)
# Copy to VMID 5000
log_info "Copying frontend to VMID $VMID..."
scp -o ConnectTimeout=10 /tmp/explorer-frontend.tar.gz \
"$PROXMOX_USER@$PROXMOX_HOST:/tmp/explorer-frontend.tar.gz"
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $VMID /tmp/explorer-frontend.tar.gz /tmp/explorer-frontend.tar.gz && \
pct exec $VMID -- bash -c '
mkdir -p /opt/explorer-frontend
cd /opt/explorer-frontend
tar xzf /tmp/explorer-frontend.tar.gz
rm /tmp/explorer-frontend.tar.gz
# Install deps if needed
if ! command -v node &>/dev/null; then
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
fi
# Install pnpm if needed
if ! command -v pnpm &>/dev/null; then
npm install -g pnpm@10
fi
# Install production deps
pnpm install --prod
'"
# Create systemd service for Next.js
log_info "Creating Next.js systemd service..."
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- bash -c 'cat > /etc/systemd/system/explorer-frontend.service <<EOF
[Unit]
Description=Explorer Frontend (Next.js)
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/explorer-frontend
Environment=\"NODE_ENV=production\"
Environment=\"PORT=3000\"
ExecStart=/usr/bin/pnpm start
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
'"
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- systemctl daemon-reload && \
pct exec $VMID -- systemctl enable explorer-frontend && \
pct exec $VMID -- systemctl restart explorer-frontend"
sleep 3
if ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- systemctl is-active explorer-frontend" | grep -q "active"; then
log_ok "Frontend service started on port 3000"
else
log_warn "Frontend service may not be running; check logs: journalctl -u explorer-frontend -n 50"
fi
# Update nginx to proxy frontend routes
log_info "Updating nginx for frontend routes..."
ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $VMID -- bash -c '
NGINX_CONF=\$(find /etc/nginx/sites-enabled -name \"*blockscout*\" -o -name \"default\" | head -1)
if [ -z \"\$NGINX_CONF\" ]; then NGINX_CONF=\"/etc/nginx/sites-enabled/default\"; fi
# Add /wallet and /_next proxies if not present
if ! grep -q \"location /wallet\" \"\$NGINX_CONF\"; then
sed -i \"/location \\/api\\/config/a\\
# Frontend routes (Next.js)\\
location /wallet {\\
proxy_pass http://127.0.0.1:3000;\\
proxy_set_header Host \\\$host;\\
proxy_set_header X-Real-IP \\\$remote_addr;\\
}\\
location /_next/ {\\
proxy_pass http://127.0.0.1:3000;\\
proxy_set_header Host \\\$host;\\
}\" \"\$NGINX_CONF\"
nginx -t && systemctl reload nginx
echo \"Nginx updated for frontend\"
else
echo \"/wallet already configured\"
fi
'"
log_ok "Phase 2 complete: Frontend deployed"
echo ""
}
# Phase 3: Verify integration
verify_integration() {
log_info "========================================="
log_info "PHASE 3: Verify integration"
log_info "========================================="
# Test config endpoints
log_info "Testing /api/config/networks..."
if curl -sf --max-time 10 "https://explorer.d-bis.org/api/config/networks" | grep -q "chains"; then
log_ok "GET /api/config/networks OK"
else
log_fail "GET /api/config/networks failed"
fi
log_info "Testing /api/config/token-list..."
if curl -sf --max-time 10 "https://explorer.d-bis.org/api/config/token-list" | grep -q "tokens"; then
log_ok "GET /api/config/token-list OK"
else
log_fail "GET /api/config/token-list failed"
fi
log_info "Testing /wallet page..."
if curl -sf --max-time 10 "https://explorer.d-bis.org/wallet" | grep -q "MetaMask"; then
log_ok "GET /wallet OK"
else
log_warn "GET /wallet may not be serving (check Next.js service)"
fi
# Run full integration script
log_info "Running full integration script..."
(cd "$REPO_ROOT/metamask-integration" && \
EXPLORER_API_URL=https://explorer.d-bis.org ./scripts/integration-test-all.sh)
log_ok "Phase 3 complete: Integration verified"
echo ""
}
# Phase 4: Optional enhancements
deploy_optional() {
log_info "========================================="
log_info "PHASE 4: Optional enhancements"
log_info "========================================="
log_info "Token-aggregation service deployment (optional):"
log_info " - Requires DB and env configuration"
log_info " - See: smom-dbis-138/services/token-aggregation/docs/DEPLOYMENT.md"
log_info " - Skip for now (can deploy separately)"
log_info "Chain 138 Snap deployment (optional):"
log_info " - Run: cd metamask-integration/chain138-snap && pnpm run start"
log_info " - Install in MetaMask Flask via http://localhost:8000"
log_info " - Skip for now (manual testing)"
log_ok "Phase 4 noted: Optional items documented"
echo ""
}
# Main execution
main() {
log_info "Deploying MetaMask integration to explorer.d-bis.org (VMID $VMID)"
echo ""
check_access
echo ""
deploy_backend_api
deploy_frontend
verify_integration
deploy_optional
log_ok "========================================="
log_ok "All phases complete"
log_ok "========================================="
echo ""
echo "Next steps:"
echo " 1. Visit https://explorer.d-bis.org/wallet to test Add to MetaMask"
echo " 2. Add token list URL in MetaMask: https://explorer.d-bis.org/api/config/token-list"
echo " 3. Test adding Chain 138, Ethereum Mainnet, ALL Mainnet"
echo ""
}
main "$@"