Fazendo o deploy de uma aplicação Django no Dreamhost

No post anterior, foi mostrado como instalar uma versão mais recende do Python e do Django no Dreamhost. Nesse post será demonstrado como fazer o deploy de uma aplicação Django utilizando o virtualenv.

O Dreamhost utiliza o Passenger WSGI para servir aplicações escritas em Python, por isso, o processo aqui descrito é referente ao deploy utilizando o Passenger WSGI.

Configuração do domínio

O primeiro passo é configurar um domínio para fazer o deploy da aplicação. Entre no painel de configuração de domínios e adicione um novo domínio ou sub-domínio, ou então edite a configuração de um domínio já existente.

Após inserir o nome do novo domínio ou sub-domínio, na seção “Web Options“, marque a opção “Passenger (Ruby/Python apps only)“.

Um detalhe importante é, que ao utilizar o Passenger, o caminho especificado em “Web directory” deve terminar em public. Por exemplo, se o domínio configurado é exemplo.com.br, então o caminho ficará exemplo.com.br/public.

Configuração do banco de dados MySQL

Uma vez configurado o domínio, deve ser criado um banco de dados para a aplicação. A criação do banco pode ser feita na página de gerência de banco de dados MySQL. Tenha pelo menos um hostname configurado, pois no Dreamhost não pode ser usado simplesmente localhost ao configurar o host do servidor de banco de dados na aplicação.

Deploy da apliação Django

Agora que o domínio e o banco de dados da aplicação estão criados, criaremos uma aplicação Django e faremos o deploy utilizando o virtualenv.

Primeiro é necessário criar o ambiente virtual para nossa apliação, lembrando que será feito o uso do virtualenvwrapper para nos auxiliar:

mkvirtualenv projeto

Ao executar o comando anterior, o ambiente virtual criada já será ativado, repare o prefixo () no prompt do shell:

(projeto)user@host:path/to/projeto.com.br$

Posteriormente, o virtualenv poderá ser ativado usando o comando:

workon projeto

Para completar o nome do projeto poderá ser utilizado o tab, assim como é feito para completar comandos do sistema.

Agora que temos o ambiente virtual criado, podemos instalar o Django:

pip install django

Como o Dreamhost oferece somente o MySQL como servidor de banco de dados, teremos que instalar também o driver do MySQL para Python:

pip install mysql-python

Terminado a instalação dos pacotes necessários, poderemos fazer o setup de nossa aplicação. Primeiramente devemos entrar no diretório que foi configurado o domínio, estarei utilizando o domínio projeto.com.br como exemplo.

cd projeto.com.br

Lembre-se que, como estamos utilizando o Passenger, dentro do diretório projeto.com.br deverá ter o diretório public, como foi definido anteriormente na configuração do domínio.

Agora poderá ser criado o projeto Django:

django-admin.py startproject projeto

Também deverá ser criado o arquivo passenger_wsgi.py:

touch passenger_wsgi.py

Edite esse arquivo e adicione o seguinte conteúdo:

import sys, os
 
INTERP = os.path.join(os.environ['HOME'], '.virtualenvs', 'projeto', 'bin', 'python')
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
 
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = "projeto.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Nossa aplicação está quase pronta para ser rodada. Falta fazer a configuração do banco de dados e do admin. Também será criar um link simbólico para os arquivos estáticos do admin.

Configuração da aplicação

Entre no diretório do projeto:

cd projeto

E edite o arquivo settings.py, primeiro a configuração do banco de dados:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'hostname.domain.com',
        'PORT': '',
    }
}

Primeiro definimos que utilizaremos o MySQL como banco de dados, em seguida configuramos o nome do banco de dados, nome do usuário e senha. Finalmente, é configurado o host do servidor do banco de dados, repare que devemos entrar com o hostname configurado na página de gerência de banco de dados MySQL.

Ainda no arquivo settings.py, deverá ser configurado STATIC_ROOT para que os arquivos estáticos do django admin sejam cerregados.

STATIC_ROOT = '/home/user/projeto.com.br/public/static'

Para finalizar a configuração da aplicação, devemos adicionar o django admin no INSTALLED_APPS, para isso decomente a linha:

# 'django.contrib.admin',

Com isso finalizamos a configuração do projeto. O próximo passo é configurar o arquivo urls.py descomentando as linhas:

# from django.contrib import admin
# admin.autodiscover()
# url(r'^admin/', include(admin.site.urls)),

Em seguida criaremos o link simbólico para os arquivos estáticos do django admin:

mkdir public/static
ln -s ~/.virtualenvs/projeto/lib/python2.7/site-packages/django/contrib/admin/media/ public/static/admin

Finalmente, para terminar o deploy, execute o comando syncdb para que as tabelas do banco de dados e um super-usuário seja criado:

cd projeto
python manage.py syncdb

Uma vez terminado a execução do syncdb, poderemos acessar nosso projeto no navegador. No exemplo desse post bastaria acessar a URL http://projeto.com.br/admin.

Referências

Instalação do Python 2.7.2 e Django 1.3.1 no Dreamhost

