4.7 KiB
Static и Media — куда смотреть и как проверить
Как устроено
| Папка | Назначение |
|---|---|
| static | Исходники: сюда кладёте свои CSS/JS; откуда collectstatic собирает. |
| staticfiles | Сюда collectstatic собирает всё (admin, rest_framework, ваши static). Отсюда отдаём по URL /static/. |
Смотреть нужно на staticfiles — это и есть каталог, из которого раздаются статические файлы. Папка static только для исходников перед сборкой.
Где что лежит в Docker
-
Контейнер web (Django):
STATIC_ROOT=/app/staticfiles→ это volumestatic_volume.
Сюда при старте выполняетсяcollectstatic. -
Контейнер nginx:
Тот же volume смонтирован как/var/www/static.
Запросыhttp://localhost/static/...отдаются из этого каталога. -
Медиа:
Загрузки пользователей → media_volume → в web это/app/media, в nginx —/var/www/media, URL/media/.
Раздача: nginx (порт 80) и своя viewserve_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/... тоже работает.
Если ничего не работает
-
Убедиться, что запрос идёт на тот хост/порт, где раздаётся backend:
- через nginx: http://localhost/static/... или http://api.localhost/static/...
- напрямую Django: http://localhost:8123/static/...
-
Посмотреть логи web при старте — там должен быть вывод
collectstaticбез ошибок:docker compose logs web -
Не удаляли ли тома с
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/...— viewserve_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).