From 0f8d816e7f5f6bdeb4c624531fa8c7476d2e15c3 Mon Sep 17 00:00:00 2001 From: "MH.Dmitrii" Date: Thu, 13 Aug 2026 19:30:55 +0300 Subject: [PATCH] feature gunicorn startup --- docker/compose-dev.yaml | 22 +++++++++++++++++++--- docker/dockerfile | 10 +++++++--- docker/entrypoint.sh | 41 +++++++++++++++++++++++++++++++++++++++++ main.py | 22 ++++++++++++---------- 4 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 docker/entrypoint.sh diff --git a/docker/compose-dev.yaml b/docker/compose-dev.yaml index 5d50785..674ee9c 100644 --- a/docker/compose-dev.yaml +++ b/docker/compose-dev.yaml @@ -24,13 +24,20 @@ services: - type: bind source: ../DB target: /home/excel-project/DB + - type: bind + source: ../upload + target: /home/excel-project/upload + - type: bind + source: ../upload_bad + target: /home/excel-project/upload_bad + - type: bind + source: ../upload_finished + target: /home/excel-project/upload_finished networks: - backend ports: - "80:8000" - entrypoint: - - python3 - - main.py + entrypoint: ["./entrypoint.sh", "--dev"] backend-prod: profiles: ["prod"] @@ -49,6 +56,15 @@ services: - type: bind source: ../DB target: /home/excel-project/DB + - type: bind + source: ../upload + target: /home/excel-project/upload + - type: bind + source: ../upload_bad + target: /home/excel-project/upload_bad + - type: bind + source: ../upload_finished + target: /home/excel-project/upload_finished networks: - backend restart: unless-stopped diff --git a/docker/dockerfile b/docker/dockerfile index 3bb77ea..36e24b2 100644 --- a/docker/dockerfile +++ b/docker/dockerfile @@ -6,7 +6,9 @@ LABEL org.opencontainers.image.source="https://git.homyk.space/MH.Dmitrii/The_Gr WORKDIR /home/excel-project -COPY pyproject.toml poetry.lock ./ +COPY pyproject.toml poetry.lock docker/entrypoint.sh ./ + +RUN chmod +x ./entrypoint.sh RUN pip install --no-cache-dir --break-system-packages poetry \ && poetry config virtualenvs.create false \ @@ -21,9 +23,11 @@ LABEL org.opencontainers.image.source="https://git.homyk.space/MH.Dmitrii/The_Gr WORKDIR /home/excel-project -COPY pyproject.toml poetry.lock main.py ./ +COPY pyproject.toml poetry.lock main.py docker/entrypoint.sh ./ COPY src/ ./src/ +RUN chmod +x ./entrypoint.sh + RUN pip install --no-cache-dir --break-system-packages poetry \ && poetry config virtualenvs.create false \ && poetry install --no-root --no-interaction --only main @@ -34,4 +38,4 @@ RUN groupadd --gid 1000 appuser \ USER appuser -ENTRYPOINT ["python3", "main.py"] +ENTRYPOINT ["./entrypoint.sh", "--prod"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000..dffbbed --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +MODE="" +WORKERS="" + +while [ -n "$1" ]; do +case "$1" in + --dev) MODE="dev" ;; + --prod) MODE="prod" ;; + --workers) + shift + WORKERS="$1" + ;; + *) echo "$1 is not an option" ;; +esac +shift +done + +if [ -z "$MODE" ]; then + echo "Usage: entrypoint.sh --dev|--prod [--workers N]" + exit 1 +fi + +if [ "$MODE" = "dev" ]; then + WORKERS="${WORKERS:-1}" + exec gunicorn \ + --workers "$WORKERS" \ + --worker-class uvicorn.workers.UvicornWorker \ + --worker-connections 1000 \ + --reload \ + --bind 0.0.0.0:8000 \ + main:app +else + WORKERS="${WORKERS:-4}" + exec gunicorn \ + --workers "$WORKERS" \ + --worker-class uvicorn.workers.UvicornWorker \ + --worker-connections 1000 \ + --bind 0.0.0.0:8000 \ + main:app +fi \ No newline at end of file diff --git a/main.py b/main.py index f7634b0..de56560 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ +from contextlib import asynccontextmanager from pathlib import Path -import uvicorn +# import uvicorn from fastapi import FastAPI from src.web.protected_routes.auth_routes import router as protected_router @@ -8,7 +9,15 @@ from src.web.protected_routes.protected_user_action_routes import ( router as protected_user_action_routes, ) -app=FastAPI(root_path="/") + +@asynccontextmanager +async def lifespan(app: FastAPI): + create_dirs() + yield + print("shutting down") + + +app=FastAPI(root_path="/", lifespan=lifespan) app.include_router(router=protected_router) app.include_router(router=protected_user_action_routes) @@ -26,11 +35,4 @@ def create_dirs(): "./upload_finished") for x in dirs_to_create: - Path(x).mkdir(parents=True, exist_ok=True) - -def main(): - create_dirs() - uvicorn.run("main:app", host="0.0.0.0", reload=True) - -if __name__=="__main__": - main() \ No newline at end of file + Path(x).mkdir(parents=True, exist_ok=True) \ No newline at end of file