Django + Python 3 + Digitalocean + Ubuntu 16.04 + Https

2017-07-10 | 21:45
Tags: • python djangolife experiencedigitaloceanngnix

Перед переносом Django проекта у вас уже должны быть:

  • Зарегистрированный домен на любом регистраторе доменных имен
  • Filezilla или любой другой FTP загрузчик
  • Оплаченный аккаунт на Digitalocean.com с созданным Дроплетом и подулюченным доменом
  • Терминал от Linux или командная строка Windows

Цель

  • Развернуть рабочий Django проект на хостинге
  • Привязать к нему домен
  • Перенести сайт на HTTPs протокол

Новая установка Django

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3
sudo apt-get install nginx
sudo apt-get install python3-setuptools
sudo easy_install3 pip
pip3 install virtualenv
virtualenv /home/v_www
source /home/v_www/bin/activate
pip install django gunicorn
cd home/v_www/
django-admin.py startproject www
cd www
gunicorn www.wsgi:application --bind
37.139.30.225 - указываем свой IP

Задаем настройки для Django

открываем файл:
nano settings.py

Сразу добавляем ваш IP адресс:

ALLOWED_HOSTS = ['37.139.30.225',]

Эта строчка тоже в будущем понадобится
STATIC_ROOT = '/home/v_www/www/static/'

python manage.py collectstatic - выполняем для профилактики сборку статических файлов
python manage.py migrate - выполняем миграции
python manage.py createsuperuser - создаем суперюзера

Открываем файл настроек nginx

cd /etc/nginx/sites-available/
nano default

Заменяем весь код на этот:
не забываем указывать свой IP адресс server_name


server {
        listen 80;
        server_name
37.139.30.225
        access_log  /var/log/nginx/example.log;

        location /static/ {
            root /home/v_www/www/;
            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 /
cd /home/v_www/www

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

sudo service nginx restart
gunicorn www.wsgi:application

CTRL+C

Так же нам нужно, чтобы Django проект сам запускался после любых сбоев или перезагрузок сервера

apt-get install supervisor
cd /home/v_www/www/www
touch gunicorn.conf.py

nano gunicorn.conf.py

добавляем следующий код:

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


cd /etc/supervisor/conf.d/
touch www.conf
nano www.conf


добавляем  код:

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

далее:

supervisorctl reread
supervisorctl update
supervisorctl status www
supervisorctl restart www

Этот код вырубит нахер консоль

shutdown -r now
Пробуем перейти на свой IP адресс в браузере.

Нужно подключиться к Mysql базе данных

Устанавливаем необходимые библиотеки на Python для работы с Mysql

sudo apt-get install python-dev python3-dev
sudo apt-get install libmysqlclient-dev
pip install pymysql
pip install mysqlclient

cd /
sudo apt-get update

Устанавливаем Mysql

sudo apt-get install mysql-server

Подключаемся к базе данных для создания самой базы Mysql

mysql -u имя-пользователя-базы-данных -p

создаем базу данных с любым именем. У меня myDB

CREATE DATABASE myDB CHARACTER SET utf8;
Смотрим список баз данных:

show databases;
видим нашу. Есть.

exit

Возвращаемся к файлу настроек и указываем данные для соединения с базой 

cd /home/v_www/www/www
nano settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'MyDB',
            'USER': 'root',
            'PASSWORD': '',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }

Если вашему проекту нужны были сторонние библиотеки, как моему например, устанавливаем их

pip install django-ckeditor
pip install Pillow

Готово.
Проект должен работать по адресу домена.


Переезд на HTTPS

Все как всегда:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git

cd home/v_www/www/
Копируем папку из Github

git clone https://github.com/letsencrypt/letsencrypt
переходим в нее
cd letsencrypt
Запускаем проверку
./letsencrypt-auto --help
Вот на данном этапе может возникнуть проблема.
У меня все установилось нормально в первый раз, но во второй раз на этапе создания виртуального окружения выбило ошибку
Based on your pip output, the problem can likely be fixed by increasing the available memory
Вроде не хватало оперативной памяти для выполнения данного скрипта.

Решением было увеличить на время RAM на сервере, путем перехода на более дорогой тариф. Это только на время выполнения команды.
Далее все установилось и я снова перешел на тариф по 5$

Перезапускаем
service nginx stop

Выполняем установку с своим сайтом
./letsencrypt-auto certonly --standalone -d example.com

Указываем свои данные

Снова открываем настройки
sudo nano /etc/nginx/sites-available/default
и приводим к следующему виду:

server {
    #listen 80 default_server;
    #listen [::]:80 default_server ipv6only=on;

    listen 443 ssl;
    server_name
exemple.com.ua;
    ssl_certificate /etc/letsencrypt/live/
exemple.com.ua/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/
exemple.com.ua/privkey.pem;
    
server {
        listen 80;
        server_name
exemple.com.ua;
        return 301 https://$host$request_uri;
}

перезапускаем
service nginx restart

Если возникает подобная проблема:

doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

решается приведением имени аппликухи blog например, вот такому виду     'blog.apps.BlogConfig'

INSTALLED_APPS = [
    'blog.apps.BlogConfig',
    'climb.apps.ClimbConfig',
    'shop.apps.ShopConfig',

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ckeditor',
    'ckeditor_uploader',
]

Если возникает подобная проблема:

Permission denied:

Скорее всего нужно настроить права доступа к некоторым папкам вашего проекта.

У меня такая проблема была из за того, что при добавлении статьи я добавляю изображение, которое загружается в папку /static/media/imag... нужно дать права на запись.

Это не совсем безопасно, но пока такое решение наиболее быстрое

 

перезагружаем снова
killall gunicorn
 

DONE

 

django хостинг
python сайт
аренда доменного имени
мобильные процессоры amd