Почему не работает статика в Django?
При рендеринге страницы почему-то не работает статика (css, js) в django
. Я запускаю проект через docker
контейнеры. Однако, даже не отображается html код на странице, не говоря уже про стили. Вроде бы монтирую все файлы правильно, но всё равно белый экран, не понимаю в чём проблема.
Работаю по такой логике:
- Собираю статику
python3 manage.py collectstatic
локально. - Статика сохраняет в папку
staticfiles
в корневую папку проекта (внутри стили для admin и для сайта непосредственно). - Далее в
docker-compose.yml
монтирую ВСЕ файлы в контейнер cdjango
, а в контейнере сnginx
монтирую статику из контейнера сdjango
внутрь контейнераnginx
в определенную папку. - Прописыаю путь в
default.conf
в nginx. - Запускаю
docker compose up -d
, захожу внутрь каждого контейнераdocker exec -it <id> bash
и вроде бы всё в порядке, то есть в контейнере сdjango
статика есть, а также в контейнереnginx
статика тоже есть (пути с кодом ниже), однако всё равно пустая страница (белый фон).Nginx
самостоятельно умеет отдавать статику, однако что-то неверно я сделал на каком-то этапе ранее.
Dockerfile
# Создаем кастомный image для Django.
# Кастомный, так как нам надо перекинуть локальные файлы в образ.
# Для PostgreSQL мы возьмем готовый образ и соберем его сразу в docker-compose.yml.
# Docker-compose.yml файл, при помощи которого мы объединяем images и создаем полный сервис для Docker.
# копируем готовый образ python из dockerhub
FROM python:3.10.0-alpine
# установка необходимых пакетов для работы с MongoDB
RUN apk add --no-cache gcc musl-dev libffi-dev \
&& apk add --no-cache jpeg-dev zlib-dev \
&& apk add --no-cache bash \
&& apk add --no-cache mariadb-dev \
&& apk add --no-cache libpq
# устанавливаем рабочую директорию внутри docker контейнера
WORKDIR /website
# копируем файлы зависимостей и проекта Django в образ
COPY requirements.txt .
# устанавливаем зависимости для проекта, не кешируя их
RUN pip install -r requirements.txt --no-cache-dir
# устанавливаем порт, на котором будет работать Docker
EXPOSE 8000
# в рабочую директорию копируем папку с Django вне контейнера
COPY website .
# cобираем статику для Django
RUN python3 manage.py collectstatic --no-input
# запускаем через uwsgi
CMD [ "uwsgi", "--ini", "/website/uwsgi.ini" ]
docker-compose.yml
version: '3.8'
services:
django:
build:
context: .
volumes:
- "./website:/website"
depends_on:
- mongo
mongo:
image: mongo:6.0.3
container_name: mongodb
volumes:
- mongodb_data:/data/db/
ports:
- "27017:27017"
restart: always
environment:
- MONGODB_NAME=production_database
- MONGODB_USER=manager
- MONGODB_PASSWORD=123qwe
nginx:
image: nginx:latest
container_name: nginx_django
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/default.conf:/etc/nginx/conf.d/default.conf"
- "./website/staticfiles:/etc/nginx/website/staticfiles"
ports:
- "8080:8080"
depends_on:
- django
volumes:
mongodb_data:
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/uwsgi_params;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
}
default.conf
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://django:8000;
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-CSRFToken $cookie_csrftoken;
}
location /admin/ {
proxy_pass http://django:8000/admin/;
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;
}
location /static/ {
autoindex on;
alias /etc/nginx/website/staticfiles/;
}
}
Пути
- К статике локально:
/Users/nnhufg/Desktop/ArtemSheptalin/website/staticfiles
- Внутри контейнера джанго:
/website/staticfiles
- Внутри контейнера nginx:
/etc/nginx/website/staticfiles
И ввроде бы всё правильно и логично, то не работает. Стоит отметить, как только я удаляю строку <link rel="stylesheet" href="{% static 'css/main.min.css' %}" />
в base.html
, то появляется хотя бы html
на странице...