Files
proxmox/scripts/configure-besu-rpc-nodes.sh
defiQUG cb47cce074 Complete markdown files cleanup and organization
- 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.
2026-01-06 01:46:25 -08:00

284 lines
10 KiB
Bash
Executable File

#!/usr/bin/env bash
# Configure Besu RPC nodes (2500, 2501, 2502) with correct configurations
# This script ensures each RPC node has the correct config based on its role
#
# Node Roles:
# 2500 = Core - No public access, all features enabled (ADMIN, DEBUG, TRACE)
# 2501 = Prv (Permissioned) - Public permissioned access, non-Admin features only
# 2502 = Pub (Public) - Public non-auth access, minimal wallet features
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
CONFIG_DIR="$PROJECT_ROOT/smom-dbis-138/config"
# Colors
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_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Check if running on Proxmox host
if ! command -v pct &>/dev/null; then
log_error "This script must be run on Proxmox host (pct command not found)"
exit 1
fi
# RPC Node Configuration Mapping
declare -A RPC_CONFIGS
RPC_CONFIGS[2500]="config-rpc-core.toml"
RPC_CONFIGS[2501]="config-rpc-perm.toml"
RPC_CONFIGS[2502]="config-rpc-public.toml"
declare -A RPC_ROLES
RPC_ROLES[2500]="Core (no public access, all features)"
RPC_ROLES[2501]="Permissioned (public permissioned, non-Admin features)"
RPC_ROLES[2502]="Public (public non-auth, minimal wallet features)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Besu RPC Nodes Configuration Script"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# Function to check if container is running
check_container() {
local vmid=$1
if ! pct status "$vmid" 2>/dev/null | grep -q running; then
log_warn "Container $vmid is not running. Starting..."
pct start "$vmid" || {
log_error "Failed to start container $vmid"
return 1
}
sleep 5
fi
return 0
}
# Function to copy config file to container
copy_config() {
local vmid=$1
local config_file=$2
local dest_file="/etc/besu/$config_file"
local source_file="$CONFIG_DIR/$config_file"
if [[ ! -f "$source_file" ]]; then
log_error "Config file not found: $source_file"
return 1
fi
log_info "Copying $config_file to VMID $vmid..."
pct push "$vmid" "$source_file" "$dest_file" || {
log_error "Failed to copy config to container $vmid"
return 1
}
# Set ownership
pct exec "$vmid" -- chown besu:besu "$dest_file" 2>/dev/null || true
log_success "Config copied to $vmid"
return 0
}
# Function to update systemd service file
update_service() {
local vmid=$1
local config_file=$2
log_info "Updating systemd service for VMID $vmid..."
# Update service file to use correct config
pct exec "$vmid" -- sed -i "s|--config-file=\$BESU_CONFIG/[^ ]*|--config-file=\$BESU_CONFIG/$config_file|g" \
/etc/systemd/system/besu-rpc.service 2>/dev/null || {
log_warn "Could not update service file (may need manual update)"
}
pct exec "$vmid" -- systemctl daemon-reload 2>/dev/null || true
}
# Function to verify configuration
verify_config() {
local vmid=$1
local expected_config=$2
local role="${RPC_ROLES[$vmid]}"
log_info "Verifying configuration for VMID $vmid ($role)..."
local config_path="/etc/besu/$expected_config"
# Check if config file exists
if ! pct exec "$vmid" -- test -f "$config_path" 2>/dev/null; then
log_error "Config file not found: $config_path"
return 1
fi
log_success "Config file exists: $config_path"
# Verify specific settings based on node type
case $vmid in
2500)
# Core: Should have ADMIN, DEBUG, TRACE, discovery disabled
log_info " Checking Core RPC settings..."
if pct exec "$vmid" -- grep -q 'rpc-http-api=.*"ADMIN"' "$config_path" 2>/dev/null; then
log_success " ✓ ADMIN API enabled"
else
log_warn " ✗ ADMIN API not found (should be enabled)"
fi
if pct exec "$vmid" -- grep -q 'discovery-enabled=false' "$config_path" 2>/dev/null; then
log_success " ✓ Discovery disabled (no public routing)"
else
log_warn " ✗ Discovery may be enabled (should be disabled)"
fi
;;
2501)
# Permissioned: Should NOT have ADMIN, should have account permissions
log_info " Checking Permissioned RPC settings..."
if ! pct exec "$vmid" -- grep -q 'rpc-http-api=.*"ADMIN"' "$config_path" 2>/dev/null; then
log_success " ✓ ADMIN API not enabled (correct)"
else
log_warn " ✗ ADMIN API found (should be removed)"
fi
if pct exec "$vmid" -- grep -q 'permissions-accounts-config-file-enabled=true' "$config_path" 2>/dev/null; then
log_success " ✓ Account permissions enabled"
else
log_warn " ✗ Account permissions not enabled"
fi
;;
2502)
# Public: Should have minimal APIs (ETH, NET, WEB3 only)
log_info " Checking Public RPC settings..."
local api_line=$(pct exec "$vmid" -- grep 'rpc-http-api=' "$config_path" 2>/dev/null || echo "")
if echo "$api_line" | grep -q '"ETH"' && \
echo "$api_line" | grep -q '"NET"' && \
echo "$api_line" | grep -q '"WEB3"' && \
! echo "$api_line" | grep -q '"ADMIN"'; then
log_success " ✓ Minimal APIs enabled (ETH, NET, WEB3)"
else
log_warn " ✗ API configuration may not be minimal"
fi
if ! pct exec "$vmid" -- grep -q 'permissions-accounts-config-file-enabled=true' "$config_path" 2>/dev/null; then
log_success " ✓ No account permissions (public non-auth)"
else
log_warn " ✗ Account permissions enabled (should be disabled for public)"
fi
;;
esac
return 0
}
# Function to check if nodes are reversed
check_reversed() {
log_info ""
log_info "Checking if 2501 and 2502 are reversed..."
local vmid_2501_config=$(pct exec 2501 -- grep 'rpc-http-api=' /etc/besu/config-rpc-perm.toml 2>/dev/null | head -1 || echo "")
local vmid_2502_config=$(pct exec 2502 -- grep 'rpc-http-api=' /etc/besu/config-rpc-public.toml 2>/dev/null | head -1 || echo "")
# Check if 2501 has ADMIN (shouldn't) or 2502 has more than minimal APIs
if echo "$vmid_2501_config" | grep -q '"ADMIN"'; then
log_warn "VMID 2501 has ADMIN API - may need to check if reversed"
fi
if echo "$vmid_2502_config" | grep -q '"ADMIN"\|"TXPOOL"\|"QBFT"'; then
log_warn "VMID 2502 has non-minimal APIs - may need to check if reversed"
fi
log_info "Current configuration check complete"
}
# Main deployment
main() {
log_info "Starting RPC nodes configuration..."
log_info ""
# Process each RPC node
for vmid in 2500 2501 2502; do
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info "Processing VMID $vmid: ${RPC_ROLES[$vmid]}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# Check container
if ! check_container "$vmid"; then
log_error "Skipping VMID $vmid (container not available)"
continue
fi
# Get config file
local config_file="${RPC_CONFIGS[$vmid]}"
if [[ -z "$config_file" ]]; then
log_error "No config mapping for VMID $vmid"
continue
fi
# Stop service
log_info "Stopping Besu service..."
pct exec "$vmid" -- systemctl stop besu-rpc.service 2>/dev/null || true
sleep 2
# Copy config
if ! copy_config "$vmid" "$config_file"; then
log_error "Failed to copy config for VMID $vmid"
continue
fi
# Update service
update_service "$vmid" "$config_file"
# Verify config
verify_config "$vmid" "$config_file"
# Start service
log_info "Starting Besu service..."
pct exec "$vmid" -- systemctl start besu-rpc.service 2>/dev/null || {
log_error "Failed to start service on VMID $vmid"
log_info "Check logs: pct exec $vmid -- journalctl -u besu-rpc.service -n 50"
continue
}
sleep 3
# Check service status
if pct exec "$vmid" -- systemctl is-active --quiet besu-rpc.service 2>/dev/null; then
log_success "Service started successfully on VMID $vmid"
else
log_warn "Service may not be running on VMID $vmid"
log_info "Check status: pct exec $vmid -- systemctl status besu-rpc.service"
fi
done
# Check if reversed
check_reversed
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_success "Configuration complete!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
log_info "Next steps:"
log_info "1. Verify services are running:"
log_info " pct exec 2500 -- systemctl status besu-rpc.service"
log_info " pct exec 2501 -- systemctl status besu-rpc.service"
log_info " pct exec 2502 -- systemctl status besu-rpc.service"
log_info ""
log_info "2. Test RPC endpoints:"
log_info " curl -X POST http://192.168.11.250:8545 -H 'Content-Type: application/json' --data '{\"jsonrpc\":\"2.0\",\"method\":\"eth_blockNumber\",\"params\":[],\"id\":1}'"
log_info ""
log_info "3. Check logs if issues:"
log_info " pct exec 2500 -- journalctl -u besu-rpc.service -f"
}
# Run main function
main "$@"