Как развернуть Django-проект на сервере.

В этой статье я опишу как развернуть проект на Django. Для этого буду использовать связку Postgresql + Gunicorn + Nginx. И ещё затрону тему настройки виртуальной среды для проекта. Устанавливать всё это добро буду на Ubuntu Server 16.04 LTS.

Итак, приступим!

Давайте обновим наш сервер и установим на него всё необходимое. 

Обновим список пакетов:

sudo apt-get update

Обновим установленные пакеты до последних доступных версий:

sudo apt-get upgrade

Установим нужные нам пакеты:

sudo apt-get install python3 python3-dev python3-pip libpq-dev postgresql postgresql-contrib nginx

Postgresql

Будем работать с СУБД через оболочку:

sudo -u postgres psql

Создадим базу данных и пользователя для этой базы:

CREATE DATABASE django_db;
CREATE USER user_db WITH password 'user_db_password';
GRANT ALL ON DATABASE django_db TO user_db;

Для выхода из оболочки введите:

\q

Virtualenv

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

Давайте установим virtualenv:

sudo pip3 install virtualenv

Создадим virtualenv:

mkdir ~/venv
virtualenv -p /usr/bin/python3 ~/venv/demo

Активируем виртуальную среду:

source ~/venv/demo/bin/activate
(demo) andrey@ubuntu:~$

Среда готова и активирована. Дективировать её можно с помощью команды:

deactivate

Пока что не будем деактивировать virtualenv. А установим в неё все необходимые модули:

pip install Pillow Django psycopg2 gunicorn

Мы установили графическую библиотеку, Django, адаптер для Postgresql и WSGI-сервер. Перенесём папку с проектом в домашнюю директорию. Для примера файлы проекта я размещу в директории
~/demo.

Укажем в файле ~/demo/demo/settings.py нашего проекта настройки базы данных:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'django_db',
        'USER': 'user_db',
        'PASSWORD': 'user_db_password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

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

cd ~/demo
python manage.py migrate
python manage.py createsuperuser

Gunicorn

Давайте проверим теперь ранее установленный gunicorn. Для начала просто запустим его. Запускать его нужно из папки на уровне где находится manage.py:

gunicorn demo.wsgi --bind yourdomain.ru:8001

Итак, мы проверили взаимодействие нашего Django приложения и Gunicorn. Но нам нужно иметь более надёжный и удобный способ запуска и остановки сервера приложений.

Systemd

Systemd это менеджер системы и служб для Linux. В ubuntu он появился с версии 15.04. Этот менеджер запускает сервисы описанные в его конфигурации. Конфигурация состоит из множества файлов, которые называют юнитами. Юнит представляет из себя файл, который форматом похож на .ini файлы.

Создадим системный файл systemd.

sudo vim /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=andrey
Group=andrey
WorkingDirectory=/home/andrey/demo
ExecStartPre=source /home/andrey/venv/demo/bin/activate
ExecStart=/home/andrey/venv/demo/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/andrey/demo/demo.sock demo.wsgi:application

[Install]
WantedBy=multi-user.target

Запустим и включим сервис:

sudo systemctl start gunicorn
sudo sytemctl enable gunicorn

Посмотреть логи если что то пошло не так можно командой:

sudo journalctl -u gunicorn

Если вы что то поменяли в файле /etc/systemd/system/gunicorn.service перечитайте настройки systemctl и перезапустите сервис:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Nginx

Создадим файл с конфигом nginx:

sudo vim /etc/nginx/sites-avaliable/demo

и наполним его:

upstream app_server {

  server unix:/home/andrey/demo/demo.sock fail_timeout=0;
}

server {

    listen   80;
    server_name some.project.com;

    client_max_body_size 4G;

    access_log /home/andrey/demo/logs/nginx-access.log;
    error_log /home/andrey/demo/logs/nginx-error.log;

    location /static/ {
        alias   /home/andrey/demo/static/;
        expires off;
        access_log off;
    }

    location /media/ {
        alias   /home/andrey/demo/media/;
        expires off;
        access_log off;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server;
            break;
        }
    }
}

создадим ссылку:

sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo

Создадим папку для логов:

mkdir /home/andrey/demo/logs

Перезапустим Nginx

sudo systemctl restart nginx

В принципе это все настройки. Чтобы подтянулись стили в админке, скорее всего потребуется дополнительно в Django добавить в settings.py:

STATIC_ROOT = os.path.join(BASE_DIR, "static")

И выполнить команду:

python manage.py collectstatic

Удачной настройки!