Como hospedar meu site feito em Python?
Autor: Vinicius Assef | Publicado: 2016-10-13T20:46:00-03:00




Vou começar esse artigo pelo óbvio, mas que gera frustração em quem vem do PHP: hospedar Python é mais complicado do que hospedar PHP. Mas não é o fim do mundo.

Pronto, falei.

Agora, vamos seguir pelos itens básicos necessários para hospedar um projeto em Python.


Servidor web
------------

Não tem jeito, como seu sistema vai rodar na web, você precisa de um servidor web. O mais famoso é o Apache. O Nginx ganhou muito mercado nos últimos anos por ser mais leve e ter excelente desempenho.

A cada requisição de URL o servidor web repassa a execução para o Python. De forma parecida como o PHP. Geralmente o servidor web lida diretamente com os arquivos estáticos e o Python, assim como o PHP, lida com a execução dos programas que você desenvolveu.


"Servidor de aplicação"
-----------------------

É, está entre aspas porque o Python não tem exatamente um servidor de aplicação, mas existem diferentes formas de fazer o servidor web conversar com o Python para que os programas sejam executados.

Não vou entrar em detalhes nesse artigo, mas se você usar um VPS ou um servidor dedicado, vai se deparar com os seguintes nomes: uWSGI e Gunicorn. Esses dois softwares servem exatamente para fazer o servidor web mandar executar seus programas Python e pegar a resposta deles.

Isso fica transparente quando você usa um servidor compartilhado ou um PaaS.

Quando você faz um deploy a nova versão dos programas só será executada quando o "servidor de aplicação" for reiniciado.

Esse _reload_ é muito rápido, mas por que é necessário? Por questão de desempenho. Os programas são carregados uma vez no início da aplicação e só são atualizados quando o servidor é iniciado. Normalmente isso é feito dando um `touch` em um determinado arquivo que é sempre monitorado. Quando esse arquivo é atualizado, o servidor reinicia e a nova versão dos programas é executada.



Banco de dados
--------------

A famosa dupla PHP/MySQL não encontra um paralelo de unanimidade no mundo Python. É muito comum vermos sistemas escritos em Python acessando MySQL ou Postgres.

SQLite resolve boa parte dos problemas de sites com poucos acessos e pouca concorrência, mas não é recomendado para sites maiores, principalmente com muitas atualizações. Eu mesmo tenho sites rodando com SQLite sem problema, mas a característica principal deles é leitura com pouquíssima atualização.

