10 Фев


2017

Деплой django приложения на боевом сервере AWS

Данный пример тестировался на Amazon Web Server, банально из-за бесплатного пользования на 1 год(1 бакс на верификацию не считается =)). На простовых впс порядок установки в принципе будет таким же(за исключением ssh key, можно обойтись и без него, а вот на амазоне такой фичи нет, поэтому сразу сделайте бекап скаченного ключа, желательно в паре экземпляров). Ну и кроме того, я ставил ubuntu16.04, на других юникс подобных операционках возможно будут подводные камни.

Также в процессе установки необходимо открыть нужные порты со стороны амазона (80 для nginx, 22 для ssh, я прописал также 8000 для отладки других приложений)

После установки нужного инстанса и скачки ключа сделать change mode на 400, во избежание проблем.

Для начала создаим нового рут пользователя, в дальнейшем будем использовать его для установки и настройки нашего сервера(если будут какие-либо проблемы сможем пофиксить из под рута)  наиболее полно можно прочитать тут

Для этого коннектимся из под рута, и прописываем следующее

adduser USER_NAME

Далее необходимо дать права новому пользователю, делается это добавлением юзера в группу sudo.

gpasswd -a USER_NAME sudo

По необходимости создаем ssh public key (тут сразу стоит оговариться, я генерил ключ из терминала macosx, данный мануал также будет работать везде где есть bash, по поводу винды сказать ничего не могу)

На локальной машине в терминале прописываем

ssh-keygen
получаем:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/LOAL_USER_NAME/.ssh/id_rsa):

id_rsa можно заменить на любое другое имя файла (логично будет поменять на имя пользователя от которого собираемся коннектиться)

Выводим ключ на экран в терминале

cat ~/.ssh/id_rsa.pub

Копируем в буфер, теперь нужно залить на СЕРВЕР наш ключ, для этого заходим от USER_NAME пользователя, создать в домашней директории папку .ssh и установить на нее 700 права.

su - USER_NAME
mkdir ~/.ssh
chmod 700 ~/.ssh

Создадим файл authorized_keys (я использовал nano)

nano .ssh/authorized_keys

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

chmod 600 .ssh/authorized_keys
exit

Отлично, тепреь можем приконнектится к серверу 

ssh -i ~/.ssh/USER_NAME USER_NAME@SERVER_IP

Теперь следует обновить систему

apt-get update
 apt-get upgrade

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

sudo apt-get install python3 nginx python3-pip libpq-dev python3-dev postgresql
pip3 install --upgrade pip
pip3 install virtualenv

Создадим изолированное виртуальное окружение, и войдем в него

cd ~/virtualenv/
    virtualenv --no-site-packages NAME
    source ~/virtualenv/NAME/bin/activate

Установим необходимые пакеты

pip install Django
pip install django gunicorn
pip install psycopg2

Также необходимо установить модули которые прописаны в settings.py вашего проекта. Создадим базу данных (конфиг смотреть в settings.py -> DATABASES)

sudo -u postgres psql
postgres=# CREATE DATABASE test_database;
CREATE DATABASE

postgres=# CREATE USER test_user WITH password 'qwerty';
CREATE ROLE

postgres=# GRANT ALL privileges ON DATABASE test_database TO test_user;
GRANT

Скопируем наш проект на сервер (лично я заливал через ssh, однако как вариант можно запулить и через гит)

scp -i ~/.ssh/USER -r /PATH/DJANGO_PROJECT USER_NAME@IP_SERVER

В settings.py изменим абсолютный путь до статики, убираем режим дебага, прописываем в ALLOWED_HOSTS ip либо домен сайта. Опционально, если проект скачен из инета меняем SECRET_KEY.

Собираем статику, синхронизируем базу данных с проектом.

python manage.py collectstatic
python manage.py makemigrations
python manage.py migrate

Настроим nginx, для этого зайдем в файл конфига /etc/nginx/sites-available/default и отредактировать его:

server {
    listen 80;
    server_name IP; #либо ip, либо доменное имя
    access_log  /var/log/nginx/example.log;

    location /static/ {
        root ~/USER/DJANGO-PROJECT;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
Настройка для ssl


            server {
                listen 443 ssl;
                server_name IP/DOMEN_NAME;
            
                access_log /var/log/nginx/test.access.log;
                error_log /var/log/nginx/test.error.log;
               #root /home/USERNAME/html;
            
                gzip on;
                gzip_disable "msie6";
                gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/json application/json;
            
                ssl on;
                ssl_session_timeout 1d;
                ssl_session_cache shared:SSL:50m;
                ssl_session_tickets on;
            
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                add_header Strict-Transport-Security max-age=15768000;
                ssl_certificate /home/USERNAME/du-blog_ru.chained.crt; #сертификат
                ssl_certificate_key /home/USERNAME/privatekey.key; #ключ
            
                ssl_stapling on;
                ssl_stapling_verify on;
                resolver 8.8.8.8;
            
                location /collect_static/ {
                    root /home/USERNAME/PROJECT_DIR/;
                    expires 30d;
                }
            
                location / {
                    proxy_pass http://127.0.0.1:8000;
                    proxy_set_header Host $server_name;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
             }
            

Запускаем проект

cd ~/DJANGO_PROJECT
gunicorn DJANGO_PROJECT.wsgi:application

Проверяем, должно работать

Supervisor

Окей, теперь нужно настроить supervisor, это менеджер для управления процессами, в случае сбоя, либо перезагрузки машины, поднимает сайт заного. Создадим конфиг файл для gunicorn, в папке с settings.py, т.е в ~/myproject/myeproject/gunicorn.conf.py

bind = '127.0.0.1:8000'
workers = 3
user = "username"

Установим сам supervisor

sudo apt install supervisor

Создаем конфиг файл для супервизора

cd /etc/supervisor/conf.d/
sudo nano myproject.conf

Внутри прописываем конфиг для запуска нашего приложения

[program:myproject]
command=/home/user/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/user/myprojectenv/myproject/myproject/gunicorn.conf.py
directory=/home/user/myprojectenv/myproject
user=nobody
autorestart=true
redirect_stderr=true

Запускаем supervisor

sudo update-rc.d supervisor enable
sudo service supervisor start

Теперь можно управлять супервизором с помощью команд:

supervisorctl reread
supervisorctl update
supervisorctl status myproject
supervisor restart myproject

Теперь при любой внештатной ситуации супервизор поднимет наш проект.

P.s. также не забудте поставить nginx в автозапуск:

sudo update-rc.d -f nginx enable 

 

DRF
Django
Postgresql
devops
Nginx
AWS