#!/bin/bash # Get Python version PYTHON_VERSION=$(python3 --version 2>/dev/null | awk '{print $2}') PYTHON_MAJOR=$(echo "$PYTHON_VERSION" | cut -d. -f1) PYTHON_MINOR=$(echo "$PYTHON_VERSION" | cut -d. -f2) # Check if Python is at least 3.8 if [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 8 ]; then echo "Python 3.8+ is required. Please install it." exit 1 fi # Create virtual environment if it doesn't exist if [ ! -d ".venv" ]; then echo "Creating virtual environment..." python3 -m venv .venv fi # Activate virtual environment source .venv/bin/activate # Install dependencies if they are missing if [ ! -d ".venv/lib" ] || [ -z "$(pip freeze)" ]; then echo "Installing dependencies..." pip install -r requirements.txt else echo "Dependencies already installed." fi # Detect number of CPU cores NUM_CORES=$(nproc) # Calculate recommended workers (2 * NUM_CORES + 1) WORKERS=$((2 * NUM_CORES + 1)) # Prompt user for how to run FastAPI echo "Choose how you want to run FastAPI:" echo "1) fastapi dev (recommended for development)" echo "2) uvicorn main:app --reload" echo "3) uvicorn main:app with recommended workers ($WORKERS workers)" echo "4) Set a custom number of workers (must be <= $WORKERS)" read -p "Enter your choice (1, 2, 3, or 4): " choice case "$choice" in 1) echo "Running FastAPI using fastapi dev..." fastapi dev main.py ;; 2) echo "Running FastAPI using Uvicorn..." uvicorn main:app --reload ;; 3) echo "Running FastAPI using Uvicorn with $WORKERS workers..." uvicorn main:app --workers $WORKERS --reload ;; 4) # Ask user for custom number of workers while true; do read -p "Enter the number of workers: " custom_workers if [ "$custom_workers" -le "$WORKERS" ]; then echo "Running FastAPI using Uvicorn with $custom_workers workers..." uvicorn main:app --workers "$custom_workers" --reload break else echo "The number of workers cannot exceed $WORKERS. Please enter a valid number." fi done ;; *) echo "Invalid choice. Exiting." exit 1 ;; esac