Os bancos NoSQL também fazem sucesso no mundo Python. MongoDB praticamente domina esse nicho. Entretanto, [Postgres](https://www.postgresql.org/docs/9.6/static/datatype-json.html) e [MySQL](https://dev.mysql.com/doc/refman/5.7/en/json.html) já suportam manipulação eficiente de dados JSON.



Acesso shell
------------

Para hospedar Python, geralmente você vai precisar de acesso ao shell do servidor. Sim, a linha de comandos do Linux.

É rotineiro usarmos bibliotecas de terceiros e elas precisam ser instaladas. Nesse caso dois componentes importantes entram em ação:

1. [virtualenv](https://docs.python.org/3/library/venv.html#module-venv)
1. [pip](https://packaging.python.org/installing/#use-pip-for-installing)

Não vou me alongar na descrição dessas ferramentas. Se você quer hospedar seu projeto, provavelmente já conhece ambos.

O virtualenv permite que várias versões de uma mesma biblioteca possam conviver no mesmo computador. Um exemplo: Suponhamos que você tem 2 projetos. Um usando Django 1.4 e outro usando Django 1.10. Com o virtualenv você consegue ter os dois projetos rodando no mesmo servidor sem conflito entre as versões de Django.

O pip permite instalar as bibliotecas usadas por sua aplicação. Ele equivale ao [Composer](https://getcomposer.org/) do universo PHP.

Mesmo que você pense em não usar nenhuma biblioteca de terceiros, é inviável desenvolver em Python para web sem usar um framework. Atualmente temos várias excelentes opções como Django, Pyramid, Flask, Web2py, Bottle... Fica até difícil escolher!

O framework já é um conjunto de bibliotecas de terceiros, por isso você vai usar o `pip`. Como o `pip` é chamado pela linha de comandos, você vai precisar do shell.

Então, não tem alternativa; você precisa do shell. A não ser que você use uma plataforma que permita instalar pacotes de terceiros de outra maneira. Vou falar sobre isso daqui a pouco.



Tarefas em background
---------------------

Python é muito usado para sistemas web que vão além de sites e muitas vezes precisam realizar tarefas mais demoradas. Eis alguns exemplos que podem e devem rodar como processos independentes:

- Envio de emails.
- Atualização de estatísticas.
- Geração de sumários.
- Tratamento automático de imagens.
- Compactação de video.

Talvez não para sites, mas para sistemas, atividades como essas são quase obrigatórias. O recurso do `cron` já vem com todo Linux e é muito bem testado pelo tempo. Ele existe há décadas. Há outras alternativas, mas a `cron` é uma das mais simples.


Tipos de hospedagem
-------------------

Certo, mas será que consigo rodar meu sistema em uma hospedagem compartilhada? Preciso de um servidor dedicado?

A resposta a essas perguntas vai depender do porte do seu sistema ou da quantidade de acessos que ele terá. Eu não posso responder em seu lugar, mas listei características de algumas alternativas de hospedagem para tentar ajudar a esclarecer um pouco.

Como esse artigo é destinado a iniciantes, o objetivo não é esgotar todas as características de cada alternativa abaixo.


### Hospedagem compartilhada


Em geral, aplicações pequenas podem usar hospedagem compartilhada sem problemas. Sistemas maiores devem partir para um VPS/Dedicado ou rodar em um PaaS.


Vantagens da hospedagem compartilhada:

- Você não tem que administrar um serviço de email.

- Você não precisa manter o servidor atualizado/seguro.

- Você não tem que saber administrar servidor web, servidor de banco de dados, cache, etc.

- Backup dos arquivos e do banco de dados é de responsabilidade do provedor. Mas eu teria também a minha cópia por precaução.

- Mensalidade fixa. Mesmo com aumento de tráfego ou de utilização de espaço em disco o valor continua o mesmo, desde que dentro dos limites contratados para o seu plano.


Desvantagens da hospedagem compartilhada:

- Pode haver dificuldade em instalar alguns módulos que dependam de bibliotecas do sistema operacional como, por exemplo, a `libxml`. Também pode haver restrições de acesso a compiladores. É comum que servidores bloqueiem compiladores por padrão. Nesse caso, um contato com o suporte explicando sua necessidade pode resolver essa limitação.

- Mensalidade fixa. Usando ou não, você vai pagar sempre o mesmo valor.

- É provável que você não terá a liberdade de usar todas as ferramentas que gostaria. Por exemplo, é bem possível que seu sistema rode com Apache, mas você prefere Nginx. Como a administração do servidor web fica por conta do seu provedor de hospedagem, geralmente você não pode escolher o servidor web. Mas não ter a responsabilidade de administrá-lo pode compensar.

- Pode haver limites para envio de email e cada provedor tem suas regras específicas.


Ouço muita gente dizer que profissional de verdade não usa hospedagem compartilhada. Mas você precisa analisar suas necessidades. Normalmente, mas nem sempre, a hospedagem compartilhada é mais barata do que as outras alternativas.

Uma dica que dou para quem escolhe hospedagem compartilhada, é: automatize seu deploy ao máximo. Não caia na tentação de usar ftp para fazer deploy!



### VPS ou Servidor dedicado

Não aceite um VPS sem acesso root. Isso é normal nos dedicados.


Vantagens de VPS ou Servidor dedicado:

- Você tem a máquina toda a sua disposição para fazer o que quiser.

- Mensalidade fixa. Mesmo com aumento de tráfego ou de utilização de espaço em disco o valor continua o mesmo, desde que dentro dos limites contratados para o seu plano.

- Em alguns provedores de VPS você pode ter mais de uma instância e pagar por cada uma delas. Alguns permitem que você pare/destrua sua instância a qualquer momento, economizando no valor.


Desvantagens de VPS ou Servidor dedicado:

- Você tem que saber administrar o servidor e mantê-lo seguro/atualizado.

- Geralmente você é o responsável pelos backups, pelo servidor de banco de dados, pelo servidor web, pelas configurações de rede, desempenho, monitoramento, etc.

- Tudo é por sua conta.

- Mensalidade fixa, independente do uso, se sua instância ficar ligada o mês todo.


Uma observação importante sobre VPS/Dedicado: email. Eu não arrisco administrar o serviço de email em um VPS nem em um dedicado. Recomendo que você use serviço de email contratado. Caso contrário, é receita para dor de cabeça.


### PaaS (Platform as a Service)

Vantagens de PaaS:

- Mais simples de operar do que um VPS/Dedicado.

- Pague pelo que usa, quando usa. Em geral, isso vale para rede, espaço em disco, processador ou instâncias inteiras.

- Pode montar estratégias de deploy automático e focar no código do seu sistema.

- Não se preocupar tanto com crescimento explosivo de acessos. Mas você ainda precisa se preocupar com isso, principalmente na questão custo.


Desvantagens de PaaS:

- Cada fornecedor de PaaS tem um modelo de cobrança diferente. Por isso, fique atento aos detalhes do contrato.

- Os valores variáveis podem trazer surpresas desagradáveis no fim do mês se seu tráfego aumentar muito, por exemplo.

- Cada fornecedor de PaaS tem um jeito próprio de administrar os recursos da aplicação e de fazer deploy. Portanto, existe uma curva de aprendizado e você vai precisar aprender as particularidades do seu provedor antes de realmente colocar o sistema no ar.

- Normalmente cada fornecedor dá nomes específicos a tecnologias conhecidas, dificultando a utilização de quem está acostumado com um serviço convencional.


Em um PaaS você faz deploy sem ter acesso ao shell. Mas, como citei acima, cada um tem suas próprias regras e nomenclaturas. Você vai precisar estudar um pouco para usá-los.



### IaaS (Infrastructure as a Service)

Se você está buscando esclarecimento nesse texto, provavelmente não precisa de IaaS. Definitivamente, IaaS não é para iniciantes.

Cada fornecedor continua dando nomes específicos a tecnologias já existentes em um grau muito maior. Portanto, cada fornecedor de IaaS é um mundo diferente.

Talvez o fornecedor de IaaS mais conhecido seja a [Amazon Web Services](http://aws.amazon.com)



Onde eu posso hospedar?
-----------------------

A lista abaixo é apenas uma sugestão. Hospedagem de sistemas web é um assunto delicado e as opiniões/experiências podem divergir.

Abaixo segue uma pequena lista com provedores que eu uso/já usei e não tive problemas, ou que foram recomendados por pessoas de minha confiança:

- [KingHost](http://kinghost.com.br): hospedagem nacional com servidores no Brasil e preços justos.

- [DreamHost](http://dreamhost.com): hospedagem compartilhada com espaço ilimitado e possibilidade de hospedar ilimitados domínios e subdomínios independentes. Eu escrevi o artigo [Setup de Python com Django ou Pyramid na Dreamhost](/2016/06/setup-python-com-django-ou-pyramid-na-dreamhost.html) para tentar simplificar as coisas.

- [Digital Ocean](http://digitalocean.com): VPS com muitos tutoriais para instalar e configurar praticamente todos os serviços que você vai precisar.

- [Python Anywhere](http://pythonanywhere.com): PaaS especializado em hospedagem Python.

- [Heroku](http://heroku.com): PaaS.

- [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/): PaaS.

- [OpenShift](http://openshift.com): PaaS.


Observação: como esse artigo é direcionado a principiantes em hospedagem de sistemas Python eu deixei de fora, intencionalmente, os fornecedores de IaaS.

Se eu esqueci de alguma coisa importante, escreva nos comentários que eu avalio e insiro no texto.

Para terminar, quero agradecer ao [Filipe Ciffali](https://twitter.com/FilipeCifali) pelo tempo e conhecimento cedidos à comunidade, colaborando com esse artigo.