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, то получим ошибку.