#!/usr/bin/env bash # Production Docker Deployment Script for MEV Bot (Master Repo) # This script deploys the MEV bot with Docker auto-restart and systemd on-boot startup # Optimized for production use with the master repository set -euo pipefail # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Script information echo -e "${PURPLE}🚀 MEV Bot Production Docker Deployment${NC}" echo -e "${PURPLE}========================================${NC}" echo "" # Check if running from project root if [ ! -f "go.mod" ]; then echo -e "${RED}❌ Error: This script must be run from the project root directory${NC}" exit 1 fi # Load container runtime detection SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/container-runtime.sh" ]; then source "$SCRIPT_DIR/container-runtime.sh" init else echo -e "${RED}❌ Error: container-runtime.sh not found${NC}" exit 1 fi if [[ -z "$CONTAINER_RUNTIME" ]]; then echo -e "${RED}❌ Error: No container runtime found (podman or docker required)${NC}" exit 1 fi if [[ -z "$COMPOSE_CMD" ]]; then echo -e "${RED}❌ Error: No compose command available${NC}" exit 1 fi echo -e "${GREEN}✅ Container runtime available: $CONTAINER_RUNTIME${NC}" echo -e "${GREEN}✅ Compose command: $COMPOSE_CMD${NC}" # Check/Create .env file echo -e "${BLUE}🔧 Checking environment configuration...${NC}" if [ ! -f ".env" ]; then if [ -f ".env.production" ]; then echo -e "${YELLOW}âš ī¸ .env file not found, copying from .env.production${NC}" cp .env.production .env echo -e "${GREEN}✅ Created .env from .env.production${NC}" elif [ -f ".env.example" ]; then echo -e "${YELLOW}âš ī¸ .env file not found, copying from .env.example${NC}" cp .env.example .env echo -e "${YELLOW}âš ī¸ Please edit .env file with your configuration before running again${NC}" echo -e "${YELLOW} Required: ARBITRUM_RPC_ENDPOINT, ARBITRUM_WS_ENDPOINT${NC}" exit 1 else echo -e "${RED}❌ Error: No .env or .env.example file found${NC}" exit 1 fi else echo -e "${GREEN}✅ .env file exists${NC}" fi # Verify critical environment variables echo -e "${BLUE}🔍 Verifying environment variables...${NC}" source .env MISSING_VARS=() if [ -z "${ARBITRUM_RPC_ENDPOINT:-}" ]; then MISSING_VARS+=("ARBITRUM_RPC_ENDPOINT") fi if [ -z "${ARBITRUM_WS_ENDPOINT:-}" ]; then MISSING_VARS+=("ARBITRUM_WS_ENDPOINT") fi if [ ${#MISSING_VARS[@]} -ne 0 ]; then echo -e "${RED}❌ Error: Missing required environment variables in .env:${NC}" for var in "${MISSING_VARS[@]}"; do echo -e "${RED} - $var${NC}" done exit 1 fi echo -e "${GREEN}✅ Required environment variables are set${NC}" # Create required directories echo -e "${BLUE}📁 Creating required directories...${NC}" mkdir -p logs config data # Stop any existing containers echo -e "${BLUE}âšī¸ Stopping any existing containers...${NC}" $COMPOSE_CMD down 2>/dev/null || true # Build the Docker image echo -e "${BLUE}🔨 Building Docker image...${NC}" $COMPOSE_CMD build if [ $? -ne 0 ]; then echo -e "${RED}❌ Error: Failed to build Docker image${NC}" exit 1 fi echo -e "${GREEN}✅ Docker image built successfully${NC}" # Start the container echo -e "${BLUE}🚀 Starting MEV Bot container...${NC}" $COMPOSE_CMD up -d if [ $? -ne 0 ]; then echo -e "${RED}❌ Error: Failed to start container${NC}" exit 1 fi echo -e "${GREEN}✅ MEV Bot container started successfully${NC}" # Wait for container to be healthy echo -e "${BLUE}âŗ Waiting for container to be ready...${NC}" sleep 5 # Check container status CONTAINER_STATUS=$($COMPOSE_CMD ps --format json 2>/dev/null | grep -o '"State":"[^"]*"' | cut -d'"' -f4 || echo "unknown") if [ "$CONTAINER_STATUS" = "running" ]; then echo -e "${GREEN}✅ Container is running${NC}" else echo -e "${YELLOW}âš ī¸ Container status: $CONTAINER_STATUS${NC}" fi # Setup systemd service for auto-start on boot echo "" echo -e "${BLUE}🔧 Setting up systemd service for auto-start on boot...${NC}" if [ "$EUID" -ne 0 ]; then echo -e "${YELLOW}âš ī¸ Systemd setup requires root privileges${NC}" echo -e "${YELLOW} Run the following commands to enable auto-start on boot:${NC}" echo "" echo -e "${CYAN} sudo cp scripts/mev-bot.service /etc/systemd/system/${NC}" echo -e "${CYAN} sudo systemctl daemon-reload${NC}" echo -e "${CYAN} sudo systemctl enable mev-bot.service${NC}" echo -e "${CYAN} sudo systemctl start mev-bot.service${NC}" echo "" else # Running as root, set up systemd service cp scripts/mev-bot.service /etc/systemd/system/ systemctl daemon-reload systemctl enable mev-bot.service systemctl start mev-bot.service echo -e "${GREEN}✅ Systemd service installed and enabled${NC}" fi # Display deployment summary echo "" echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 🎉 MEV Bot Production Deployment Complete! ║${NC}" echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" echo "" echo -e "${BLUE}📊 Container Information:${NC}" echo -e " Container: mev-bot-production" echo -e " Status: $CONTAINER_STATUS" echo -e " Restart Policy: Always (auto-restart on failure)" echo "" echo -e "${BLUE}📝 View Logs:${NC}" echo -e " ${CYAN}$COMPOSE_CMD logs -f mev-bot${NC}" echo "" echo -e "${BLUE}🔍 Container Status:${NC}" echo -e " ${CYAN}$COMPOSE_CMD ps${NC}" echo "" echo -e "${BLUE}🔄 Restart Container:${NC}" echo -e " ${CYAN}$COMPOSE_CMD restart mev-bot${NC}" echo "" echo -e "${BLUE}âšī¸ Stop Container:${NC}" echo -e " ${CYAN}$COMPOSE_CMD down${NC}" echo "" echo -e "${BLUE}🔧 Systemd Commands (if installed):${NC}" echo -e " ${CYAN}sudo systemctl status mev-bot${NC} # Check status" echo -e " ${CYAN}sudo systemctl restart mev-bot${NC} # Restart service" echo -e " ${CYAN}sudo systemctl stop mev-bot${NC} # Stop service" echo -e " ${CYAN}journalctl -u mev-bot -f${NC} # View systemd logs" echo "" echo -e "${YELLOW}âš ī¸ Production Deployment Notes:${NC}" echo -e " - Container will auto-restart on failure (restart: always)" echo -e " - Install systemd service for auto-start on system boot" echo -e " - Monitor logs regularly for any issues" echo -e " - Keep your .env file secure and never commit it" echo "" echo -e "${CYAN}🚀 MEV Bot is now running and monitoring Arbitrum for opportunities${NC}"