Docker nginx django gunicorn не обслуживает статические файлы в продакшене

Пытаюсь развернуть сайт с помощью nginx + gunicorn + docker + django. Но ngingx не обслуживает статические файлы. Ниже приведены конфигурации:

Структура проекта Django

enter image description here

файл настроек production.py

STATIC_URL = "/static/"

"""STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)"""


STATIC_ROOT = "/app/forex/static/admin/"

Файл докера для nginx

FROM nginx:1.19.0

COPY ./default.conf /etc/nginx/conf.d/default.conf

конфигурацииnginx

upstream django {
    server website:8000;
}

server {
    listen 80;
    
    client_max_body_size 100M;
    proxy_set_header X-Forwarded-Proto $scheme;

    location / {
        proxy_pass http://django;
    }
    
    location /media/ {
        alias /app/media/;
    }

    location /static/ {
        alias /app/forex/static/admin/;
    }
}

Докерный файл Gunicorn

FROM python:3


ADD requirements.txt /app/requirements.txt

ADD . /app
WORKDIR /app
EXPOSE 8000:8000

RUN pip install --upgrade pip && pip install -r /app/requirements.txt
RUN python manage.py collectstatic --no-input --settings=forex.settings.production

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "forex.wsgi:application", "DJANGO_SETTINGS_MODULE=forex.settings.production"]

docker-compose.yml

services:
    website:
        build:
          context: .
          dockerfile: Dockerfile.app
        env_file:
          - env
        container_name: website_container_8
    nginx:
        build: ./nginx
        volumes:
            - static:/app/forex/static/admin/
        ports:
            - "80:80"
        depends_on:
            - website
volumes:
  static:

ПЕРЕД контейнером nginx, он не копирует статические файлы. enter image description here

Что мне нужно изменить, чтобы это заработало?

Вы можете решить, как хранить статические файлы в продакшене. Например, Amazon S3 или CloudFront. Первое, что нужно сделать, это создать аккаунт в Amazon Web Services, затем перейти в службу хранения S3 и создать новый bucket, позже вы развернете активы в этом bucket.

После всех настроек измените файл settings.py:

settings.py

AWS_ACCESS_KEY_ID = '****'
AWS_SECRET_ACCESS_KEY = '****'
AWS_STORAGE_BUCKET_NAME = '****'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'yoursite/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Наконец, выполните:

python manage.py collectstatic

Вы можете изменить файл nginx.conf. Например:

user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;   


events {   
    use epoll;
    worker_connections 1024;  
    epoll_events        512;     
    accept_mutex on;     
    multi_accept on;
}

http {
    include  /etc/nginx/mime.types;
    default_type  application/octet-stream;
  upstream django {
      server web:8000;
    }

  server {
 listen 80;
 listen [::]:80;
 server_tokens off;
 client_max_body_size 20m; 
 server_name example.com www.example.com;

 return 301 https://$host$request_uri;
 
     }

    server {                 
      
     
        listen 443 ssl ;
        listen [::]:443 ssl;
        server_name example.com www.example.com;           

        
      
        
        
        root /app/static/;
        
        charset utf-8;         
        
            

        location /static/ {
       
        alias  /app/static/;
     

          }

       
    location /media/ {
        alias  /app/media/;
    }


    location / {
     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;
     proxy_set_header Host $http_host;
     proxy_set_header X-Nginx-Proxy true;
     proxy_http_version 1.1;
     proxy_redirect off;

     proxy_pass http://django;  
     
                    
  
 
    }

Последнее, вам следует пересмотреть dockerfile и удалить python manage.py collectstatic.

Ваши файлы находятся в контейнере вашего сайта, вам нужно поделиться ими с контейнером nginx:

services:
    website:
        build:
          context: .
          dockerfile: Dockerfile.app
        env_file:
          - env
        container_name: website_container_8
        volumes:
            - static:/app/forex/static/admin/ #<-- you want to share this
    nginx:
        build: ./nginx
        volumes:
            - static:/app/forex/static/admin/ #<-- with this folder
        ports:
            - "80:80"
        depends_on:
            - website
volumes:
  static: #<-- you can do it through this
Вернуться на верх