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.
Некоторые потенциальные решения:
Проверьте сеть Docker: Убедитесь, что служба
backend
в вашемdocker-compose.yaml
имеет доступ к сети, в которой находится SMTP-сервер. По умолчанию Docker создает мостовую сеть для сервисов в одномdocker-compose.yaml
файле. Если SMTP-сервер находится в отдельной сети, вам может потребоваться настройка пользовательской сети или использование методов разрешения имен хостов.Проверьте разрешение DNS: Внутри контейнера Docker попробуйте разрешить имя хоста SMTP-сервера с помощью
ping <SMTP_server_hostname>.
Если имя хоста не преобразуется в IP-адрес, возможно, ваш контейнер использует другой DNS-сервер, чем ваша машина для разработки. Вы можете попробовать указать пользовательский DNS-сервер вdocker-compose.yaml
для внутреннего сервиса.Проверьте переменные окружения: Дважды проверьте, что файл
.env
правильно смонтирован в вашейdocker-compose.yaml
службе бэкенда. Убедитесь, что переменные окружения (EMAIL_HOST
,EMAIL_PORT
и т. д.) правильно установлены в файле.env
и доступны внутри контейнера. Вы можете проверить их с помощьюprint(os.environ.get('EMAIL_HOST'))
внутри вашего Django-приложения.Проверьте SMTP-соединение вручную: Вместо того, чтобы полагаться на Djoser для отправки писем, попробуйте явно создать объект электронной почты и отправить его с помощью
EmailMessage
из модуляdjango.core.mail
Django. Это поможет определить, в чем проблема - в Djoser или в базовом SMTP-соединении.Сет