Как мне получить доступ к URL-адресу FastAPI из моего приложения докера?

У меня есть интерфейсное приложение, размещенное на субдомене (www.admin.example.com). У меня также есть серверное приложение, которое использует FastAPI для связи с интерфейсным приложением реагирования. Это серверное приложение развертывается с помощью Docker. Интерфейс создается с помощью команды npm run build и развертывается вручную, т. е. файлы сборки копируются в корневой каталог поддомена.

Однако у меня возникли проблемы с доступом к этому серверному приложению FastAPI, которое размещено с использованием Docker. Я пробовал использовать IP-адрес моего сервера + порт (https://server_ip_address:8000), но не получаю ответ по пути / от моего бэкэнда FastAPI. Этот URL-адрес (https://server_ip_address:8000) фактически не загружает страницу. Я получаю сообщение об ошибке: This site can’t be reached.

Но когда я захожу https://server_ip_address, я загружаю страницу, рассказывающую о nginx. Я проверил журналы докера, и приложение FastAPI не обнаружило ни ошибок, ни ответа. Мне сказали, что у докера тоже есть собственный IP-адрес, но я попробовал это, и это не сработало. Я также не могу получить доступ к URL-адресу, например https://server_ip_address:8000, из моего внешнего приложения, иначе я получаю ошибку политики CORS. Общий вопрос: как мне получить доступ к моему приложению FastAPI, прослушивающему докер?

Docker Создать файл:

services:
  db:
    build: .
    ports:
      - "8000:8000"
    expose:
      - "8000"
    secrets:
      - MONGODB_URI
      - LOGIN_SECRET_KEY

secrets:
  LOGIN_SECRET_KEY:
    file: admin_login_secret_key.txt
  MONGODB_URI:
    file: mongo_db_uri.txt

Докер-файл:

# Use an official Python runtime as a base image
FROM python:3.9

# Set the working directory in the container
WORKDIR /app

# Copy the dependencies file to the working directory
COPY requirements.txt .

# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy the content of the local src directory to the working directory
COPY . .

# Specify the command to run on container start
CMD ["uvicorn", "db:app", "--host", "0.0.0.0", "--port", "8000"]

Файл сервера nginx.conf (только настройки сервера)

server {
        listen 8080;
    server_name admin.example.com;

    location /backend/ {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Я пытался получить доступ таким образом https://admin.example.com:8080/backend, но он не перенаправляется на http://127.0.0.1:8000.

🤔 А знаете ли вы, что...
Python поддерживает многозадачность и многопоточность.


92
1

Ответ:

Решено

Пожалуйста, проверьте следующие возможные причины:

  • Вы неправильно настроили Nginx. Если вы хотите получить доступ к своему приложению FastAPI через IP-адрес и порт 80, вам необходимо настроить обратный прокси-сервер, сопоставляющий порт 80 с портом 8000.
  • Ваша политика безопасности ограничивает порт 8000. Таким образом, вы не можете получить доступ к порту 8000 извне. Вот почему https://ip_address:8000 не работает.

Несколько советов:

  • Настройте обратный прокси-сервер для своего бэкэнда вместо того, чтобы пытаться получить к нему доступ через IP-адрес и порт. Лично я помещу встроенный файл React в корень www и прокси /api на свой внутренний сервер.