uchill/docker/STATIC_MEDIA_README.md

86 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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