86 lines
4.7 KiB
Markdown
86 lines
4.7 KiB
Markdown
# 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 работают
|
||
|
||
```bash
|
||
# 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:
|
||
- через nginx: **http://localhost/static/...** или **http://api.localhost/static/...**
|
||
- напрямую Django: **http://localhost:8123/static/...**
|
||
|
||
2. Посмотреть логи web при старте — там должен быть вывод `collectstatic` без ошибок:
|
||
```bash
|
||
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).
|
||
|
||
Проверка (после того как в приложении что-то загружено, например аватар):
|
||
|
||
```bash
|
||
# Содержимое 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).
|