- Migrate from Docker to Podman for enhanced security (rootless containers) - Add production-ready Dockerfile with multi-stage builds - Configure production environment with Arbitrum mainnet RPC endpoints - Add comprehensive test coverage for core modules (exchanges, execution, profitability) - Implement production audit and deployment documentation - Update deployment scripts for production environment - Add container runtime and health monitoring scripts - Document RPC limitations and remediation strategies - Implement token metadata caching and pool validation This commit prepares the MEV bot for production deployment on Arbitrum with full containerization, security hardening, and operational tooling. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
320 lines
8.1 KiB
Bash
Executable File
320 lines
8.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# 🚀 MEV BOT PRODUCTION STARTUP SCRIPT - IMMEDIATE PROFIT MODE
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
BLUE='\033[0;34m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
|
|
log() {
|
|
echo -e "${GREEN}[PRODUCTION-START]${NC} $*"
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $*"
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR]${NC} $*"
|
|
}
|
|
|
|
info() {
|
|
echo -e "${BLUE}[INFO]${NC} $*"
|
|
}
|
|
|
|
header() {
|
|
echo -e "${BOLD}${GREEN}===============================================${NC}"
|
|
echo -e "${BOLD}${GREEN} 🚀 MEV BOT PRODUCTION DEPLOYMENT - PROFIT MODE${NC}"
|
|
echo -e "${BOLD}${GREEN}===============================================${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Pre-flight checks
|
|
preflight_checks() {
|
|
log "Running pre-flight checks..."
|
|
|
|
# Check if binary exists and is recent
|
|
if [[ ! -f "bin/mev-bot" ]]; then
|
|
error "MEV bot binary not found. Building..."
|
|
make build
|
|
fi
|
|
|
|
# Check if binary is executable
|
|
if [[ ! -x "bin/mev-bot" ]]; then
|
|
chmod +x bin/mev-bot
|
|
fi
|
|
|
|
# Verify binary
|
|
local binary_info
|
|
binary_info=$(file bin/mev-bot)
|
|
if [[ "$binary_info" =~ "ELF 64-bit" ]]; then
|
|
log "✅ Binary verified: $(ls -lh bin/mev-bot | awk '{print $5}')"
|
|
else
|
|
error "❌ Invalid binary format"
|
|
exit 1
|
|
fi
|
|
|
|
# Check Go version
|
|
local go_version
|
|
go_version=$(go version | grep -o 'go[0-9.]*' | head -1)
|
|
log "✅ Go version: $go_version"
|
|
|
|
# Check critical directories
|
|
mkdir -p keystore/production logs backups/production
|
|
log "✅ Production directories created"
|
|
|
|
# Check environment file
|
|
if [[ -f ".env.production.secure" ]]; then
|
|
log "✅ Production environment configuration found"
|
|
else
|
|
warn "Production environment not configured"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Validate configuration
|
|
validate_config() {
|
|
log "Validating production configuration..."
|
|
|
|
# Source production environment
|
|
if [[ -f ".env.production.secure" ]]; then
|
|
source .env.production.secure
|
|
else
|
|
error "Production environment file not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate critical settings
|
|
if [[ -z "${MEV_BOT_ENCRYPTION_KEY:-}" ]]; then
|
|
error "MEV_BOT_ENCRYPTION_KEY not set"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ${#MEV_BOT_ENCRYPTION_KEY} -lt 32 ]]; then
|
|
error "MEV_BOT_ENCRYPTION_KEY too short (minimum 32 characters)"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${ARBITRUM_RPC_ENDPOINT:-}" ]]; then
|
|
error "ARBITRUM_RPC_ENDPOINT not set"
|
|
exit 1
|
|
fi
|
|
|
|
log "✅ Configuration validated"
|
|
}
|
|
|
|
# Start monitoring
|
|
start_monitoring() {
|
|
log "Starting monitoring and metrics..."
|
|
|
|
# Start Prometheus (if available)
|
|
if command -v prometheus >/dev/null 2>&1; then
|
|
log "Starting Prometheus..."
|
|
prometheus --config.file=monitoring/prometheus.yml --storage.tsdb.path=monitoring/data &
|
|
echo $! > monitoring/prometheus.pid
|
|
fi
|
|
|
|
# Start Grafana (if available)
|
|
if command -v grafana-server >/dev/null 2>&1; then
|
|
log "Starting Grafana..."
|
|
grafana-server --config=monitoring/grafana.ini &
|
|
echo $! > monitoring/grafana.pid
|
|
fi
|
|
|
|
log "✅ Monitoring started (check ports 9090, 3000)"
|
|
}
|
|
|
|
# Start MEV bot
|
|
start_mev_bot() {
|
|
log "🚀 Starting MEV Bot in PRODUCTION mode..."
|
|
|
|
# Set production environment safely (avoid code injection)
|
|
if [[ -f ".env.production.secure" ]]; then
|
|
set -a
|
|
source .env.production.secure
|
|
set +a
|
|
fi
|
|
|
|
# Additional production environment
|
|
export GO_ENV=production
|
|
export DEBUG=false
|
|
export LOG_LEVEL=info
|
|
|
|
# Performance tuning
|
|
export GOMAXPROCS=4
|
|
export GOGC=100
|
|
|
|
# Start the bot with proper logging
|
|
log "Starting MEV bot process..."
|
|
|
|
# Create log file with timestamp
|
|
local log_file="logs/production-$(date +%Y%m%d-%H%M%S).log"
|
|
|
|
# Start bot with output to both console and log file
|
|
./bin/mev-bot start 2>&1 | tee "$log_file" &
|
|
|
|
local bot_pid=$!
|
|
echo "$bot_pid" > mev-bot.pid
|
|
|
|
log "✅ MEV Bot started with PID: $bot_pid"
|
|
log "📊 Logs: $log_file"
|
|
log "🔍 Monitor with: tail -f $log_file"
|
|
|
|
# Wait a moment to check if process started successfully
|
|
sleep 3
|
|
|
|
if kill -0 "$bot_pid" 2>/dev/null; then
|
|
log "🎉 MEV Bot is running successfully!"
|
|
log "💰 Profit tracking active - monitor logs for opportunities"
|
|
else
|
|
error "❌ MEV Bot failed to start"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Display status
|
|
show_status() {
|
|
echo ""
|
|
log "🎯 PRODUCTION STATUS:"
|
|
echo ""
|
|
|
|
# MEV Bot status
|
|
if [[ -f "mev-bot.pid" ]]; then
|
|
local bot_pid
|
|
bot_pid=$(cat mev-bot.pid)
|
|
if kill -0 "$bot_pid" 2>/dev/null; then
|
|
info "✅ MEV Bot: RUNNING (PID: $bot_pid)"
|
|
else
|
|
warn "❌ MEV Bot: STOPPED"
|
|
fi
|
|
else
|
|
warn "❌ MEV Bot: NOT STARTED"
|
|
fi
|
|
|
|
# Monitoring status
|
|
if [[ -f "monitoring/prometheus.pid" ]]; then
|
|
local prom_pid
|
|
prom_pid=$(cat monitoring/prometheus.pid)
|
|
if kill -0 "$prom_pid" 2>/dev/null; then
|
|
info "✅ Prometheus: RUNNING (PID: $prom_pid) - http://localhost:9090"
|
|
fi
|
|
fi
|
|
|
|
if [[ -f "monitoring/grafana.pid" ]]; then
|
|
local grafana_pid
|
|
grafana_pid=$(cat monitoring/grafana.pid)
|
|
if kill -0 "$grafana_pid" 2>/dev/null; then
|
|
info "✅ Grafana: RUNNING (PID: $grafana_pid) - http://localhost:3000"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
log "💡 Quick Commands:"
|
|
log " View logs: tail -f logs/production-*.log"
|
|
log " Stop bot: ./scripts/production-stop.sh"
|
|
log " Monitor: watch -n 1 'ps aux | grep mev-bot'"
|
|
echo ""
|
|
|
|
log "🎯 READY FOR PROFIT GENERATION!"
|
|
log "Monitor the logs for arbitrage opportunities and executed trades"
|
|
}
|
|
|
|
# Production safety warning
|
|
safety_warning() {
|
|
echo ""
|
|
warn "⚠️ PRODUCTION DEPLOYMENT WARNING:"
|
|
echo ""
|
|
echo "1. 💰 This will start LIVE trading with real funds"
|
|
echo "2. 🔑 Ensure your private keys are secure"
|
|
echo "3. 💸 Start with small position sizes"
|
|
echo "4. 📊 Monitor all transactions closely"
|
|
echo "5. 🚨 Set up alerts for unusual activity"
|
|
echo ""
|
|
|
|
read -p "Are you ready to start LIVE trading? (type 'PROFIT' to confirm): " -r
|
|
if [[ $REPLY != "PROFIT" ]]; then
|
|
echo "Deployment cancelled"
|
|
exit 0
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Quick deployment mode
|
|
quick_deploy() {
|
|
log "🚀 QUICK DEPLOYMENT MODE - MAXIMUM SPEED TO PROFIT"
|
|
|
|
# Skip most checks, assume environment is ready
|
|
if [[ -f ".env.production.secure" ]]; then
|
|
set -a
|
|
source .env.production.secure
|
|
set +a
|
|
fi
|
|
export GO_ENV=production
|
|
export DEBUG=false
|
|
|
|
# Start bot immediately
|
|
./bin/mev-bot start &
|
|
local bot_pid=$!
|
|
echo "$bot_pid" > mev-bot.pid
|
|
|
|
log "⚡ MEV Bot deployed in QUICK mode (PID: $bot_pid)"
|
|
log "💰 PROFIT GENERATION ACTIVE"
|
|
|
|
# Quick status check
|
|
sleep 2
|
|
if kill -0 "$bot_pid" 2>/dev/null; then
|
|
log "🎉 SUCCESS - Bot is generating profits!"
|
|
else
|
|
error "❌ Quick deployment failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Main deployment function
|
|
main() {
|
|
local mode="${1:-full}"
|
|
|
|
header
|
|
|
|
case "$mode" in
|
|
quick)
|
|
log "QUICK DEPLOYMENT MODE"
|
|
quick_deploy
|
|
;;
|
|
full)
|
|
log "FULL PRODUCTION DEPLOYMENT"
|
|
safety_warning
|
|
preflight_checks
|
|
validate_config
|
|
start_monitoring
|
|
start_mev_bot
|
|
show_status
|
|
;;
|
|
status)
|
|
show_status
|
|
;;
|
|
*)
|
|
error "Unknown mode: $mode"
|
|
echo "Usage: $0 [full|quick|status]"
|
|
echo " full - Complete production deployment with all checks"
|
|
echo " quick - Fast deployment, skip checks (IMMEDIATE PROFIT)"
|
|
echo " status - Show current status"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Handle interrupts gracefully
|
|
trap 'error "Deployment interrupted"; exit 1' INT TERM
|
|
|
|
# Run main function
|
|
main "$@" |