Deploy Django проекта на VPS

В данной статье я расскажу как просто развернуть ваш Django проект на базе сервера (VPS, VDS, Dedicated) на базе Ubuntu. Для этого вам предстоит пройти пройти простые и понятные шаги, описанные в данной статье. Deploy Django проекта проще чем кажется.

Стэк:

  1. Сервер на базе Ubuntu;
  2. PostgreSQL;
  3. Nginx;
  4. Gunicorn;
  5. Django проект;

Проверка локалей на сервере:

При подключении к серверу из под пользователя root. Необходимо проверить локали системы. Командой:

locale

 Они должны выглядеть следующим образом:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Либо ru_RU, но обязательно UTF-8.

Создание базы данных:

Подключаемся к postgres:

sudo -u postgres psql

Создаем базу данных с пользователем:
 

CREATE DATABASE database_name WITH ENCODING='UTF-8';
CREATE USER database_user WITH PASSWORD '<password>';
ALTER ROLE database_user SET client_encoding TO 'utf8';
ALTER ROLE database_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE database_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE database_name TO database_user;

Создание пользователя:

Проект не должен крутится на сервере из под под пользователя root. Все процессы должны запускаться под любым другим пользователем, которого мы создадим далее.

Добавляем пользователя в Ubuntu:

adduser user_name

Добавляем нашего пользователя в группы sudo и www-data:

usermod -aG sudo user_name
usermod -aG www-data user_name

Переключаемся на нашего пользователя:

su - user_name

Клонирование и настройка проекта:

Важно: Все последующие действия из этого раздела, выполнять из под созданного нами пользователя.

Переходим в папку нашего пользователя (если она не создалась при создании пользователя, то создать её):

cd /home/user_name/

Клониурем репозиторий с проектом:

git clone repository_name

Переходим в папку с проектом и создаем виртуальное окружение:

virtualenv venv --python=python<version>

Активируем виртуальное окружение:

activate venv/bin/activate

Устанавливаем зависимости проекта:

pip install -r requirement_file.txt

Указываем настройки подключения к базе данных (которую мы создали ранее, в разделе “Создание базы данных”.

Применяем миграции:

python manage.py migrate

Собираем статику:

python manage.py collectstatic

Пробуем запустить проект через runserver:

python manage.py runserver 0.0.0.0:8000

Далее переходим в браузере по адресу http://<ip_нашего_сервера>:8000. Если открывается ваш проект, значит все сделано правильно и переходим к следующему шагу.

Устанавливаем gunicorn внутри виртуального окружения (если не было указано в requirements):

pip install gunicorn

Кофигурация Gunicorn:

Переключаемся обратно на пользователя root (т.к из под созданного пользователя, вы не сможете создать файл конфигурации, из-за отсутствия прав на директории):

Создаем файл конфигурации:

nano /etc/systemd/system/project_name.gunicorn.service

Где project_name - название вашего проекта.

Добавляем в этот файл следующее содержимое и сохраняем его:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=<linux user>
Group=www-data
WorkingDirectory=<project_root_directory>
ExecStart=<project_root_directory>/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:<project_root_directory>server.sock <Project main application>.wsgi:application

[Install]
WantedBy=multi-user.target

 

Где:

<project_root_directory> - путь до вашего проекта, например: “/home/my_user/my_project/”.

<Project main application> - название главного приложения (где лежат главные urls.py, settings.py и сам .wsgi файл.

<linux_user> - созданный нами пользователь, из под которого будет крутится проект.

Активируем кофигурацию gunicorn и запускаем процесс:

sudo systemctl enable <project_name>.gunicorn
sudo systemctl start <project_name>.gunicorn

Проверяем запустился ли gunicorn демон (нет ли ошибок в файле):

sudo systemctl status <project_name>.gunicorn

Если видим зеленую надпись Active running, то значит ошибок нет, и все идет по плану.

Конфигурация Nginx

Аналогично как и в предыдущем разделе, создание файла конфигруации NGINX необходимо производить из под root пользователя.

Создаем файл конфигурации:

etc/nginx/sites-available/<project_name>

Вписываем в созданный файл следующую конфигурацию:

server {
  listen 80;
  server_name <server_ip or domain_name>;
  location = /favicon.ico { access_log off; log_not_found off; }

  location /static/ {
    root <directory_root>;
  }
  location /media/ {
    root <directory_root>;
  }
  location /admin/static/ {
    root <directory_root>;
  }
  location / {
    include proxy_params;
    proxy_pass http://unix:<directory_root>/server.sock;
  }
}

Затем сохраняем его.

В даннной конфигруации мы задали настройки маршрутизации запросов. Статику, медиа файлы отдает nginx (не напрягая при этом сам наш проект), а остальные запросы передает в gunicorn.

Создаем символическую ссылку:

sudo ln -s /etc/nginx/sites-available/<project_name> /etc/nginx/sites-enabled/<project_name>

Проверяем корректность кофигурации NGINX:

sudo nginx -t

Если видим, что “syntax is ok”, то значит все идет по плану.

Перезагружаем NGINX:

sudo systemctl restart nginx

Финал:

Всё! Если вы проделали все шаги правильно, то перейдя по ip адресу сервера или домену (смотря что вы укаали в конфигурации nginx в директиве “server_name”, то вы увидите свой проект.

Полезная статья?  - Скажи спасибо в комментариях!