Nginx + Django: ModuleNotFoundError: Нет модуля с именем 'app'

Я пытаюсь запустить мое приложение Django с Nginx и Gunicorn в Docker

В журналах docker compose у меня следующая ошибка: (полный лог: https://pastebin.com/EXd3Bsii)

File "/usr/local/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
django_1  |     mod = importlib.import_module(module)
django_1  |   File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
django_1  |     return _bootstrap._gcd_import(name[level:], package, level)
django_1  |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
...
django_1  |   File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
django_1  | ModuleNotFoundError: No module named 'app'

Как я могу решить проблему?

Нужно ли указывать конфигурацию wsgi?

Мой код wsgi,py

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'potok.settings')
application = get_wsgi_application()

nginx-conf.conf

upstream app {
    server django:8000;
}

server {
    listen:80;
    server_name: localhost;

    location / {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect_off;
    }

    location /staticfiles/ {
        alias /var/www/html/staticfiles/;
    }
}

docker-compose.yml

version: '3.9'

services:
  django:
    build: . # path to Dockerfile
    command: sh -c "gunicorn --bind 0.0.0.0:8000 app.wsgi"
    volumes:
      - .:/project
      - static_data:/project/static
    expose:
      - 8000
    environment: 
      - DATABASE_URL=postgres://postgres:XXXXXXXXX@localhost:5432/lk_potok_2"
      - DEBUG=1
  ...
  
  nginx:
    image: nginx:1.19.8-alpine
    depends_on: 
      - django
    ports: 
      - "80:80"
    volumes:
      - static_data:/var/www/html/static
      - ./nginx-conf.d:/etc/nginx/conf.d

volumes:
    pg_data:
    static_data:

Ваш nginx.conf имеет проблему: proxy_pass http://django:8000;

upstream app {
    server django:8000;
}

server {
    listen:80;
    server_name: localhost;

    location / {
        proxy_pass http://django:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect_off;
    }

    location /staticfiles/ {
        alias /var/www/html/staticfiles/;
    }
}

Nginx и django находятся в одной сети, nginx может получить доступ к экземплярам django, созданным gunicorn, используя имя контейнера и порт, к которому guniconr привязывает рабочих.

А также вам нужно изменить docker-compose.yaml. Gunicorn не может получить доступ к приложению, потому что вы назвали его application, а не app.

version: '3.9'

services:
  django:
    build: . # path to Dockerfile
    command: sh -c "gunicorn --bind 0.0.0.0:8000 wsgi:application"
    volumes:
      - .:/project
      - static_data:/project/static
    expose:
      - 8000
    environment:  
Вернуться на верх