Python Django OSError: [Errno 99] Адрес недоступен

Я создаю приложение с Django Rest Framework и борюсь со странной проблемой, которая возникает при отправке электронной почты с помощью Djoser. Когда я пытаюсь воспроизвести эту ошибку на хост-машине внутри контейнера Docker в производственной среде, у меня не возникает никаких ошибок, все сообщения электронной почты отправляются успешно, однако когда я пытаюсь сделать это на производственном сервере под Docker, я получаю OsError, вот полный трассировщик:

Вот мой docker-compose.yaml:

version: '3.8'

services:
  # PostgreSQL
  db:
    image: postgres:12.18-alpine
    restart: always
    networks:
      - backend-network
    env_file:
      - .env
    expose:
      - '5432'
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 3s
      retries: 3

  # BackEnd
  backend:
    build:
      context: .
      target: prod
    networks:
      - backend-network
    ports:
      - '8000:8000'
    env_file:
      - .env
    volumes:
      - .:/backend
    restart: always
    depends_on:
      db:
        condition: service_healthy

networks:
  backend-network:
    driver: bridge

volumes:
  db_data:

Настройки для SMTP-сервера:

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = env("EMAIL_HOST")
EMAIL_USE_TLS = True
EMAIL_PORT = env("EMAIL_PORT")
EMAIL_HOST_USER = env("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD")

Я уверен, что нет никаких проблем с SMTP сервером, который я использую, так как на моем компьютере он работает нормально, письма отправляются. Также, когда я пытаюсь пинговать SMTP сервер из Docker контейнера на рабочем сервере, я получаю несколько байт, полученных от него. Также я думаю, что эта проблема не связана с Djoser.

Я не могу решить эту проблему уже несколько дней и понятия не имею, что идет не так. Буду очень благодарен за любую помощь

Сообщение об ошибке [Errno 99] Address not available указывает на то, что приложение Django, запущенное внутри вашего контейнера Docker, не может установить сетевое соединение с SMTP-сервером, который вы настроили. Хотя сервер кажется достижимым с вашей машины разработки и потенциально пингуемым из контейнера, возможно, существует разница в конфигурации, вызывающая проблемы в Docker.

Некоторые потенциальные решения:

  1. Проверьте сеть Docker: Убедитесь, что служба backend в вашем docker-compose.yaml имеет доступ к сети, в которой находится SMTP-сервер. По умолчанию Docker создает мостовую сеть для сервисов в одном docker-compose.yaml файле. Если SMTP-сервер находится в отдельной сети, вам может потребоваться настройка пользовательской сети или использование методов разрешения имен хостов.

  2. Проверьте разрешение DNS: Внутри контейнера Docker попробуйте разрешить имя хоста SMTP-сервера с помощью ping <SMTP_server_hostname>. Если имя хоста не преобразуется в IP-адрес, возможно, ваш контейнер использует другой DNS-сервер, чем ваша машина для разработки. Вы можете попробовать указать пользовательский DNS-сервер в docker-compose.yaml для внутреннего сервиса.

  3. Проверьте переменные окружения: Дважды проверьте, что файл .env правильно смонтирован в вашей docker-compose.yaml службе бэкенда. Убедитесь, что переменные окружения (EMAIL_HOST, EMAIL_PORT и т. д.) правильно установлены в файле .env и доступны внутри контейнера. Вы можете проверить их с помощью print(os.environ.get('EMAIL_HOST')) внутри вашего Django-приложения.

  4. Проверьте SMTP-соединение вручную: Вместо того, чтобы полагаться на Djoser для отправки писем, попробуйте явно создать объект электронной почты и отправить его с помощью EmailMessage из модуля django.core.mail Django. Это поможет определить, в чем проблема - в Djoser или в базовом SMTP-соединении.

  5. Сет

ь
Вернуться на верх