271 lines
6.8 KiB
Bash
Executable File

#!/bin/bash
# Integrated Start Script for AgentCore Code Interpreter
# Includes automatic setup if dependencies are missing
echo "🚀 AgentCore Code Interpreter - Starting Application"
echo "============================================================"
# Function to check if setup is needed
check_setup_needed() {
local setup_needed=false
# Check virtual environment
if [ ! -d "venv" ]; then
echo "📦 Virtual environment not found"
setup_needed=true
fi
# Check Python dependencies
if [ -d "venv" ]; then
source venv/bin/activate
if ! python -c "import strands, bedrock_agentcore, fastapi" 2>/dev/null; then
echo "📦 Python dependencies missing"
setup_needed=true
fi
deactivate 2>/dev/null || true
fi
# Check frontend dependencies
if [ ! -d "frontend/node_modules" ]; then
echo "📦 Frontend dependencies not found"
setup_needed=true
fi
# Check .env file
if [ ! -f ".env" ]; then
echo "⚙️ Configuration file (.env) not found"
setup_needed=true
fi
if [ "$setup_needed" = true ]; then
return 0 # Setup needed
else
return 1 # Setup not needed
fi
}
# Function to run setup
run_setup() {
echo "🔧 Running automatic setup..."
# Check if Python is installed
if ! command -v python3 &> /dev/null; then
echo "❌ Python 3 is required but not installed. Please install Python 3.8 or higher."
exit 1
fi
# Check if Node.js is installed
if ! command -v node &> /dev/null; then
echo "❌ Node.js is required but not installed. Please install Node.js 16 or higher."
exit 1
fi
# Create virtual environment for Python backend
if [ ! -d "venv" ]; then
echo "📦 Creating Python virtual environment..."
python3 -m venv venv
fi
source venv/bin/activate
# Install Python dependencies
echo "📦 Installing Python dependencies..."
pip install --upgrade pip -q
pip install -r requirements.txt -q
# Install Node.js dependencies for frontend
if [ ! -d "frontend/node_modules" ]; then
echo "📦 Installing Node.js dependencies..."
cd frontend
npm install --silent
cd ..
fi
# Create .env file if it doesn't exist
if [ ! -f .env ]; then
echo "⚙️ Creating .env file..."
if [ -f .env.example ]; then
cp .env.example .env
else
cat > .env << EOF
# AWS Configuration (choose one method)
AWS_PROFILE=default
AWS_REGION=us-east-1
# Application Configuration
BACKEND_HOST=0.0.0.0
BACKEND_PORT=8000
REACT_APP_API_URL=http://localhost:8000
EOF
fi
echo "📝 Please configure your AWS credentials in .env file"
fi
# Run setup verification
echo "✅ Verifying setup..."
if python tests/verify_setup.py > /dev/null 2>&1; then
echo "✅ Setup verification successful"
else
echo "⚠️ Setup verification had warnings (continuing anyway)"
fi
deactivate
echo "✅ Setup completed successfully"
}
# Function to check if backend is ready
check_backend() {
local max_attempts=30
local attempt=1
echo "🔍 Waiting for backend to be ready..."
while [ $attempt -le $max_attempts ]; do
if curl -s http://localhost:8000/health > /dev/null 2>&1; then
echo "✅ Backend is ready!"
return 0
fi
if [ $attempt -eq 1 ]; then
echo "⏳ Backend starting up..."
elif [ $((attempt % 5)) -eq 0 ]; then
echo "⏳ Still waiting... (${attempt}s)"
fi
sleep 2
attempt=$((attempt + 1))
done
echo "❌ Backend failed to start after 60 seconds"
echo "🔧 Check logs: tail -f backend.log"
echo "🔧 Run diagnostics: python tests/verify_setup.py"
return 1
}
# Function to start backend
start_backend() {
echo "🚀 Starting backend server..."
# Kill any existing backend processes
lsof -ti:8000 | xargs kill -9 2>/dev/null || true
sleep 2
# Start backend
(
source venv/bin/activate
cd backend
# Check if main.py exists
if [ ! -f "main.py" ]; then
echo "❌ backend/main.py not found"
exit 1
fi
# Start the backend with error logging
python main.py 2>&1 | tee ../backend.log &
BACKEND_PID=$!
echo $BACKEND_PID > ../backend.pid
echo "📝 Backend started with PID: $BACKEND_PID"
)
}
# Function to start frontend
start_frontend() {
echo "🚀 Starting frontend server..."
# Kill any existing frontend processes
lsof -ti:3000 | xargs kill -9 2>/dev/null || true
sleep 2
cd frontend
# Check if package.json exists
if [ ! -f "package.json" ]; then
echo "❌ frontend/package.json not found"
exit 1
fi
# Start the frontend
npm start 2>&1 | tee ../frontend.log &
FRONTEND_PID=$!
echo $FRONTEND_PID > ../frontend.pid
echo "📝 Frontend started with PID: $FRONTEND_PID"
cd ..
}
# Function to cleanup on exit
cleanup() {
echo ""
echo "🛑 Shutting down servers..."
# Kill backend
if [ -f backend.pid ]; then
BACKEND_PID=$(cat backend.pid)
kill $BACKEND_PID 2>/dev/null || true
rm -f backend.pid
fi
# Kill frontend
if [ -f frontend.pid ]; then
FRONTEND_PID=$(cat frontend.pid)
kill $FRONTEND_PID 2>/dev/null || true
rm -f frontend.pid
fi
# Kill any remaining processes on ports
lsof -ti:8000 | xargs kill -9 2>/dev/null || true
lsof -ti:3000 | xargs kill -9 2>/dev/null || true
echo "✅ Cleanup completed"
exit 0
}
# Set up signal handlers
trap cleanup SIGINT SIGTERM
# Main execution
main() {
# Check if setup is needed and run it
if check_setup_needed; then
echo "🔧 Setup required. Running automatic setup..."
run_setup
echo ""
else
echo "✅ Setup verified. Starting application..."
fi
# Start backend
start_backend
# Wait for backend to be ready
if ! check_backend; then
echo "❌ Cannot start frontend without backend"
cleanup
exit 1
fi
# Start frontend
start_frontend
echo ""
echo "🎉 Application started successfully!"
echo "📊 Backend: http://localhost:8000"
echo "🌐 Frontend: http://localhost:3000"
echo ""
echo "📋 Logs:"
echo " Backend: tail -f backend.log"
echo " Frontend: tail -f frontend.log"
echo ""
echo "Press Ctrl+C to stop the application"
echo ""
# Wait for user interrupt
while true; do
sleep 1
done
}
# Run main function
main