uchill/docker/STATIC_MEDIA_README.md

4.7 KiB
Raw Permalink Blame History

Static и Media — куда смотреть и как проверить

Как устроено

Папка Назначение
static Исходники: сюда кладёте свои CSS/JS; откуда collectstatic собирает.
staticfiles Сюда collectstatic собирает всё (admin, rest_framework, ваши static). Отсюда отдаём по URL /static/.

Смотреть нужно на staticfiles — это и есть каталог, из которого раздаются статические файлы. Папка static только для исходников перед сборкой.

Где что лежит в Docker

  • Контейнер web (Django):
    STATIC_ROOT = /app/staticfiles → это volume static_volume.
    Сюда при старте выполняется collectstatic.

  • Контейнер nginx:
    Тот же volume смонтирован как /var/www/static.
    Запросы http://localhost/static/... отдаются из этого каталога.

  • Медиа:
    Загрузки пользователей → media_volume → в web это /app/media, в nginx — /var/www/media, URL /media/.
    Раздача: nginx (порт 80) и своя view serve_media при обращении к Django (порт 8123).

Проверка, что static работают

# 1. Пересобрать static вручную (если что-то не подтянулось)
docker compose exec web python manage.py collectstatic --noinput --verbosity 2

# 2. В контейнере web должны быть файлы (admin, rest_framework и т.д.)
docker compose exec web ls -la /app/staticfiles

# 3. В nginx тот же volume — те же файлы
docker compose exec nginx ls -la /var/www/static

# 4. Проверка по HTTP (через nginx, порт 80)
curl -I http://localhost/static/admin/css/base.css

# 5. Напрямую Django (порт 8123) — раздаёт WhiteNoise при DEBUG=False
curl -I http://localhost:8123/static/admin/css/base.css

Если шаги 2 и 3 показывают одни и те же каталоги (admin, rest_framework и т.д.), а 4 или 5 возвращают 200 — static настроены верно.

Порт 8123: при DEBUG=False Django сам не отдаёт static (встроенный serve() отключён). Для раздачи при прямом обращении к backend подключён WhiteNoise (middleware), поэтому http://localhost:8123/static/... тоже работает.

Если ничего не работает

  1. Убедиться, что запрос идёт на тот хост/порт, где раздаётся backend:

  2. Посмотреть логи web при старте — там должен быть вывод collectstatic без ошибок:

    docker compose logs web
    
  3. Не удаляли ли тома с docker compose down -v — тогда volume пустой, нужно заново поднять контейнеры и дать выполниться collectstatic.


Media (загрузки пользователей)

Медиа раздаются так же с двух точек:

  • Порт 80 (nginx): http://localhost/media/..., http://api.localhost/media/... — nginx отдаёт из /var/www/media (volume).
  • Порт 8123 (Django): http://localhost:8123/media/... — view serve_media отдаёт из MEDIA_ROOT (тот же volume в контейнере web).

Проверка (после того как в приложении что-то загружено, например аватар):

# Содержимое media в контейнере web
docker compose exec web ls -la /app/media

# Тот же volume в nginx
docker compose exec nginx ls -la /var/www/media

# По HTTP (подставьте реальный путь к файлу из вывода выше)
curl -I http://localhost/media/...
curl -I http://localhost:8123/media/...

Загрузка файлов: сохраняется в MEDIA_ROOT (в Docker — в volume media_volume). Лимит размера запроса: nginx client_max_body_size 100M, Django FILE_UPLOAD_MAX_MEMORY_SIZE (по умолчанию 10 MB, задаётся через env).