Pull to refresh

Настройка сервера для django-проектов с нуля

Reading time 6 min
Views 41K
Хочу поделиться опытом настройки сервера для django-проектов. Так вышло, что мне часто приходится настраивать с нуля VPS-сервера для запуска на них django-сайтов. Как-то мне в голову пришла идея записать пошагово процесс настройки. Оказалось, что “по бумажке” выполнять эти рутинные операции гораздо проще и быстрее — все нюансы записаны, трудно что-то упустить. Дальше больше — я превратил инструкцию в самостоятельный shell-скрипт — запустил и сервер готов. Я думаю, некоторым python-разработчикам, особенно начинающим, будет полезно ознакомиться с содержимым скрипта. С некоторыми доработками вы, возможно, захотите использовать его в своей практике.

Итак, допустим вы только что купили VPS-сервер и поставили туда стабильный релиз Debian. Перво-наперво, вы копируете свой RSA ключ на сервер:

ssh-copy-id root@server

Теперь заходим на сервер, скачиваем скрипт и запускаем его:

wget -O ~/install.sh dumpz.org/57292/nixtext
sh ~/install.sh

Всё :) Если вы запустили скрипт, в том виде, как написал его я, то теперь у вас установлен nginx, postgres, supervisor, uwsgi; создан пользователь web, который может работать с postgres; установлены все популярные DVCS; установлены различные python-библиотеки и сделана ещё куча мелочей. Вам остаётся лишь склонировать ваш проект в директорию /web/project_name, далее настроить конфиг nginx для вашего сайта (создан шаблон в sites-enabled), прописать пару строчек в конфиг supervisor’а и запустить сайт.

Мои джанго проекты обычно также настраиваются одним скриптом, который создаёт virtualenv, устанавливает зависимости в него, создаёт базу данных, делает syncdb, выполняет миграции, создаёт начальные данные — но это уже тема для другой статьи.

В итоге, запуск django-сайта на голом сервере превращается из рутины в быструю и почти безболезненную процедуру (ну, всё равно, какие-нить баги же вылезут).

Актуальная версия скрипта лежит здесь: dumpz.org/57292

Я решил также выложить текст скрипта здесь с подробными комментариями на русском языке.

#!/bin/sh

# Скачиваем конфиг vim - это мой редактор в котором
# я делаю всё: пишу код сайтов, работаю на сервере через ssh
# оформля в данный момент комментарии скрипта для habrahabr
wget -O ~/.vimrc http://dumpz.org/25712/nixtext/

# Делаем vim редактором по-умолчанию
# Теперь если я запущу, например, crontab, я не буду шокирован
# Вываливишмся на меня nano
update-alternatives --set editor /usr/bin/vim.basic

# Теперь устанавливаем netselect-apt пакет.
# Он содержит программу для поиска самого быстрого
# репозитория с debian пакетами
apt-get install netselect-apt -y
rm /tmp/sources.list
netselect-apt -o /tmp/sources.list -n stable

# Найденный репозиторий был записан в /tmp/sources.list
# Используем имя сервера из него и создаём три
# записи: мы будем использовать по мере надобности все три
# ветки debian-репозитория: стабильную, тестовую и нестабильную
# Нестабильной (sid) я пользуюсь затем, что в ней лежит nginx-пакет
# Поддерживающий из коробки uwsgi
echo "deb http://security.debian.org/ squeeze/updates main contrib non-free" > /etc/apt/sources.list
LINE=$(cat /tmp/sources.list | grep '^deb' | head -1)
echo $LINE /etc/apt/sources.list >> /etc/apt/sources.list
echo $LINE | sed 's/stable/testing/' >> /etc/apt/sources.list
echo $LINE | sed 's/stable/sid/' >> /etc/apt/sources.list

# По-умолчанию, будем использовать пакеты из стабильной ветки
# Запрещаем установку, по-умолчанию, дополнительных пакетов
cat > /etc/apt/apt.conf.d/07custom << EOF
APT::Install-Recommends "false";
APT::Default-Release "stable";
EOF


# Получим актуальную информацию о пакетах в репозитории
# ветки которого мы только что добавили в sources.list
aptitude update

# Теперь настроим локали: en_US будет локалью по-умолчанию.
# Кроме неё сгенерируем также ru_RU локаль
aptitude install locales -y
echo en_US.UTF-8 > /etc/default/locale
cat > /etc/locale.gen << EOF
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
EOF

locale-gen

# Теперь обновим все установленные пакеты
# Т.е. те пакеты, что были системе на момент нашей работы с ней
aptitude upgrade -y

# Поставим пару ништяков
# Пакет psmisc предоставляет утилиту pkill
# screen и sudo и так понятно
aptitude install psmisc screen sudo -y

# Поставим exim4, чтобы можно было почту слать
# Я пока не разбирался, как его настроить из скрипта
# Придётся вам потом ручками запустить dpkg-reconfigure
aptitude install exim4 -y
#dpkg-reconfigure exim4-config

