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.