Em servidores compartilhados normalmente não é possível ter a versão do Python ou mesmo do Django de acordo com as necessidades do projeto. Porém, tendo um acesso SSH, é possível instalar, no diretório home, a versão requerida para rodar o projeto.

Como exemplo, será demonstrado como instalar uma versão do Python e do Django diferente da oferecida pelo serviço de hospedagem compartilhada do Dreamhost. No momento da escrita do post as versões do Python e do Django oferecidas são, respectivamente, 2.5.2 e 1.2.1. Serão instaladas as versões atuais que são 2.7.2 para o Python e 1.3.1 para o Django.

Além disso, será configurado o pipvirtualenv e virtualenvwrapper para facilitar manter diversos projetos e criar ambientes virtuais para atender as necessidades de cada projeto.

Antes de iniciar tenha certeza que seu usuário tenha acesso SSH. É desejável ter algum conhecimento sobre Linux para facilitar o entendimento das  etapas descritas.

Configuração inicial do ambiente

Sua conta deve estar configurada como descrito:

Primeiro, crie os diretórios necessários:

cd ~
# Criação dos diretórios raiz (e log/setup)
mkdir -pv soft run www log log/setup backup data
# Criação dos subdiretórios dentro de run (nosso FHS)
for subdir in bin etc include lib man share
do
  mkdir -pv run/${subdir}
done
# link simbólicos para manter os manuais em um local comum
ln -sv ../man run/share/man
# link simbólico dentro de log para os logs do apache
ln -sv ../logs log/vhosts

Em seguida, edite o arquivo ~/.bashrc para configurar o ambiente, adicione as seguintes linhas:

# Variável para facilitar as instalações
export RUN=$HOME/run

# Adiciona o run/bin ao PATH do sistema
PATH=$RUN/bin:$PATH

# Define os caminhos para bibliotecas
export LD_LIBRARY_PATH=$RUN/lib:$LD_LIBRARY_PATH
export LD_RUN_PATH=$RUN/lib:$LD_RUN_PATH

  Para maiores informações e outras configurações visite Unix account setup. Para instalar o Python, somente as configurações descritas são suficientes.

Instalação do Python 2.7.2

O Python precisa ser baixado e compilado, para isso basta executar os comandos:
# Diretório para baixar e compilar o Python
cd ~/soft
# Download do Python 2.7.2
wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz
# Extrai o conteúdo do pacote
tar -zxvf Python-2.7.2.tgz
# Acessa o diretório com o conteúdo extraido
cd Python-2.7.2
# Configura a instalação, repare no prefixo informado
./configure --prefix=$RUN
# Compilação do Python
make
# Instalação do Python
make install
# Se tudo ocorreu bem, teremos o python 2.7.2 instalado
python --version

Instalação do setuptools e do pip

Para gerenciar os pacotes, será utilizado o pip. Porém para facilitar a instalação do pip será intalado o setuptools que oferece o comando easy_install. Para instalar o setuptools execute os comandos:
# Diretório para baixar e compilar o Python
cd ~/soft
# Download do setuptools para o Python 2.7.x
wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
# Instalação do setuptools, repare no prefixo informado
sh setuptools-0.6c11-py2.7.egg --prefix=$RUN
Uma vez instalado o setuptools, pode-se instalar o pip executando o seguinte comando:
easy_install pip

Agora que tem o pip instalado, será mais fácil de instalar os outros pacotes.

Instalação do virtualenv e virtualenvwrapper

Para instalar o virtualenv e virtualenvwrapper, basta executar o seguinte comando:

pip install virtualenvwrapper

Como o virtualenv é uma dependência do virtualenvwrapper, ele será automaticamente instalado, pois o pip se encarrega de resolver as dependencias dos pacotes que serão instalados.

Para configurar o virtualenvwrapper, adicione as seguintes linhas no ~/.bashrc:

export WORKON_HOME=~/.virtualenvs
source virtualenvwrapper.sh

Essa configuração informa que os ambientes virtuais serão instalados no diretório ~/.virtualenvs.

Para que esse configuração tenha efeito imediado execute o comando:

. ~/.bashrc

Caso o comando anterior não seja executado, somente na próxima vez que iniciar uma sessão SSH, as configurações entrarão em vigor.

Instalação do Django

Finalmente, para instalação do Django, já que temos o pip instalado, basta executar o comando:

pip install django

Com isso teremos o Django disponível no sistema. Eu tenho a preferência de instalar o Django sempre que criar um virtualenv, pois dessa forma cada projeto pode permanescer com sua versão requerida do Django.

Maiores informações

Para maiores informações consulte as referências:

Python para Desenvolvedores – Segunda Edição

A segunda edição do livro Python para Desenvolvedores de Luiz Eduardo Borges está disponível para download. Confira a nota de lançamento:

A segunda edição do livro (ISBN 978-85-909451-1-6, 360 páginas), voltado para desenvolvedores que já tem conhecimento de programação, incluindo desde a criação de interfaces com usuário, computação gráfica, aplicações para internet e sistemas distribuídos.

Você pode fazer o download ou ir para a página oficial.

Boa leitura!