# run_app.py """ Development server that mimics Docker production conditions. Uses Gunicorn with Uvicorn workers (like Docker) but with auto-reload enabled. Loads environment variables from .env file. """ import os import sys from pathlib import Path # Load environment variables from .env file (mimics docker-compose env_file) try: from dotenv import load_dotenv env_path = Path(__file__).parent / '.env' if env_path.exists(): load_dotenv(env_path) print(f"✓ Loaded environment from {env_path}") else: print(f"⚠ No .env file found at {env_path}") except ImportError: print("⚠ python-dotenv not installed. Run: pip install python-dotenv") print(" Environment variables from .env will not be loaded") # Mimic Docker environment variables os.environ.setdefault('PYTHONDONTWRITEBYTECODE', '1') os.environ.setdefault('PYTHONUNBUFFERED', '1') # Ensure upload folder exists (mimics Dockerfile RUN mkdir) UPLOAD_FOLDER = "data/uploads" os.makedirs(UPLOAD_FOLDER, exist_ok=True) if __name__ == "__main__": # Check if we should use Gunicorn (production-like) or Uvicorn (faster dev) use_gunicorn = "--gunicorn" in sys.argv if use_gunicorn: # Production-like: Gunicorn with Uvicorn workers (mimics Docker CMD exactly) import subprocess print("🚀 Starting with Gunicorn + Uvicorn workers (Docker production mode)") print(" Workers: 4, Host: 0.0.0.0:8000, Timeout: 120s") print(" Note: Auto-reload NOT available in Gunicorn mode") subprocess.run([ "gunicorn", "main:app", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000", "--workers", "4", "--timeout", "120", "--reload" # Gunicorn's reload (watches Python files) ]) else: # Development: Single Uvicorn worker with fast auto-reload import uvicorn print("🔧 Starting with Uvicorn (development mode with auto-reload)") print(" Host: 0.0.0.0:8000") print(" Tip: Use --gunicorn flag to test with production server") uvicorn.run( "main:app", host="0.0.0.0", port=8000, reload=True, log_level="info" )