Меня долго мучило: локально картинки грузятся, на сервере — пусто. Оказалось, дело в двух «мирах»: static (файлы приложения, собираются при деплое) и media (загрузки пользователей, живут где-то связанном извне). Путать их — источник «всё работало, а тут пропало».

Нейтрально: MEDIA_ROOT хранит загруженные файлы (из ImageField), и для прода важно смонтировать их так, чтобы пережили пересборку контейнера.

# settings
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

# модель
class Photo(models.Model):
    image = models.ImageField(upload_to="photos/")

Когда разложил static/media по ролям, ночная «как чинить деплой» ушла. Из тех тем, что джун обходит, пока не обожжётся на реальном диплее.