Setup de Python com Django ou Pyramid na Dreamhost

Publicado em 2016-06-01 por Vinicius Assef

Que tal configurar e rodar um projeto usando Python 3 com Django ou Pyramid no plano de hospedagem compartilhada da Dreamhost? É o que faremos agora.

Esse texto foi baseado nas seguintes fontes:

Introdução

É normal executarmos Python em ambientes web com uWSGI ou Gunicorn. Na Dreamhost é diferente, vamos executar Python usando Passenger, que também é muito fácil de trabalhar.

Antes de começar, você precisa ativar o Passenger quando criar o seu domínio (ou subdomínio) no painel de controle da Dreamhost.

Na Dreamhost nós temos algumas liberdades. Lá nós podemos:

  • Instalar uma versão própria de Python.
  • Configurar um virtualenv.
  • Gerenciar o Passenger.
  • Executar scripts de deploy.
  • Ter repositórios bare do git.
  • Logar com chaves ssh, sem password.

Veremos a seguir algumas formas de rodar aplicações Python 3 no Passenger em alguns cenários:

  1. Um script Python simples
  2. Um projeto Django
  3. Um projeto Pyramid

Antes de começar

Você precisa ter os seguintes dados em sua conta na Dreamhost:

  • Um username ssh
  • Um domínio ou subdomínio configurado

Para efeito desse tutorial, vamos considerar:

  • username ssh: john
  • domínio configurado: example.com

Essa é a estrutura de diretórios que você vê assim que loga pela primeira vez usando $ ssh john@example.com:

/home/john
|-- Maildir
|   +-- ...
|-- logs
|   +-- example.com
+-- example.com
    +-- public

Durante esse tutorial, vamos criar alguns diretórios novos e, ao final, teremos a seguinte estrutura:

/home/john
+-- Maildir
|   +-- ...
|-- logs
|   +-- example.com
|-- example.com
|   |-- public
|   |-- tmp
|   |   +-- restart.txt
|   +-- passenger_wsgi.py
|-- bin
|   +-- python-3.4.3
|-- src
|   |-- myapp
|   +-- myapp.egg-info
+-- venv
    |-- bin
    |-- include
    |-- lib
    |-- lib64 -> lib
    +-- share

Observações importantes:

  • O Passenger vai executar o script passenger_wsgi.py em ~/example.com/. Ele é o entry point da aplicação.
  • Você vai salvar seus scripts auxiliares em ~/bin.
  • Sua aplicação vai rodar os programas localizados em ~/src.
  • O virtualenv está em ~/venv
  • O diretório corrente da sua aplicação (cwd) é ~/example.com.

Comandos para gerenciar o Passenger

Ver se o Passenger está rodando:

$ pgrep -fl python3

Reiniciar a aplicação:

$ touch ~/example.com/tmp/restart.txt

Matar o processo do Passenger se o restart acima não funcionar:

$ pkill python3

Ativando o login usando as chaves ssh

Antes de mais nada, vamos configurar o login por ssh para não pedir senha. Ao invés da senha, vamos usar uma chave de segurança.

Copie o arquivo ~/.ssh/id_rsa.pub do seu computador local para ~/.ssh/authorized_keys do servidor da Dreamhost. Você vai precisar digitar sua password aqui pelas últimas duas vezes:

$ ssh {USER}@{SERVER}.dreamhost.com "umask 077; mkdir .ssh"
$ cat $HOME/.ssh/id_rsa.pub | ssh {USER}@{SERVER}.dreamhost.com "cat >> .ssh/authorized_keys"

Observação: Você precisa substituir "{USER}" e "{SERVER}" pelo username e pelo nome do servidor correspondentes da sua conta na Dreamhost.

A partir de agora você vai logar sem password.

Instalando o Python 3 em um virtualenv

O virtualenv vai ficar no diretório ~/venv

Salve o arquivo abaixo com o nome ~/install-python.sh:

#!/bin/bash

PYVER=3.5.1

_main () {
    mkdir --parent ~/bin
    install_python
    create_virtualenv
    install_some_packages
}


install_python () {
    mkdir --parent ~/tmp
    cd ~/tmp

    wget http://www.python.org/ftp/python/${PYVER}/Python-${PYVER}.tgz
    tar zxvf Python-${PYVER}.tgz
    cd Python-${PYVER}

    ./configure --prefix=$HOME/bin/python-${PYVER}
    make
    make install

    echo "export PYVER=$PYVER" >> ~/.bash_profile
    echo 'export PATH=$HOME/bin/python-${PYVER}/bin:$PATH' >> ~/.bash_profile
    echo 'source ~/.bash_profile' >> ~/.bashrc

    cd
    rm -rf ~/tmp
}


