7.7 Подготовка к деплою, Gunicorn и NGINX в Docker Compose
1 из 2 шагов пройден

Gunicorn

Gunicorn — это, главным образом, сервер приложений, использующий стандарт WSGI. Это означает, что Gunicorn может обслуживать такие приложения, как Flask и Django. Gunicorn сам по себе не совместим с FastAPI, поскольку FastAPI использует новейшую версию ASGI standard.

Но Gunicorn поддерживает работу в качестве менеджера процессов и позволяет пользователям указывать, какой конкретный класс рабочего процесса использовать. Затем Gunicorn запускал один или несколько рабочих процессов, используя этот класс.

А в Uvicorn есть рабочий класс, совместимый с Gunicorn.

Используя эту комбинацию, Gunicorn будет действовать как менеджер процессов, прослушивая порт и IP-адрес. И он будет передавать сообщение рабочим процессам, выполняющим класс Uvicorn.

И тогда рабочий класс Uvicorn, совместимый с Gunicorn, будет отвечать за преобразование данных, отправленных Gunicorn, в стандарт ASGI, чтобы FastAPI мог их использовать. Существует официальный образ Docker, включающий Gunicorn, работающий с рабочими процессами Uvicorn - tiangolo/uvicorn-gunicorn

Чтобы было удобно использовать образ для локальной разработки и для продакшена, создадим второй файл с названием docker-compose.prod.yml. Он будет аналогичен предыдущему образу за исключением нескольких моментов: 

services:
  web:
    # Берем Dockerfile из каталога app
    build:
      context: app
      dockerfile: Dockerfile.prod
    # Запускаем тестовый сервер
    command: uvicorn app.main:app --host 0.0.0.0
    # куда будут помещены данные из каталога app
    volumes:
      - .:/app
    # Открываем порт 8000 внутри и снаружи
    ports:
      - 8000:8000
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      POSTGRES_USER: "postgres_user"
      POSTGRES_PASSWORD: "postgres_password"
      POSTGRES_DB: "postgres_database"



volumes:
  postgres_data:

В этом файле мы добавили лишь только то, что будем использовать Dockerfile.prod, предназначенный для деплоя. В папке app создадим его:

FROM tiangolo/uvicorn-gunicorn:python3.11-slim


ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . /app/

На данный момент структура созданных файлов и папок следующая:


Выполним остановку предыдущих контейнеров, удалим их:

docker-compose down -v

Выполним билд нового контейнера для деплоя:

docker-compose -f docker-compose.prod.yml up -d --build

Выполним миграции, при которых будет создана структура нашей базы данных:

docker-compose -f docker-compose.prod.yml exec web alembic upgrade head

Теперь проверим работу, откроем в браузере http://127.0.0.1:8000/docs, мы видим что наш проект работает нормально и с сервером приложений uvicorn-gunicorn.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.