Здравствуйте!

Хочу представить вам пошаговую инструкцию по деплою django проекта.

Сра��у скажу, что используя мою краткую инструкцию вы не поймете механику развертывания. По сути, это просто список команд для деплоя. Тут не будет никаких подробностей касательно работы UWSGI, NGINX и самого Django. Я просто помогу быстро добраться до цели, а цель у нас одна - задеплоить уже наконец этот **** проект!

(Инструкция тестировалась на VPS Ubuntu 20.04 с Django 3.2.8, python3.8, NGINX 1.18.0, UWSGI 2.0.20)

Заходим в консоль линукс сервера и вперед!

sudo apt update
sudo apt upgrade
sudo apt-get install nginx uwsgi
sudo apt-get install uwsgi-plugin-python3

Переходим в директорию /var

cd /var

Создаем себе внутри папку для дальнейшей работы

mkdir work
cd work

Создаем папку под статику и предоставляем пользователю www-data права на неё. (UWSGI и NGINX будут работать от лица www-data)

mkdir static
chown www-data /var/work/static

Проверим версию пайтона, установим пакет для вирт. окружения и создадим его
python3 -V
sudo apt install python3.8-venv
python3 -m venv venv

Активируем окружение

. ./venv/bin/activate

pip install django (и другие или загрузите их позже из requirements.txt)

git clone https://github.com/nick_name/project.git (или переместите в текущую папку ваш проект любым другим способом)

(В инструкции я использую проект со стандартной архитектурой вида:

projectname/
...
manage.py
projectname/
...
settings.py
wsgi.py
...

)

Переходим в файл settings.py вашего проекта джанго и редактируем его.

Необходимо добавить ip вашего сервера в ALLOWED_HOSTS должно получиться что-то вроде ['1.1.1.1', '127.0.0.1']
добавить STATIC_ROOT = '/var/work/static'

Вернитесь в папку с manage.py
cd /var/work/имя вашего проекта

Далее подготовим сам Django проект. Проведем миграции и соберем статику в папку, которую мы ранее создали в work.

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py collectstatic
python3 manage.py runserver

Если есть ошибка в проекте - устранить, если не хватает библиотек - установить через pip install

Если ошибок не возникло - ваш Django проект в порядке, если нет, то исправляйте ошибки в нем. Советую сверить ту ли версию Django вы поставили себе на сервер.

Близимся к концу. Виртуальное окружение можно выключить. Сделаем это командой:

deactivate

Далее откроем файл nginx.conf и проверим в нем параметр user, он должен быть www-data.

user www-data;

nano /etc/nginx/nginx.conf

далее создадим и заполним конфиг my_app (для nginx)

nano /etc/nginx/sites-enabled/my_app

server {
    listen 81;
    server_tokens off;
    server_name 0.0.0.0;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///run/uwsgi/app/myapp/socket;
    }

   
    location /static/ {
        alias /var/work/static/;
    }

}

далее создадим и заполним конфиг myapp.ini (для uwsgi)

[uwsgi]
chdir = /var/work/projectname
env = DJANGO_SETTINGS_MODULE = projectname.settings
wsgi-file = /var/work/projectname/projectname/wsgi.py
workers = 1
max-requests = 5000
plugins = python3
home = /var/work/venv
pythonpath = /var/work/venv/lib/python3.8/site-packages
processes = 5
threads = 2
master = true
die-on-term = true
socket = /run/uwsgi/app/myapp/socket
chmod-socket = 664
vacuum = true
uid = www-data
gui = www-data

!!! Я использую python3 (3.8) если у вас другой, то измените пункты, связанные с python
Или используйте версию 3.8)) !!!

projectname ВЕЗДЕ измените на имя вашего проекта

далее перезапустим uwsgi и nginx

service uwsgi restart
service nginx restart

После перезапуска nginx и uwsgi сайт должен быть доступен по адресу http://IP вашего сервера:81

ГДЕ СМОТРЕТЬ ЛОГИ?
/var/log/nginx
/var/log/uwsgi/app

Надеюсь, это вам помогло. В интернете ничего из того, что я смотрел не работало "из коробки". Каждый раз возникала ошибка то тут, то там.. Ну или это была огромная "простыня" текста, читать которую было слишком долго. Да и после стольких ошибок не было доверия к тем или иным туториалам.

Составив эту инструкцию я создал несколько новых серверов на Ubuntu и протестировал каждый шаг.

Буду рад комментариям. Пишите, если у вас возникли какие-то ошибки!