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