diff --git a/backend/app/main.py b/backend/app/main.py index a9ba3044e..d9bbf6230 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,6 +1,5 @@ import asyncio import logging -import sys from contextlib import asynccontextmanager from datetime import UTC, datetime, timedelta from logging.handlers import RotatingFileHandler @@ -9,6 +8,80 @@ from logging.handlers import RotatingFileHandler # ============================================================================= # Dependency Check - runs before other imports to give helpful error messages # ============================================================================= +def _start_error_server(missing_packages: list): + """Start a minimal HTTP server to display dependency errors in browser.""" + import os + from http.server import BaseHTTPRequestHandler, HTTPServer + + packages_html = "".join(f"
  • {p}
  • " for p in missing_packages) + + html = f""" + + + Bambuddy - Setup Required + + + +
    +

    Setup Required

    +

    Missing Python packages

    +
    +

    To fix, run this command on your server:

    +
    pip install -r requirements.txt
    +

    Or if using a virtual environment:

    +
    ./venv/bin/pip install -r requirements.txt
    +

    After installing, restart Bambuddy:
    + sudo systemctl restart bambuddy

    +
    + +""" + + class ErrorHandler(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(503) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(html.encode()) + + def log_message(self, format, *args): + print(f"[Error Server] {args[0]}") + + port = int(os.environ.get("PORT", 8000)) + print(f"\nStarting error server on http://0.0.0.0:{port}") + print("Visit this URL in your browser to see the error details.\n") + + try: + server = HTTPServer(("0.0.0.0", port), ErrorHandler) + server.serve_forever() + except KeyboardInterrupt: + pass + + def check_dependencies(): """Check that all required packages are installed.""" missing = [] @@ -40,7 +113,7 @@ def check_dependencies(): print("\nOr if using a virtual environment:") print(" ./venv/bin/pip install -r requirements.txt") print("=" * 60 + "\n") - sys.exit(1) + _start_error_server(missing) check_dependencies()