Хочу поделиться практическим опытом по установке готового проекта на Django на VPS от Reg.ru. Данное руководство рассчитано на новичков, оно содержит ряд не самых лучших решений, но с ним вы сможете запустить своей проект на Django в течение часа.
Инструкция не содержит настроек безопасности. Она была создана на базе англоязычных инструкций и боли, много боли (ссылки в конце статьи). Инструкция актуальна для настроек: centOS 7, Django 1.9.2 и Python 3.4.3
Ремарка: благодарю Филиппа Торчинского за предоставление продакт-версии PyCharm для создания проекта на Django.
Мы имеем готовый проект на Django в среде разработки PyCharm для локального компьютера. Т.е. settings.py имеет базу данных sqlite3, битые пути к статите и пустой ALLOWED_HOSTS. Это нормально.
Покупаем доменное имя на сайте Reg.ru. Стандартная процедура, ничего необычного.
Покупаем на Reg.ru VPS H-XEN-2 с виртуализацией XEN. Это нужно для того, чтобы не иметь проблем с конфигурацией ядра и распределением нагрузки. В качестве операционной системы выбираем CentOS 7. Тариф достаточно слабый, поэтому лучу взять её, нежели Ubuntu. Debian не берется, так как его сложнее настроить.
После покупке VPS нам придет письмо cо всеми данными. Там же нам предложат связать VPS и домен. В качестве решения вам предложат использовать панель управления DNSAdmin. Однако по какой-то причине эта штука не работает, поэтому пропускаем и переходим в панель управления Reg.ru в настройки вашего доменного имени.
— Ваш домен — DNS-Сервера. Ставим настройки согласно скриншоту:
— Ваш домен — Управление зоной — добавить запись «A» Например: (Ip-меняем на ваш)
Готово, мы привязали доменное имя к хостингу. На обновление потребуется какое-то время.
Для работы с CentOS 7 нам понадобится программа: PuTTY. Скачиваем запускам и приступаем к работе.
Первичная настройка хостига.
Для начала нам нужно будет добавить еще одного пользователя и назначить для него права на изменения конфигов. Это делается для того, чтобы вы по ошибке через root-пользователя не сломали всю систему.
1) подключаемся через PuTTY через root-пользователя и набираем следующие команды:
— добавляем юзера:
— добавляем юзеру пароль:
— добавляем пользователю habrauser права:
— отключаемся от сеанса под root-пользователем:
После этого мы сможем запускать команды пользователем habrauser от имени администратора через приставку sudo
2) Подключаемся через PuTTY под пользователем habrauser и набираем следующие команды:
— Ставим тайм-зону серверу:
— Подтверждаем:
— Ставим синхронизатор времени:
— Ставим автозапуск синхронизатора:
— Ставим необходимые дополнительные пакеты для centOS 7
Теперь мы сможем использовать pip, чтобы ставить необходимые питон пакеты.
— Ставим редактор
Настраиваем PostgreSQL
— Инициализируем PostgreSQL:
— Запускаем сервис PostgreSQL:
— Открываем конфигурационный файл:
— Редактируем так, чтобы база работала с авторизированными пользователями.
Чтобы сохранить файл, нам нужно нажать ctrl+O, далее enter и yes. Чтобы выйти нажимаем ctrl+X.
— Перезапускаем сервис
— Ставим автозапуск:
Создание базы данных PostgreSQL:
— входим в сервис:
-входим в локальный сеанс:
— создаем базу данных habradb:
— создаем пользователя баз данных:
— даем пользователю user права на использование базы данных habradb:
— завершаем сеанс работы с базой:
Наш проект рассчитан на использование Python3.4.3, поэтому мы будем ставить в виртуальное окружение именно его.
— ставим Python 3.4.3
— ставим виртуальное окружение:
— создаем в корне системы папку проекта apifolder (укажите такое название, которое у вас используется в самом проекте в PyCharm):
— переходим в данную папку:
-создаем виртуальное окружение djangoen с питоном python 3.4.3
p.s. чтобы правильно указать путь к питону, можно использовать команду
— активируем виртуальное окружение и входим в него
— ставим джангу, юникорн и обработчик базы
Чтобы поставить другую версию django, используйте команду:
начинаем создавать наш проект Django:
— Создаем проект Django в текущей папке (имя проекта то же самое, что и имеет мое в PyCharm):
— Копируем наш проект с локальной машины.
По идее проект нужно пушами копировать с вашего репозитория git, но если вы не знаете, что такое git, пуш и так далее, то есть более примитивный способ.
— Открываем файл settings.py и вносим в него изменения
Либо можно изменять его конфиг в IDE, а потом обновить его через SFTP.
— Ставим релевантные пакеты. Например, в моем случае, чтобы проект поддерживал модель ImageFiled, мне нужно было установить Pillow
— Проверяем базу данных, делаем миграцию (Статику пока собрать не получится, так как у нас её еще ничего не отдает).
Иногда эти команды не работают, и нужно использовать:
Также можно создать пользователя
— Запускаем проект и проверяем его работу:
./manage.py runserver 0.0.0.0:8000
Сайт будет доступен по адресу: server_domain_or_IP:8000
— чекаем все моменты и делаем отладку. Если на этом этапе не проверить все странички, админку и прочее, то в дальнейшем может появиться много проблем. Чаще всего забываются какие-то мелочи: пакеты, url, локальные конфиги.
— отключаемся
— создаем конфиг Юникорна:
— запускаем юникорн и делаем ему автозапуск:
— Подключаем Nginx
sudo nano /etc/nginx/nginx.conf
Вставляем новый конфиг в:
сам конфиг
— добавляем nginx юзеру:
— ставим права:
— проверяем конфиг nginx (должно отдать две успешные строки):
— Ставим автозапуск:
Основная часть работы сделана, теперь нам нужно собрать статику и перезагрузить машину:
— идем к нашей папке
— активируем окружение:
— Собираем статику:
— ставим в файлике setting.py ALLOWED_HOSTS = ваш домен, и DEBUG = False
— перезагружаем сервер: reg.ru — мои хостинг и услуги — ваш VPS — Перезагрузить сервер
Иногда одного раза не хватает (не все начинает работать так, как нужно), поэтому приходится грузить несколько раз.
___________________________________
Запуск сервера www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7
Дополнительные настройки www.digitalocean.com/community/tutorials/additional-recommended-steps-for-new-centos-7-servers
Сам конфиг www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-centos-7
Инструкция не содержит настроек безопасности. Она была создана на базе англоязычных инструкций и боли, много боли (ссылки в конце статьи). Инструкция актуальна для настроек: centOS 7, Django 1.9.2 и Python 3.4.3
Ремарка: благодарю Филиппа Торчинского за предоставление продакт-версии PyCharm для создания проекта на Django.
Что у нас есть
Мы имеем готовый проект на Django в среде разработки PyCharm для локального компьютера. Т.е. settings.py имеет базу данных sqlite3, битые пути к статите и пустой ALLOWED_HOSTS. Это нормально.
Мы начинаем
Этап 1
Покупаем доменное имя на сайте Reg.ru. Стандартная процедура, ничего необычного.
Покупаем на Reg.ru VPS H-XEN-2 с виртуализацией XEN. Это нужно для того, чтобы не иметь проблем с конфигурацией ядра и распределением нагрузки. В качестве операционной системы выбираем CentOS 7. Тариф достаточно слабый, поэтому лучу взять её, нежели Ubuntu. Debian не берется, так как его сложнее настроить.
После покупке VPS нам придет письмо cо всеми данными. Там же нам предложат связать VPS и домен. В качестве решения вам предложат использовать панель управления DNSAdmin. Однако по какой-то причине эта штука не работает, поэтому пропускаем и переходим в панель управления Reg.ru в настройки вашего доменного имени.
— Ваш домен — DNS-Сервера. Ставим настройки согласно скриншоту:
— Ваш домен — Управление зоной — добавить запись «A» Например: (Ip-меняем на ваш)
Готово, мы привязали доменное имя к хостингу. На обновление потребуется какое-то время.
Этап 2
Для работы с CentOS 7 нам понадобится программа: PuTTY. Скачиваем запускам и приступаем к работе.
Первичная настройка хостига.
Для начала нам нужно будет добавить еще одного пользователя и назначить для него права на изменения конфигов. Это делается для того, чтобы вы по ошибке через root-пользователя не сломали всю систему.
1) подключаемся через PuTTY через root-пользователя и набираем следующие команды:
— добавляем юзера:
adduser habrauser
— добавляем юзеру пароль:
passwd habrauser
— добавляем пользователю habrauser права:
gpasswd -a habrauser wheel
— отключаемся от сеанса под root-пользователем:
exit
После этого мы сможем запускать команды пользователем habrauser от имени администратора через приставку sudo
2) Подключаемся через PuTTY под пользователем habrauser и набираем следующие команды:
— Ставим тайм-зону серверу:
sudo timedatectl set-timezone Europe/Moscow
— Подтверждаем:
sudo timedatectl
— Ставим синхронизатор времени:
sudo yum install ntp
— Ставим автозапуск синхронизатора:
sudo systemctl start ntpd
sudo systemctl enable ntpd
Этап 3
— Ставим необходимые дополнительные пакеты для centOS 7
sudo yum install epel-release
sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx
Теперь мы сможем использовать pip, чтобы ставить необходимые питон пакеты.
— Ставим редактор
sudo yum install nano
Настраиваем PostgreSQL
— Инициализируем PostgreSQL:
sudo postgresql-setup initdb
— Запускаем сервис PostgreSQL:
sudo systemctl start postgresql
— Открываем конфигурационный файл:
sudo nano /var/lib/pgsql/data/pg_hba.conf
— Редактируем так, чтобы база работала с авторизированными пользователями.
. . .
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
#host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 md5
# IPv6 local connections:
#host all all ::1/128 ident
host all all ::1/128 md5
Чтобы сохранить файл, нам нужно нажать ctrl+O, далее enter и yes. Чтобы выйти нажимаем ctrl+X.
— Перезапускаем сервис
sudo systemctl restart postgresql
— Ставим автозапуск:
sudo systemctl enable postgresql
Создание базы данных PostgreSQL:
— входим в сервис:
sudo su - postgres
-входим в локальный сеанс:
psql
— создаем базу данных habradb:
CREATE DATABASE habradb;
— создаем пользователя баз данных:
CREATE USER user WITH PASSWORD 'password';
— даем пользователю user права на использование базы данных habradb:
GRANT ALL PRIVILEGES ON DATABASE habradb TO user;
— завершаем сеанс работы с базой:
\q
exit
Этап 4
Наш проект рассчитан на использование Python3.4.3, поэтому мы будем ставить в виртуальное окружение именно его.
— ставим Python 3.4.3
sudo yum install python34-devel
— ставим виртуальное окружение:
sudo pip install virtualenv
— создаем в корне системы папку проекта apifolder (укажите такое название, которое у вас используется в самом проекте в PyCharm):
mkdir ~/apifolder
— переходим в данную папку:
cd ~/apifolder
-создаем виртуальное окружение djangoen с питоном python 3.4.3
mkvirtualenv -p /usr/bin/python3.4 djangoen
p.s. чтобы правильно указать путь к питону, можно использовать команду
which python3.4
— активируем виртуальное окружение и входим в него
source myprojectenv/bin/activate
— ставим джангу, юникорн и обработчик базы
pip install django gunicorn psycopg2
Чтобы поставить другую версию django, используйте команду:
pip install django==1.9.2 #указав нужную версию
Этап 5
начинаем создавать наш проект Django:
— Создаем проект Django в текущей папке (имя проекта то же самое, что и имеет мое в PyCharm):
django-admin.py startproject apifolder . # точка говорит нам о том, что мы ставим в текущую папку, в данном случае в папку apifolder.
— Копируем наш проект с локальной машины.
По идее проект нужно пушами копировать с вашего репозитория git, но если вы не знаете, что такое git, пуш и так далее, то есть более примитивный способ.
- Подключаемся вашему серверу через SFTP: инструкция
- Открываем папку home/habrauser/apifolder
- Открываем ваш проект на локальной машине
- Обычным перетаскиваем дополняем и заменяем файлы созданного ранее проекта apifolder, вашим проектом c локальной машины (его имя также должно быть apifolder, либо то, что вы задали ранее).
— Открываем файл settings.py и вносим в него изменения
nano apifoldert/settings.py
Либо можно изменять его конфиг в IDE, а потом обновить его через SFTP.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', # так должно быть с версии django 1,8 и выше.
'NAME': 'habradb',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
#Предполагается, что у вас папка static будет лежать в корне проекта, а не в каждом отдельном приложении.
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
STATICFILES_DIRS = (
)
#Это пригодится вам для отладки. ALLOWED_HOSTS в самом конце нужно будет сменить на ваш домен.
DEBUG = True
ALLOWED_HOSTS = [
'*',
]
— Ставим релевантные пакеты. Например, в моем случае, чтобы проект поддерживал модель ImageFiled, мне нужно было установить Pillow
sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel
pip install Pillow
— Проверяем базу данных, делаем миграцию (Статику пока собрать не получится, так как у нас её еще ничего не отдает).
cd ~/apifolder
./manage.py makemigrations
./manage.py migrate
Иногда эти команды не работают, и нужно использовать:
python manage.py makemigrations
итдТакже можно создать пользователя
./manage.py createsuperuser
— Запускаем проект и проверяем его работу:
./manage.py runserver 0.0.0.0:8000
Сайт будет доступен по адресу: server_domain_or_IP:8000
— чекаем все моменты и делаем отладку. Если на этом этапе не проверить все странички, админку и прочее, то в дальнейшем может появиться много проблем. Чаще всего забываются какие-то мелочи: пакеты, url, локальные конфиги.
— отключаемся
deactivate
Этап 6
— создаем конфиг Юникорна:
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=habrauser
Group=nginx
WorkingDirectory=/home/habrauser/apifolder
ExecStart=/home/habrauser/apifolder/djangoen/bin/gunicorn --workers 3 --bind unix:/home/habrauser/apifolder/apifolder.sock apifolder.wsgi:application
[Install]
WantedBy=multi-user.target
— запускаем юникорн и делаем ему автозапуск:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
— Подключаем Nginx
sudo nano /etc/nginx/nginx.conf
sudo nano /etc/nginx/nginx.conf
Вставляем новый конфиг в:
http {
. . .
include /etc/nginx/conf.d/*.conf;
#Вот сюда
server {
listen 80 default_server;
. . .
сам конфиг
server {
listen 80;
server_name example.ru www.example.ru;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/habrauser/apifolder;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/habrauser/apifolder/apifolder.sock;
}
}
— добавляем nginx юзеру:
sudo usermod -a -G habrauser nginx
— ставим права:
chmod 710 /home/habrauser
— проверяем конфиг nginx (должно отдать две успешные строки):
sudo nginx -t
— Ставим автозапуск:
sudo systemctl start nginx
sudo systemctl enable nginx
Этап 7
Основная часть работы сделана, теперь нам нужно собрать статику и перезагрузить машину:
— идем к нашей папке
cd ~/apifolder
— активируем окружение:
source djangoen/bin/activate
— Собираем статику:
./manage.py collectstatic
— ставим в файлике setting.py ALLOWED_HOSTS = ваш домен, и DEBUG = False
— перезагружаем сервер: reg.ru — мои хостинг и услуги — ваш VPS — Перезагрузить сервер
Иногда одного раза не хватает (не все начинает работать так, как нужно), поэтому приходится грузить несколько раз.
___________________________________
Запуск сервера www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7
Дополнительные настройки www.digitalocean.com/community/tutorials/additional-recommended-steps-for-new-centos-7-servers
Сам конфиг www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-centos-7