#!/bin/bash # Trading System Deployment Script # Usage: ./deploy.sh [start|stop|restart|logs|status|backup] set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Helper functions log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check if .env file exists check_env() { if [ ! -f .env ]; then log_warning ".env file not found. Creating from template..." if [ -f .env.production ]; then cp .env.production .env log_info "Please edit .env file with your actual API keys" log_info "nano .env" exit 1 else log_error "No .env template found!" exit 1 fi fi } # Validate environment validate_env() { log_info "Validating environment configuration..." # Source the .env file export $(grep -v '^#' .env | xargs) # Check required variables if [ -z "$ALPACA_API_KEY" ] || [ "$ALPACA_API_KEY" = "your_paper_api_key_here" ]; then log_error "ALPACA_API_KEY not set in .env file" exit 1 fi if [ -z "$ALPACA_SECRET_KEY" ] || [ "$ALPACA_SECRET_KEY" = "your_paper_secret_key_here" ]; then log_error "ALPACA_SECRET_KEY not set in .env file" exit 1 fi # Warn about live trading if [ "$TRADING_MODE" = "live" ]; then log_warning "⚠️ LIVE TRADING MODE ENABLED! ⚠️" log_warning "This will use real money. Are you sure? (y/N)" read -r response if [[ ! "$response" =~ ^[Yy]$ ]]; then log_info "Switching to paper trading mode for safety" sed -i.bak 's/TRADING_MODE=live/TRADING_MODE=paper/' .env fi fi log_success "Environment validation passed" } # Start the trading system start_system() { log_info "Starting trading system..." check_env validate_env # Create logs directory mkdir -p logs # Build and start containers docker compose build docker compose up -d log_success "Trading system started!" log_info "View logs with: ./deploy.sh logs" log_info "Check status with: ./deploy.sh status" } # Stop the trading system stop_system() { log_info "Stopping trading system..." docker compose down log_success "Trading system stopped" } # Restart the trading system restart_system() { log_info "Restarting trading system..." stop_system sleep 2 start_system } # Show logs show_logs() { if [ "$2" = "live" ]; then log_info "Following live logs (Ctrl+C to exit)..." docker compose logs -f trading-bot else log_info "Recent logs:" docker compose logs --tail=50 trading-bot fi } # Show system status show_status() { log_info "Trading system status:" echo # Container status docker compose ps echo # Recent performance log_info "Recent performance (last 5 entries):" if [ -f logs/performance.log ]; then tail -5 logs/performance.log else log_warning "No performance data yet" fi echo # Recent trades log_info "Recent trades (last 3 entries):" if [ -f logs/trades.log ]; then tail -3 logs/trades.log else log_warning "No trades yet" fi echo # Risk events log_info "Recent risk events:" if [ -f logs/risk.log ]; then tail -3 logs/risk.log else log_success "No risk events" fi } # Backup logs and data backup_data() { log_info "Creating backup..." TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_DIR="backups/backup_$TIMESTAMP" mkdir -p "$BACKUP_DIR" # Backup logs if [ -d logs ]; then cp -r logs "$BACKUP_DIR/" fi # Backup configuration cp .env "$BACKUP_DIR/.env.backup" 2>/dev/null || true cp docker-compose.yml "$BACKUP_DIR/" log_success "Backup created: $BACKUP_DIR" } # Update system update_system() { log_info "Updating trading system..." # Stop system stop_system # Backup current state backup_data # Rebuild containers docker compose build --no-cache # Start system start_system log_success "System updated successfully" } # Main script logic case "${1:-help}" in start) start_system ;; stop) stop_system ;; restart) restart_system ;; logs) show_logs "$@" ;; status) show_status ;; backup) backup_data ;; update) update_system ;; help|*) echo "Trading System Deployment Script" echo echo "Usage: $0 [command]" echo echo "Commands:" echo " start - Start the trading system" echo " stop - Stop the trading system" echo " restart - Restart the trading system" echo " logs - Show recent logs" echo " logs live - Follow live logs" echo " status - Show system status and performance" echo " backup - Backup logs and configuration" echo " update - Update and restart system" echo " help - Show this help message" echo echo "Examples:" echo " $0 start # Start trading" echo " $0 logs live # Watch live logs" echo " $0 status # Check performance" echo ;; esac