# Ставим nginx из sid ветки, там он умеет uwsgi
# Делаем автозапуск ngin при загрузке системы
# Запускаем веб-сервер
aptitude install nginx -t sid -y
update-rc.d nginx defaults
/etc/init.d/nginx start

# Создаём пользоателя web
# Из-под него я работаю со всеми моими django-проектами
# Копируем ему RSA ключ, чтобы можно было под ним по ssh заходить
# Копируем ему vim конфиг
useradd -m web -s /bin/bash
cp ~/.vimrc /home/web
mkdir /home/web/.ssh
cp ~/.ssh/authorized_keys /home/web/.ssh
chown -R web:web /home/web

# Создаём директорию /web, там я обычно размещаю джанго-проекты
mkdir /web /web/run /web/log
chown -R web:web /web

# Ставим все популярные системы контроля версия
aptitude install mercurial subversion git-core -y

# Я использую для своих проектов mercurial
# Поэтому настраиваю его для работы на сервере
# Иногда я делаю коммиты прямо с сервера
cat > /home/web/.hgrc << EOF
[ui]
username = Name Name 
EOF

chown web:web /home/web/.hgrc

# Ставим python :)
# python-dev - исходный код python, чтобы можно было
# ставить python-библиотеки, которым нужна компиляция из C кода
# python-setuptools содержит скрипт easy_install
aptitude install python python-setuptools python-dev -y

# Поставим последние версии pip и virtualenv
easy_install -U pip
easy_install -U virtualenv

# gcc нужен для компиляции всяческго python-добра
aptitude install gcc -y

# Ставим python-библиотеку для работы с lxml
# Предпочитаю ставить её в бинарном виде,
# чтобы не ждать окончания длинного процесса компиляции
aptitude install python-lxml -y

# Fabric ставим - очень поленая вещь
pip install -U fabric

# Ставим PIL
# Не забываем о некоторых зависимостях, иначе после компиляции
# может получиться, что ваш PIL не умеет работать с JPEG :)
aptitude install libjpeg62-dev libfreetype6-dev -y
pip install -U PIL

# Ну вот и до uwsgi добрались
# Ставим нужную зависимость и компилируем последнюю версию
aptitude install libxml2-dev -y
pip install -U http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

# Я обычно пользуюсь postgres
# Просто настраиваю его так, чтобы из-под пользователя web
# Можно было делать что угодно
aptitude install postgresql python-psycopg2 -y
su postgres -c "cd /; createuser -s web"

# Супервизор будет управлять нашими uwsgi-демонами
# С помощью него мы будем перезапускать наши сайты
# Также он должен запустить сайт, если его процесс "вдруг" умер
aptitude install supervisor -y

# Это конфиг для управления через веб, нужно вписать ваш пароль и имя пользователя
cat > /etc/supervisor/conf.d/inet.conf << EOF
[inet_http_server]]
port=666
#username=
#password=
EOF


# Это шаблон для одного джанго сайта,
# Как видите описание django-процесса в supervisor-конфиге минимально
# Мы лишь указываем рабочую директорию и команду для запуска
# Сайт запускается uwsgi командой, все настройки uwsgi хранятся в uwsgi.xml
# файле в директории сайта
cat > /etc/supervisor/conf.d/web.conf << EOF
#[program:PROJECT]
#directory=/web/PROJECT
#command=uwsgi -x uwsgi.xml
#user=web
EOF


# Перезапустим supervisor, хотя пока особого смысла в этом нет
/etc/init.d/supervisor restop

# Эта строчка нужна, чтобы пользователь web мог запускать команду
# supervisorctl через sudo
# По-умолчанию, она может быть выполнена только рутом
echo "web    ALL = NOPASSWD: /usr/bin/supervisorctl" >> /etc/sudoers

# А это шаблончик сайта для nginx
# Для нового сайта просто копируем его
# и в VIM заменяем HOST и PROJECT на нужные значения

cat > /etc/nginx/sites-enabled/template << EOF
server {
    server_name .HOST.com;

    error_log /web/log/HOST.com-error.log warn;
    access_log /web/log/HOST.com-access.log;

    location /static/admin-media {
        alias /web/PROJECT/var/.env/lib/python2.6/site-packages/django/contrib/admin/media;
    }   

    location /static/ {
        root /web/PROJECT;
    }   

    location /robots.txt {
        root /web/PROJECT/static;
    }   

    location /favicon.ico {
        root /web/PROJECT/static;
    }   

    location / { 
        include uwsgi_params;
        uwsgi_pass unix:/web/run/PROJECT.sock;
    }   
}
EOF



Спасибо, что доскролили до этого места, надеюсь, колесо вашей мышки не сломалось. Желаю, чтобы кому-то данный материал оказался полезным.

UPDATE: Это не решение для деплоинга, хотя кое-какие намёки там есть. Это просто скрипт, который ставит и конфигуряет нужный софт для комфортной работы с django-проектами.

UPDATE2: Создал проект на битбакете: bitbucket.org/lorien/django-server Форкайте на здоровье.
Tags:
Hubs:
+89
Comments 56
Comments Comments 56

Articles