250 lines
5.7 KiB
Bash
Executable File
250 lines
5.7 KiB
Bash
Executable File
#!/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 (filter out comments and handle inline comments)
|
|
export $(grep -v '^#' .env | grep -v '^$' | sed 's/#.*$//' | sed 's/[[:space:]]*$//' | 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
|