# 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).
