Администрирование

Деплой проекта Django на VDS-сервере с Ubuntu

Деплой Django-проекта на VDS-сервере с Ubuntu — это важный процесс, который требует внимательного выполнения всех шагов. От установки нужных версий Python и PostgreSQL до настройки Nginx и Supervisor — каждый этап играет ключевую роль в обеспечении стабильной работы вашего приложения. В этой статьи мы рассмотрим пошаговую инструкцию, которая поможет развернуть проект Django на удалённом сервере.

Шаги по деплою:

1. Установим git:

apt install git

2. Установим нужную версию Python 3 по нашей статье  "Деплой бота на VDS-сервере с Ubuntu" (раздел установки Python)

3. Установим pip3, venv по нашей статье "Деплой бота на VDS-сервере с Ubuntu" (раздел установки pip3, venv)

4. Установим Postgres по статье "Как установить PostgreSQL" и создим БД по статье "Создание базы данных в PostgreSQL под Ubuntu". Пользователь, пароль и имя БД должны быть прописаны в секретном файле, как вариант в .env (требуется установка python-dotenv). файл с секретными данными должен быть импортирован в основной файл настроек Django. Данный файл ни в коем случае нельзя пушить в github, он должен быть прописан в gitignore. Если в проекте используется БД SQlite, то данный шаг можно пропустить.

5. Установим nginx:

apt install nginx

6. Установим supervisor:

apt install supervisor

7. Создадим нового пользователя по статье "Деплой бота на VDS-сервере с Ubuntu", раздел создание пользователя.

8. Войдем под новым пользователем.

9. Создадим ключ для нашего пользователя по статье "Как настроить SSH-ключ для GitHub". Создание ключа необходимо выполнить через sudo или дать необходимые права пользователю.

10. Склонируем репозиторий.

11. Проверим права на папку проекта:

ls -ld /home/User/<project_folder>

Если вы видите, что владелец папки отличается от созданного пользователя, используйте команду chown для изменения владельца:

sudo chown -R User:User /home/User/project_folder

Создадим venv по статье "Деплой бота на VDS-сервере с Ubuntu" (раздел установки venv). Виртуальную среду обязательно активируем, пример активации:

source .venv/bin/activate

12. Установим все зависимости:

pip3 install -r requirements.txt

13. Выполним команду:

python3 manage.py migrate

14. Выполним сборку статики:

python3 manage.py collectstatic

15. На этом шаге можно тестово запустить проект через стандартный сервер разработки, пример:

python3 manage.py runserver <ip>:8000

Или в режиме DEBUG = False со статикой, в настройках должно быть DEBUG = False.

python3 manage.py runserver <ip>:8000 --insecure

16. Ставим uvicorn:

 pip3 install uvicorn 

17. Создадим суперпользователя:

python3 manage.py createsuperuser

18. Проверим uvicorn с Django.

python3 -m uvicorn <name_app_core>.asgi:application --uds /tmp/name.sock

На этом шаге не должно быть ошибок. Если ошибки создаем папку mkdir ~/uvicorn_sockets, даем права chmod 777 ~/uvicorn_sockets и выполняем команду повторно.

19. Настроим supervisor:

sudo nano /etc/supervisor/supervisord.conf

И отредактируем конфигурацию: 

[program:config_name]
command = /home/user/<folder_project>/venv/bin/python3 -m uvicorn <name_app_core>.asgi:application --uds /tmp/<name>.sock
directory = /home/user/<folder_project>
stderr_logfile=/var/log/long.err.log
stdout_logfile=/var/log/long.out.log
autostart=true
autorestart=true

20. После добавления новой конфигурации необходимо перезагрузить Supervisor для применения изменений. Выполним следующие команды:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart all

21. Настроим nginx:

Создадим бэкап файла настроек по умолчанию:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default-backup

Переименуем текущий файл

sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/my-domain

Или можем создать новый файл конфигурации командой:

sudo nano /etc/nginx/sites-available/my-domain

Пример конфигурации:

server {
    listen 80;
    server_name www.exemple.ru exemple.ru;
    return 301 https://exemple.ru$request_uri;
}

server {
    listen 80;
    server_name exemple.ru;

    # error_page 403 404 /path/to/your/error_page;

    client_max_body_size 10M;  # Ограничение максимального размера тела запроса

    location /static/ {
        alias /home/User/<project_folder>/staticfiles/;
    }

    location /media/ {
        alias /home/User/<project_folder>/media/;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_buffering off;
        proxy_pass http://uvicorn_<your_name>;
    }
}

upstream uvicorn_<your_name> {
    server unix:/tmp/name.sock;
}

Если у нас есть символическая ссылка на старый файл в директории /etc/nginx/sites-enabled/, удалим её:

sudo rm /etc/nginx/sites-enabled/default

Теперь создим новую символическую ссылку с новым именем:

sudo ln -s /etc/nginx/sites-available/my-domain /etc/nginx/sites-enabled/my-domain

Чтобы применить изменения, перезапустим Nginx:

sudo systemctl restart nginx

После переименования и создания символической ссылки проверим, что Nginx правильно обрабатывает новый конфигурационный файл:

sudo nginx -t

Сайт скореее всего будет запускаться с ошибкой 403. Для решения этой проблемы выполним следующие:

22. Создадим группу nginxusers:

sudo groupadd nginxusers

23. Добавим нужных пользователей в группу:

sudo usermod -aG nginxusers User_1 
sudo usermod -aG nginxusers User_2

24. Изменим владельца директории на группу nginxusers:

sudo chown -R :nginxusers /home/User_1/<project_folder>/media/ 
sudo chown -R :nginxusers /home/user_2/<project_folder>/media/

4. Установим права доступа:

sudo chmod -R 775 /home/User_1/<project_folder>/media/ 
sudo chmod -R 775 /home/User_2/<project_folder>/media/

Теперь в файле конфигурации nginx добавим нашу группу:

sudo nano /etc/nginx/nginx.conf

И добавим user www-data nginxusers, где www-data — это пользователь, под которым работает Nginx, а nginxusers - наша созданная группа.

Если у вас на сервере один сайт, то группу создавать не нужно, вместо пользователя www-data указаываем своего пользователя.

При любом изменение на сайте можно выполнить следующие команды:

Перезапуск supervisor:

service supervisor restart

Перезапуск nginx:

service nginx restart

Заключение

В данной статье мы рассмотрели шаг за шагом простой и рабочий способ деплоя Django проекта на VDS сервере с использованием Ubuntu. Процесс включает установку необходимых компонентов, настройку базы данных, веб-сервера и управления процессами. Благодаря детализированным инструкциям можно легко адаптировать шаги под свои нужды и избежать распространённых ошибок. Правильная настройка окружения и сервера обеспечит стабильную работу приложения и его доступность для пользователей.