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

Nginx

Nginx будет использоваться в качестве обратного прокси сервера для сервера приложений 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"

  nginx:
    build: nginx
    ports:
      - 127.0.0.1:8080:80
    depends_on:
      - web

volumes:
  postgres_data:

В коде выше мы открываем стандартный 80й порт для посетителей сайта, который будет перенаправлять пакеты на 80й порт контейнера nginx. Вы можете изменить 80й порт на любой другой. А у контейнера web мы закрываем порты.


Создадим папку nginx, в которой будут хранится конфигурационный файл fastapi_ecommerce.conf и файл Dockerfile.


В файл fastapi_ecommerce.conf добавим следующий код:

upstream fastapi_ecommerce {
    # Список бэкэнд серверов для проксирования
    server web:8000;
}

server {
    listen 80;
    # Ваш домен
    server_name 127.0.0.1;
    # Параметры проксирования
    location / {
        # Если будет открыта корневая страница
        # все запросу пойдут к одному из серверов
        # в upstream htmx_book
        proxy_pass http://fastapi_ecommerce;
        # Устанавливаем заголовки
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        # Отключаем перенаправление
        proxy_redirect off;
    }

}


Что бы файл конфигурации попал в контейнер мы должны создать отдельный Dockerfile:

FROM nginx:1.25

RUN rm /etc/nginx/conf.d/default.conf
COPY fastapi_ecommerce.conf /etc/nginx/conf.d/


После создания контейнера Nginx, мы закроем прямой доступ к контейнеру с FastAPI через 8000й порт. К контейнеру с FastAPI будет разрешено обращаться  только сервисам Docker.

Запустим контейнеры еще раз и убедимся, что они работают:

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

Обратите внимание, что у нас был создан и запущен еще один контейнер с Nginx:

Выполним миграции:

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

Если мы перейдем по адресу http://127.0.0.1/docs (если порт не указан, используется 80й порт), то мы увидим что наш проект работает, а если перейдем по прежнему адресу http://127.0.0.1:8000/docs, то получим ошибку.


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