create_virtualenv () {
    source ~/.bash_profile
    python3 -m venv $HOME/venv
    source ~/venv/bin/activate
}


install_some_packages () {
    pip3 --upgrade pip setuptools
    pip3 install ipython
}

_main

Torne-o executável:

$ chmod +x ~/install-python.sh

E execute-o:

$ ~/install-python.sh

Pronto, já temos o Python 3 instalado.

Preparando para rodar uma aplicação Python

Depois de instalar o Python 3, precisamos criar o arquivo para gerenciar os restarts do Passenger. Na Dreamhost ele chama-se restart.txt e vive no diretório tmp dentro do diretório do seu domínio:

$ mkdir -p ~/example.com/tmp
$ touch ~/example.com/tmp/restart.txt

Toda que vez que precisarmos reiniciar a aplicação, vamos dar um touch nesse arquivo.

Executando um script Python 3 simples

Salve o arquivo abaixo com o nome passenger_wsgi.py dentro de ~/example.com/:

# ~/example.com/passenger_wsgi.py
import sys, os

HOME = os.environ.get("HOME")
VENV = HOME + "/venv"
INTERP = VENV + "/bin/python3"

if sys.executable != INTERP:
    os.execl(INTERP, INTERP, *sys.argv)

cwd = os.getcwd()
sys.path.insert(0, "{v}/lib/python3.5/site-packages".format(v=VENV))

def application(environ, start_response):
    start_response("200 OK", [("Content-type", "text/plain")])
    message = "Python %s from dir %s" % (sys.version, cwd)
    return [bytes(message, encoding="utf-8")]

Reinicie sua aplicação:

$ touch ~/example.com/tmp/restart.txt

Entre no seu navegador e vá para http://example.com. Você deve ver uma mensagem parecida com essa:

Python 3.5.1 (default, Jun  1 2016, 10:54:37) 
[GCC 4.6.3] from dir /home/john/example.com

Nesse ponto notamos que o Passenger está configurado corretamente e executando nosso programa Python. Estamos no caminho certo.

Executando um projeto Django

Importante: antes de seguir nesse exemplo, você já deve ter criado um projeto Django simples e:

  1. copiado-o para ~/src
  2. instalado as dependências no virtualenv criado acima.

Salve o arquivo abaixo como o nome passenger_wsgi.py dentro de ~/example.com/:

# ~/example.com/passenger_wsgi.py

import sys, os

HOME = os.environ.get("HOME")
SRCDIR = HOME + "/src"
PROJECTNAME = "my_project_name"
VENV = HOME + "/venv"
INTERP = VENV + "/bin/python3"

if sys.executable != INTERP:
    os.execl(INTERP, INTERP, *sys.argv)

sys.path.insert(0, "{v}/lib/python3.5/site-packages".format(v=VENV))
sys.path.insert(0, SRCDIR)

os.environ["DJANGO_SETTINGS_MODULE"] = "{p}.settings".format(p=PROJECTNAME)
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Novamente, reinicie sua aplicação com o comando touch.

Entre no seu navegador e vá para http://example.com. Você deve ver seu projeto rodando.

Executando um projeto Pyramid

Importante: antes de seguir com esse exemplo, você já deve ter criado um projeto Pyramid simples e, da mesma forma que vimos no exemplo acima, do Django:

  1. copiado-o para ~/src
  2. instalado as dependências no virtualenv criado acima.

Salve o arquivo abaixo como o nome passenger_wsgi.py em ~/example.com/:

# ~/example.com/passenger_wsgi.py
import sys, os

HOME = os.environ.get("HOME")
SRCDIR = HOME + "/src"
VENV = HOME + "/venv"
INTERP = VENV + "/bin/python3"

if sys.executable != INTERP:
    os.execl(INTERP, INTERP, *sys.argv)

sys.path.insert(0, "{v}/lib/python3.5/site-packages".format(v=VENV))
sys.path.insert(0, SRCDIR)

from paste.deploy import loadapp
application = loadapp("config:{s}/production.ini".format(s=SRCDIR))

Reinicie sua aplicação com o comando touch.

Entre no seu navegador e vá para http://example.com. Você deve ver seu projeto rodando.

Seguindo esses passos você terá seu projeto Python rodando na hospedagem compartilhada da Dreamhost.

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.