Проблема статических файлов Nginx + Django

У меня возникла проблема с моим проектом. У меня все работает в проекте Django, когда DEBUG=True в settings.py. Но как только я меняю его на False, я получаю эту проблему, когда захожу на свой сайт (localhost): Сообщение об ошибке с localhost при DEBUG=False

Что, вероятно, означает, что либо мои статические файлы неправильно отправляются на мой Nginx, либо мой веб-сервер Nginx неправильно настроен на получение/использование моих статических файлов.

Вот docker-compose, который я использую:

version: '3.8'
services:
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
    restart: on-failure  # Ensures NGINX retries if it fails to start the first time

  migrations:
    build: .
    command: sh -c "python manage.py makemigrations && python manage.py migrate"
    depends_on:
      - db


volumes:
  postgres_data:

Докерфайл для моего проекта Django:

# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /app

# Install dependencies
COPY requirements.txt /app/
RUN pip install --upgrade pip && pip install -r requirements.txt

# Copy project
COPY . /app/

settings.py STATIC_FILES:

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    BASE_DIR / 'webapp' / 'static',
]

Nginx Dockerfile:

# Use the official NGINX image from Docker Hub
FROM nginx:1.21.6

# Remove the default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

# Copy the custom nginx.conf
COPY nginx.conf /etc/nginx/conf.d/

# Copy your SSL certificate and key
COPY certs/nginx-selfsigned.crt /etc/nginx/certs/
COPY certs/nginx-selfsigned.key /etc/nginx/certs/

Nginx.conf:

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;  # Redirect HTTP to HTTPS
}

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /etc/nginx/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/nginx/certs/nginx-selfsigned.key;

    location / {
        proxy_pass http://web:8000;  # Note: http not https
        proxy_set_header Host $host;
        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;
    }
}

Я застрял

на этом уже 3 дня, если у кого-то из вас есть идеи, пожалуйста, помогите, спасибо большое!

Я уже перепробовал множество различных способов переделать все мои Dockerfiles и .conf моего проекта, но, к сожалению, безуспешно.

При DEBUG=False Django не обслуживает статические файлы, как это происходит при DEBUG=True, поэтому вам придется взять это на себя.

Скорее всего, у вас 404 HTML-ответ, отсюда и ошибки.

Сначала соберите статические файлы:

python manage.py collectstatic

Попросить django собрать все статические файлы и поместить их в одну папку, которая будет использоваться NGinx для их обслуживания.

Затем обновите конфигурацию NGinx, чтобы обслуживать эти файлы:

server {
    listen 80;
    ...
    location /static/ {
        root /path/to/static;
    }
    ...
}
Вернуться на верх