diff --git a/packages/api/Dockerfile b/packages/api/Dockerfile index 5612fa2..6269924 100644 --- a/packages/api/Dockerfile +++ b/packages/api/Dockerfile @@ -32,4 +32,4 @@ WORKDIR /app USER app EXPOSE 8000 -CMD ["sh", "-c", "uvicorn api.main:app --host ${HOST} --port ${PORT} --log-level info"] +CMD ["sh", "-c", "uvicorn api.main:app_factory --factory --host ${HOST} --port ${PORT} --log-level info --workers ${API_WORKERS:-4}"] diff --git a/packages/api/dev.Dockerfile b/packages/api/dev.Dockerfile index 54a3f3f..2a8429c 100644 --- a/packages/api/dev.Dockerfile +++ b/packages/api/dev.Dockerfile @@ -18,4 +18,4 @@ ENV HOST=0.0.0.0 PORT=8000 DEBUG=true EXPOSE 8000 -CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload", "--log-level", "info"] +CMD ["uvicorn", "api.main:app_factory", "--factory", "--host", "0.0.0.0", "--port", "8000", "--reload", "--log-level", "info"] diff --git a/packages/api/run_server.py b/packages/api/run_server.py index 7f44bc4..9be3f8d 100644 --- a/packages/api/run_server.py +++ b/packages/api/run_server.py @@ -11,17 +11,21 @@ host = os.getenv("HOST", "127.0.0.1") port = int(os.getenv("PORT", "8000")) debug = os.getenv("DEBUG", "false").lower() == "true" + workers = int(os.getenv("API_WORKERS", "4")) print(f"Starting Shelly Manager API on {host}:{port}") print(f"Debug mode: {debug}") + print(f"Workers: {1 if debug else workers} ({'reload mode' if debug else 'multi-worker'})") print(f"OpenAPI docs: http://{host}:{port}/docs") print(f"OpenAPI JSON: http://{host}:{port}/openapi.json") print(f"Health check: http://{host}:{port}/api/health") uvicorn.run( - "api.main:app", + "api.main:app_factory", host=host, port=port, + factory=True, + workers=1 if debug else workers, reload=debug, log_level="info" if not debug else "debug", ) diff --git a/packages/api/src/api/main.py b/packages/api/src/api/main.py index 8147f56..1cd90cd 100644 --- a/packages/api/src/api/main.py +++ b/packages/api/src/api/main.py @@ -93,3 +93,6 @@ async def lifespan(app: Litestar) -> AsyncGenerator[None, None]: app = create_app() + +def app_factory() -> Litestar: + return create_app()