Абсолютный путь? `upload_to` из models.FileFIeld

У меня есть FileField в models.py

class DocFile(models.Model):
    document = models.FileField(upload_to='_mat/')

Хорошо работает для локальной сети (mac), и файл хранится под /Users/whitebear/myproj/_mat/

Однако я делаю то же самое на сервере (Ubuntu 20, использую ENGINX-unit)

Выдает ошибку PermissionError: [Errno 13] Permission denied: '/_mat'

Но, /var/www/html/myproj/_mat/ разрешение 777

Полагаю, что каким-то образом он пытается сделать /_mat абсолютным путем...????

Если я устанавливаю upload_to таким образом,

document =  models.FileField(upload_to='/var/www/html/myproj_mat/')

Здесь говорится об использовании "относительного пути"

Это трассировка стека ошибок.

Настройка MEDIA_ROOT [Django-doc] определяет:

Абсолютный путь файловой системы к каталогу, в котором будут храниться загруженные пользователем файлы.

Вы должны указать в этом параметре, где вы будете хранить медиафайлы. Если MEDIA_ROOT будет /, то он будет хранить их в /_mat/ директории сервера.

Таким образом, вы можете установить настройку MEDIA_ROOT на:

# settings.py

# ⋮,

MEDIA_ROOT = '/var/www/html/myproj/'

# ⋮

permission denied я думаю, что это происходит из-за файловой системы ubuntu. так что вы можете запустить

sudo chmod -R 755 /var/www/html/myproj/_mat/

и лучше также сделать пользователя Nginx таким же, как gunicorn и дать этому пользователю доступ к вашим носителям как показано ниже, пусть ваш пользователь будет user1

sudo chown -R user1:user1 /var/www/html/myproj/_mat/

Вернуться на верх