Files
foxhunt/scripts/start_services.sh
jgrusewski 8d89fe80ff chore: Second cleanup wave - organize root directory
- Archive: 85 agent .txt files → docs/archive/agents/legacy_txt/
- Scripts: Move 110 shell scripts → scripts/ (keep deploy.sh in root)
- Models: Move 18 .safetensors → ml/models/checkpoints/training_artifacts/
- Delete: 34 directories (~33GB freed) - target/, coverage_*, test artifacts
- Build: Clean 14 build artifacts (.rlib, .o, .pid, binaries)
- Tests: Move 14 .rs files → tests/standalone/
- SQL: Move 5 files → sql/ (keep init-db*.sql for Docker)
- Wave 153: Archive to docs/archive/historical/wave153/
- Docs: Archive 9 markdown files to wave_d/reports/ and historical/

Total impact: ~34GB freed (both waves), root directory cleaned from 583 to ~40 essential files
Directory count reduced from 65 to 31 (52% reduction)
All historical data preserved in organized archive structure
2025-10-30 01:26:02 +01:00

206 lines
7.4 KiB
Bash
Executable File

#!/bin/bash
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}Starting Foxhunt Services...${NC}"
# Create logs and runtime directories
mkdir -p logs
mkdir -p /tmp/foxhunt
# Setup TLS certificates (required by backtesting and ML services)
if [ ! -f /tmp/foxhunt/certs/server.crt ]; then
echo -e "${YELLOW}Generating self-signed TLS certificates for development...${NC}"
mkdir -p /tmp/foxhunt/certs
openssl req -x509 -newkey rsa:4096 -keyout /tmp/foxhunt/certs/server.key -out /tmp/foxhunt/certs/server.crt -days 365 -nodes -subj "/CN=localhost" >/dev/null 2>&1
echo -e "${GREEN}TLS certificates generated${NC}"
fi
# Load environment variables (using existing test database)
export POSTGRES_HOST=localhost
export POSTGRES_PORT=5433
export POSTGRES_USER=foxhunt_test
export POSTGRES_PASSWORD=test_password
export POSTGRES_DB=foxhunt_test
export DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
export REDIS_HOST=localhost
export REDIS_PORT=6380
export REDIS_URL="redis://${REDIS_HOST}:${REDIS_PORT}"
export VAULT_ADDR="http://localhost:8200"
export VAULT_TOKEN="foxhunt_vault_token_change_in_prod"
export RUST_LOG=info,api_gateway=debug,trading_service=debug
export RUST_BACKTRACE=1
# Generate a proper JWT secret with high entropy (base64 encoded random bytes = uppercase + lowercase + numbers + symbols)
export JWT_SECRET=$(openssl rand -base64 64 | tr -d '\n')
export JWT_EXPIRY_SECONDS=3600
# TLS certificates path
export TLS_CERT_PATH="/tmp/foxhunt/certs/server.crt"
export TLS_KEY_PATH="/tmp/foxhunt/certs/server.key"
# API keys (using dummy values for now - services should handle missing keys gracefully)
export BENZINGA_API_KEY="dummy_api_key_for_testing"
export DATABENTO_API_KEY="dummy_api_key_for_testing"
# Service ports
export API_GATEWAY_PORT=50050
export TRADING_SERVICE_PORT=50051
export BACKTESTING_SERVICE_PORT=50052
export ML_TRAINING_SERVICE_PORT=50053
# Backend service URLs (for API Gateway)
export TRADING_SERVICE_URL="http://localhost:${TRADING_SERVICE_PORT}"
export BACKTESTING_SERVICE_URL="http://localhost:${BACKTESTING_SERVICE_PORT}"
export ML_TRAINING_SERVICE_URL="http://localhost:${ML_TRAINING_SERVICE_PORT}"
# Kill switch socket path (writable location)
export KILL_SWITCH_SOCKET_PATH="/tmp/foxhunt/kill_switch.sock"
echo -e "${YELLOW}Environment configured${NC}"
echo "DATABASE_URL: ${DATABASE_URL}"
echo "REDIS_URL: ${REDIS_URL}"
echo "VAULT_ADDR: ${VAULT_ADDR}"
echo "KILL_SWITCH_SOCKET_PATH: ${KILL_SWITCH_SOCKET_PATH}"
echo "TLS_CERT_PATH: ${TLS_CERT_PATH}"
echo "JWT_SECRET length: ${#JWT_SECRET} chars (base64 encoded for high entropy)"
# Start Vault if not running
if ! docker ps | grep -q foxhunt-vault; then
echo -e "${YELLOW}Starting Vault...${NC}"
# Remove old container if exists
docker rm -f foxhunt-vault 2>/dev/null || true
docker run -d --name foxhunt-vault \
-p 8200:8200 \
-e VAULT_DEV_ROOT_TOKEN_ID="${VAULT_TOKEN}" \
-e VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200 \
hashicorp/vault:latest server -dev >/dev/null 2>&1
sleep 3
echo -e "${GREEN}Vault started${NC}"
else
echo -e "${GREEN}Vault already running${NC}"
fi
echo -e "${YELLOW}Starting backend services first (they must be ready before API Gateway)...${NC}"
# Start Trading Service
echo -e "${YELLOW}Starting Trading Service (port ${TRADING_SERVICE_PORT})...${NC}"
./target/release/trading_service &> logs/trading_service.log &
TRADING_SERVICE_PID=$!
echo "Trading Service PID: ${TRADING_SERVICE_PID}"
echo "${TRADING_SERVICE_PID}" > logs/trading_service.pid
# Start Backtesting Service
echo -e "${YELLOW}Starting Backtesting Service (port ${BACKTESTING_SERVICE_PORT})...${NC}"
./target/release/backtesting_service &> logs/backtesting_service.log &
BACKTESTING_SERVICE_PID=$!
echo "Backtesting Service PID: ${BACKTESTING_SERVICE_PID}"
echo "${BACKTESTING_SERVICE_PID}" > logs/backtesting_service.pid
# Start ML Training Service (with "serve" command)
echo -e "${YELLOW}Starting ML Training Service (port ${ML_TRAINING_SERVICE_PORT})...${NC}"
./target/release/ml_training_service serve &> logs/ml_training_service.log &
ML_TRAINING_SERVICE_PID=$!
echo "ML Training Service PID: ${ML_TRAINING_SERVICE_PID}"
echo "${ML_TRAINING_SERVICE_PID}" > logs/ml_training_service.pid
echo -e "${YELLOW}Waiting 15 seconds for backend services to start...${NC}"
sleep 15
# Check backend services are responding
echo -e "${YELLOW}Checking backend service health...${NC}"
BACKENDS_READY=true
for port in ${TRADING_SERVICE_PORT} ${BACKTESTING_SERVICE_PORT} ${ML_TRAINING_SERVICE_PORT}; do
if nc -z localhost ${port} 2>/dev/null; then
echo -e "${GREEN}${NC} Port ${port} is listening"
else
echo -e "${RED}${NC} Port ${port} is NOT listening"
BACKENDS_READY=false
fi
done
if [ "$BACKENDS_READY" = false ]; then
echo -e "${YELLOW}Some backend services failed to start. Checking logs...${NC}"
echo ""
echo "=== Trading Service Log (last 30 lines) ==="
tail -30 logs/trading_service.log
echo ""
echo "=== Backtesting Service Log (last 30 lines) ==="
tail -30 logs/backtesting_service.log
echo ""
echo "=== ML Training Service Log (last 30 lines) ==="
tail -30 logs/ml_training_service.log
echo ""
echo -e "${RED}Backend services not ready. Exiting.${NC}"
exit 1
fi
# Now start API Gateway
echo -e "${YELLOW}Starting API Gateway (port ${API_GATEWAY_PORT})...${NC}"
./target/release/api_gateway &> logs/api_gateway.log &
API_GATEWAY_PID=$!
echo "API Gateway PID: ${API_GATEWAY_PID}"
echo "${API_GATEWAY_PID}" > logs/api_gateway.pid
echo -e "${GREEN}All services started!${NC}"
echo ""
echo "Service PIDs:"
echo " Trading Service: ${TRADING_SERVICE_PID}"
echo " Backtesting Service: ${BACKTESTING_SERVICE_PID}"
echo " ML Training Service: ${ML_TRAINING_SERVICE_PID}"
echo " API Gateway: ${API_GATEWAY_PID}"
echo ""
echo -e "${YELLOW}Waiting 10 seconds for API Gateway to initialize...${NC}"
sleep 10
# Health check
echo -e "${GREEN}Performing final health checks...${NC}"
echo ""
# Function to check if port is listening
check_port() {
local port=$1
local service=$2
if nc -z localhost ${port} 2>/dev/null; then
echo -e "${GREEN}${NC} ${service} (port ${port}): LISTENING"
return 0
else
echo -e "${RED}${NC} ${service} (port ${port}): NOT RESPONDING"
return 1
fi
}
# Check all services
ALL_HEALTHY=true
check_port 50051 "Trading Service" || ALL_HEALTHY=false
check_port 50052 "Backtesting Service" || ALL_HEALTHY=false
check_port 50053 "ML Training Service" || ALL_HEALTHY=false
check_port 50050 "API Gateway" || ALL_HEALTHY=false
echo ""
if [ "$ALL_HEALTHY" = true ]; then
echo -e "${GREEN}✓✓✓ All services are healthy and ready for load testing! ✓✓✓${NC}"
echo ""
echo "Service URLs:"
echo " API Gateway: http://localhost:50050"
echo " Trading Service: http://localhost:50051"
echo " Backtesting Service: http://localhost:50052"
echo " ML Training Service: http://localhost:50053"
else
echo -e "${YELLOW}Some services may have issues. Check logs in ./logs/${NC}"
fi
echo ""
echo "To stop all services, run: ./stop_services.sh"
echo "To view logs: tail -f logs/*.log"
echo "To check service status: ps aux | grep -E 'trading_service|backtesting_service|ml_training_service|api_gateway'"