четверг, 25 июля 2013 г.

Разворачиваем django

Дано: Машинка с Arch linux, роутер с openWrt, ssh доступ, желание запилить проектик c nginx и uwsgi своими ручками.
ok, deploy
Итак у вчерашнего студента/манагера/просто веселого парня (нужное подчеркнуть) вдруг появился смысл жизни, а именно настройка бэкенда хоста "на антресоли". А именно хочется иметь связку:
browser <-> host (барахло на антрисоли) <-> web-server (nginx) <-> soket (uwsgi) <-> application (django)
Прежде прежде всего ставим настраиваем роутер. А именно, в разделе Network / DHCP and DNS поставим Static Leases на машину с линью. Потом в Hostname пропишем имя проекта proj_name и поставим на уже сохраненный ip.
Если уже есть зареганное имя на http://freedns.afraid.org/ например, mcgrog.now.im, которое ссылается на внешний ip данный провайдером, то нужно еще настроить роутер:
1) идем в Network -> Frewall -> Port Forwards
2) пробрасываем 80 порт из внешки на 80 порт сервака (определяем по айпи):
Вообще об этом писали много всего разного.
Логинимся, в на машину, просимся под рут и выполняем
pacman -S nginx uwsgi python-mysqldb python2 git-core virtualenv
что означает, что мы поставили 5 системных пакетов.
Условимся что мы храним проект в /srv/http/proj_name/ внутри создаем папку /srv/http/proj_name/conf и кладем туда конфиги nginx и usgi
Для веб-сервера создаем файл proj_name.conf
server {
  listen 80;
  server_name proj_name;
  access_log /srv/http/proj_name/logs/nginx-access.log;
  error_log /srv/http/proj_name/logs/nginx-errors.log;
  location /favicon.ico {#эта секция временно
      empty_gif;# что бы не было паники в логах
  }#о несущестующем фавиконе
  location / {
      include uwsgi_params;
      uwsgi_pass 127.0.0.1:9002;
  }
}
делаем симлинк из папки конфигов до папки nginx
ln -s /srv/http/proj_name/conf/proj_name.conf /etc/nginx/sites-available/
Теперь надо положиь симлинк на конфиг в /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/proj_name.conf /etc/nginx/sites-available/proj_name.conf
В директории проекта создаем папку под логи, что бы джинкс мог туда класть логи, закрепляем успех и релоадим нджнкс
sudo systemctl reload nginx
Пришел черед настроить uwsgi: идем в /etc/uwsgi/ тут надо создать конфиг для имератора emperor.ini , что бы он присматривал за вассалами:
[uwsgi]
emperor = /etc/uwsgi/apps
master = 1
смотрим что лежит в /etc/uwsgi/apps - а ничего. Тогда в директории проекта/conf/ создаем файл proj_name.ini (строго так же не обязательно называть, интерфейс будет понимать что к нему обратились по имени сокета 9002)
[uwsgi]
socket = /srv/http/%n/pid/uwsgi.socket
chdir = /srv/http/%n/src
pythonpath = ..
module = %n.wsgi:application
virtualenv = /srv/http/%n/env
env = DJANGO_SETTINGS_MODULE=%n.settings
logto = /srv/http/%n/logs/uwsgi.log
enable-threads
uid = http
gid = http
touch-reload = /srv/http/%n/touchme
А теперь делаем симлинк на папку вассалов
ln -s /srv/http/proj_name/conf/proj_name.ini /etc/uwsgi/apps/
как мы договорились, размещаем сорцы в директории /srv/http/proj_name
Переходим туда и далее выполняем:
virtualenv2 --prompt="<proj_name>" ./env
Данная модель удобна тем, что в одой директории будет весь проект со всем окружением и его удобно бэкапить. Но если на хостинге несколько проектов и гениальная мысль посещает неожиданно, то лучше вынести папку окружений на директорию вверх, то есть хранить их в /srv/http/.envs, и использовать virtualenvwrapper.
Видим, как все поставилось. Отмечу, что я не указывал путь до интерпритатора, так как по умолчанию пакман выкачал последнюю версию второго питона и virualtnv ее и подсосал.
Если хотим использовать блага цивилизации, то через пакмам ставим пакет python-virtualenvwrapper (есть зависимость от третьего питона) и делаем следующие телодвижения:
0) если не установлен, то ставим пакет python3
1) Делаем симлинк с python на python2 (ну вот не хочется мне пока 3ю верию использовать)
ln -s /usr/bin/python2 /usr/local/bin/python
2) модифицируем свой пользовательский .bashrc (заодно можно его дополнить другими записями)  - в конец добавляем
export WORKON_HOME=/srv/http/.venvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/bin/virtualenv2
source /usr/bin/virtualenvwrapper.sh
3) перелогиниваемся в терминал
4) создаем oкружение командой
mkvirtualenv proj_name
deactvate
Видим, что изменения на лицо. Заводим sql клиент и создаем базу
mysql -uroot -p
CREATE DATABASE proj_name CHARACTER SET utf8 COLLATE utf8_general_ci;
create user 'proj_db_user'@'localhost' IDENTIFIED BY 'userpass';
GRANT ALL PRIVILEGES ON proj_name.* TO 'proj_db_user'@'localhost';
Теперь активируем песочницу и ставим  в нее все необходимое
source env/bin/activate
export PIP_REQUIRE_VIRTUALENV=true
pip install django
Если воспользовались советом и сделали одну папку и поставили virtualenvwrapper, то все выглядит красивее и работает с автокомплитом по табу
workon proj_name
pip install django
Теперь можно перейти в проект /srv/http/proj_name, там запустим
dgjango-admin.py startproject proj_name
Для удобства восприятия, и что бы не было куча вложенный папаок с одинаковым именем, переименуем /srv/http/proj_name/proj_name в /srv/http/proj_name/src. В конфиги висги лезть не надо, там это уже учтено.
Теперь следует сделать следующие телодвижения в консоли. Проверим что джанга встала и работает:
python proj_name/manage.py runserver
теперь осталось пнуть висги, что бы он подсосал инишник и мог проксировать запрос от джинкса до application в django
sudo uwsgi -- ini proj_name.ini
правда, есть небольшая беда: если править исходники на сервере, то висги не узнает что ему надо перезапустиься, потому что он не умеет следить за содержимым папки. Можно конечно трогать спец файл, который релоадит висги:
sudo touch /srv/http/proj_name/touchme
О кастылях плюшках и прочем - в следующей части. Главное, что сейчас есть на руках - джанго запускается в режиме дебага и говорить, что все заработало.
Да, и если нормально сконфигурили роутер, то при выключенном runsrver, если в браузере пойти по http://proj_name/ то, можно посмотреть результат работы django приложения - радостно скажет, что все работает и надо прогать.