Nginx не видит статические файлы при запуске с помощью docker compose +gunicorn

Дело в том, что я настроил dockerfiles, docker-compose все работает как надо. Базы данных подключены и весь персонал. Но единственная проблема в том, что я не могу загрузить staticfiles. Gunicorn сообщает, что файлы "Не найдены" как admin, так и статические файлы rest_framework. Когда я делаю "docker-compose up", он говорит, что `0 статических файлов были скопированы в '/static', 165 немодифицированных

На данный момент я проверил пути, которые настроены в STATIC_ROOT и STATIC URL. Также я изменил файл docker-compose:

version: '3.11'

services:
  django_gunicorn:
    volumes:
      - static:/static/
    env_file:
      - .env
    build:
      context: .
    ports:
      - "8000:8000"
  nginx:
    build: ./nginx
    volumes:
      - static:/static/
    ports:
      - "80:80"
    depends_on:
      - django_gunicorn
      - db
  db:
    image: postgres
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
volumes:
  static:

Также я проверил конфигурационный файл nginx еще раз:

upstream django {
    server django_gunicorn:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://django;
    }
    location /static/ {
        autoindex on;
        alias /static/;
    }
}

Я также пробовал разные подходы к настройке root и url staticfiles, но пока оставил так:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Также были предложения сначала запустить "collectstatic", что я уже сделал, но никакого эффекта, поэтому я пока удалил папку static, потому что я не видел папку static и в других приложениях.

точка входа/sh

#!/bin/sh

python manage.py migrate --no-input
python manage.py collectstatic --no-input

gunicorn config.wsgi:application --bind 0.0.0.0:8000

Nginx должен сопоставить STATIC_URL с STATIC_ROOT с учетом сопоставления томов в docker-compose.

docker-compose отображение тома для Nginx:

- static:/static/

виртуальный том "static" в корневой каталог /static/

Nginx location

location /static/ {
    autoindex on;
    alias /static/;
}

Сопоставляет STATIC_URL = /static/ с каталогом внутри контейнера nginx /static/, который соответствует docker-compose volume mapping, о котором мы только что говорили. Расположение должно соответствовать STATIC_URL, потому что Django генерирует эти URL и использует STATIC_URL, поэтому URL статических файлов будут начинаться с STATIC_URL, и чтобы поймать эти URL, nginx должен использовать то же расположение. Но значение алиаса не должно совпадать с STATIC_ROOT, потому что мы "доставляем" статические файлы в nginx через отображение виртуального тома в docker-compose и они (статические файлы) появятся для nginx именно там, где мы им скажем - - static:/static/ - nginx container увидит их по /static/ пути. Настройки Django не влияют на этот путь.

проект Django образ docker

COPY ./backend /app

что означает, что BASE_DIR внутри контейнера будет /app и это именно то, что collectstatic сообщает вам: '165 static files copied to '/app/static'

Теперь нам нужно поделиться этими файлами с nginx через виртуальный том, отобразив виртуальный том на каталог внутри контейнера проекта django с собранными статическими файлами. Статические файлы были собраны в каталог /app/static. Виртуальный том, совместно используемый с nginx - static, поэтому

docker-compose отображение тома для проекта Django

- static:/app/static/

enter image description here

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