Publicado em Deixe um comentário

Como escolher e configurar a hospedagem para scripts Python e aplicativos da Web

PYTHON Hosting Providers.

Divulgação: Este site pode conter links afiliados. Se você fizer uma compra por meio desses links, poderei receber uma comissão sem nenhum custo adicional para você. No entanto, todas as opiniões são minhas.

Python é uma linguagem de programação poderosa e versátil, usada para desenvolver programas para várias finalidades. Ela é bastante popular entre desenvolvedores iniciantes e experientes. O Python é usado em três áreas principais: desenvolvimento de sites, aprendizado de máquina e automação de processos. Essa linguagem é multiplataforma, o que permite executá-la em diferentes sistemas operacionais.

Para quem ler este artigo:

  • Alunos de cursos de Python: Muitas vezes, os cursos de treinamento não abordam os aspectos da implantação de aplicativos em produção. Este artigo o ajudará a entender como executar seus programas em servidores reais.
  • Clientes de programas Python: se você estiver enfrentando o problema de executar um aplicativo encomendado a um programador e não tiver recebido instruções claras, este artigo o ajudará a entender as etapas básicas da implantação.

Quem não deve ler este artigo:

  • Engenheiros de DevOps: se você sabe o que são soluções Docker e sem servidor, este artigo não fornecerá novas informações.

Opções de implementação de aplicativos Python

Configurar um ambiente para desenvolver e executar aplicativos Web Python pode ser uma tarefa assustadora, especialmente se você tiver pouca experiência em gerenciamento de servidores. Vamos dar uma olhada nos principais tipos de hospedagem:

  • VPS limpo. A configuração manual de um VPS puro oferece o máximo de controle e flexibilidade. Exige um pouco de conhecimento e experiência em administração de servidores, mas permite que você personalize totalmente o servidor de acordo com suas necessidades. A seguir, neste artigo, veremos um exemplo completo de execução de um aplicativo da Web Python Flask em um VPS.
  • Hospedagem virtual. Painéis de controle como WHM/Cpanel e ISP Manager suportam a execução de programas Python. No entanto, com a hospedagem compartilhada, muitas vezes é necessário escrever para o suporte técnico para habilitar o suporte ao Python e configurar o acesso SSH. Essa opção pode ser complicada e exige interação frequente com o suporte técnico do provedor de hospedagem.
  • VPS com painel de controle. Os servidores virtuais privados (VPS) com painéis de controle (por exemplo, WHM/Cpanel, ISP Manager) instalados podem ser mais convenientes para a execução de aplicativos Python. Eles oferecem mais controle e opções para personalizar o ambiente. Se precisar de um painel para executar não apenas um aplicativo Python, mas também outros sites PHP ao mesmo tempo, você deve considerar essa opção.
  • As soluções sem servidor oferecidas pelos provedores de nuvem (Azure, GCE, AWS) permitem que você execute aplicativos sem precisar gerenciar servidores. Essa pode ser uma opção econômica para pequenas cargas de trabalho, mas o custo pode aumentar significativamente à medida que a carga de trabalho aumenta.
  • Mecanismos de aplicativos GitOps. Várias plataformas de nuvem (Azure, GCE, AWS, Digital Ocean) oferecem a capacidade de implantar aplicativos diretamente dos repositórios do Git. Isso simplifica o processo de implantação e permite processos integrados de CI/CD.

Escolhendo hospedagem Python

Ao escolher a hospedagem para bots do Telegram, scripts e aplicativos Python em Flask ou Django, a opção mais adequada é usar um servidor virtual privado (VPS/VDS). O VPS oferece um alto nível de controle sobre o servidor e permite personalizar com flexibilidade o ambiente para o seu aplicativo. Para testes e pequenos projetos, qualquer VPS barato é suficiente. Isso permitirá que você implemente seu aplicativo, depure-o e verifique se ele funciona corretamente.

À medida que seu projeto crescer e a carga aumentar, você poderá fazer upgrade para planos de VPS mais avançados. Isso permitirá que você dimensione os recursos (CPU, RAM, espaço em disco) de acordo com as necessidades do seu aplicativo, garantindo uma operação estável e eficiente. O uso de um VPS oferece flexibilidade e escalabilidade suave, tornando-o a melhor opção para a implantação de aplicativos Python no Flask e no Django.

Para projetos iniciais, você pode solicitar hospedagem barata (VPS) para Python em tais provedores de hospedagem:

  1. PQ Hosting: Tarifa de alumínio (1 vCPU / 1 Gb RAM / 25 Gb NVMe). Preço 4,77 € por mês. O código promocional WOW2TOP oferece 15% de desconto para novos clientes.
  2. HyperHost: VPS Acessível (2 vCPU / 1,5 Gb RAM / 25 Gb SSD). Preço 6,96 € por mês. Python não é permitido na tarifa mais barata. O código promocional WOW2TOP oferece 10% de desconto para novos clientes.
  3. Friendhosting: Tarifa Micro NVMe (1 vCPU / 512 mb RAM / 10 Gb NVMe). Preço 3,49 € por mês.
  4. Provedor de nuvem DigitalOcean: Tarifa sob Droplets Básicos (1 vCPU / 512 RAM / 10 Gb SSD). O preço começa a partir de 6 dólares por mês, excluindo o VAT em seu país.

Se seu projeto se tornar mais complexo e exigir alto desempenho, é recomendável fazer upgrade para planos VPS com recursos e suporte aprimorados. Você pode saber mais sobre como escolher a tarifa VPS/VDS correta em nossa página de seleção de VPS.

Exemplo de execução de um aplicativo Python Flask em um VPS

Na seção inicial, veremos como configurar um ambiente Linux para executar o Python e adicionar suporte ao Flask. Se eu tiver de configurar um servidor do Windows, uso o cliente SSH MobaXterm, porque ele estabelece adicionalmente uma conexão SFTP, o que me permite copiar arquivos para um servidor remoto. Se o projeto for grande, use o FileZilla (no modo SFTP) para copiar os arquivos do projeto.

Etapa 1: Como a pilha da Web funciona para aplicativos Python

Gunicorn é um servidor da Web leve projetado para executar e criar vários fluxos de trabalho (workers) para nosso aplicativo Python. Ele é precedido pelo Nginx, que serve arquivos estáticos (css, js, png etc.) diretamente e redireciona solicitações de conteúdo dinâmico para o Gunicorn. O Gunicorn passa as solicitações para o nosso aplicativo por meio do padrão WSGI.

  1. Nginx: recebe uma solicitação HTTP do cliente e a transmite ao Gunicorn.
  2. Gunicorn: recebe a solicitação do Nginx e usa o WSGI para passá-la para o aplicativo Python.
  3. WSGI: a interface por meio da qual o Gunicorn se comunica com o aplicativo Python, passando a solicitação para ele.
  4. Python: processa a solicitação, interage com a lógica comercial e retorna uma resposta via WSGI.
  5. Gunicorn: recebe a resposta do aplicativo Python e a repassa para o Nginx.
  6. Nginx: envia a resposta final para o cliente.
Diagrama de como funciona a pilha Nginx Gunicorn WSGI Python.

Etapa 2: Como configurar seu ambiente Linux para trabalhar com Python

Portanto, recebemos acesso root a um VPS limpo do hoster. Normalmente não há nada em um VPS além do daemon SSH. Efetuamos login no servidor via SSH, atualizamos o sistema operacional e, se necessário, reinicializamos o VPS:

apt update
apt full-upgrade
reboot

Verifique se o pip está instalado ou não:

pip --version
pip 24.0 from /usr/local/lib/python3.10/dist-packages/pip (python 3.10)

Como você pode ver, já tenho o pip instalado; caso contrário, você precisa executar o comando abaixo. E vamos instalar as dependências necessárias para a configuração e o lançamento futuros do Flask:

apt install python3-venv python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

Mesmo que você tenha acabado de instalar o Python, alguns pacotes estarão no sistema por padrão. Verifique quais pacotes estão instalados no python:

pip list
...
[notice] A new release of pip is available: 23.3.1 -> 24.0
[notice] To update, run: python3 -m pip install --upgrade pip

Como você pode ver na listagem acima, sou solicitado a atualizar o pip, vamos atualizá-lo com o comando recomendado:

python3 -m pip install --upgrade pip

Etapa 3: Criar usuário

Precisamos criar um usuário para executar nosso aplicativo python. Vamos defini-lo como bash shell (é mais conveniente para mim) e definir uma senha:

adduser  --shell /bin/bash diegdev

Adding user `diegdev' ...
Adding new group `diegdev' (1004) ...
Adding new user `diegdev' (1004) with group `diegdev' ...
Creating home directory `/home/diegdev' ...
Copying files from `/etc/skel' ...
New password:
Is the information correct? [Y/n] y

Adicione o usuário ao grupo sudo para que ele possa obter privilégios de root:

usermod -aG sudo diegdev

Agora você está usando os direitos de superusuário root. Se precisar mudar para o novo usuário diegdev e ir diretamente para o diretório inicial dele, use o comando su. Isso é possível sem o hífen, mas você também terá de digitar o comando cd para chegar à sua pasta pessoal.

su - diegdev

Etapa 4: O que é um ambiente virtual Python?

Para executar scripts Python ou aplicativos da Web (Flask, Django), é sempre recomendável usar um ambiente virtual. Eles podem ser criados de várias maneiras, por exemplo, com: venv, pyenv, virtualenv, anaconda.

Usaremos o módulo venv, que oferece suporte à criação de “ambientes virtuais” leves, cada um com seu próprio conjunto independente de pacotes Python instalados no diretório do seu site. Um ambiente virtual é criado sobre uma instalação existente do Python, conhecida como instalação “base” do Python, e pode ser isolado dos pacotes no ambiente base, se desejado. Portanto, somente os pacotes explicitamente instalados no ambiente virtual estão disponíveis para seu aplicativo. Quando usadas em um ambiente virtual, as ferramentas normais de instalação, como o pip, instalarão os pacotes Python no ambiente virtual sem a necessidade de declarar isso explicitamente.

O módulo venv, que instalamos acima como uma dependência, se você não tiver feito isso, execute a instalação:

apt install python3-venv

Etapa 5: Faça upload do aplicativo Python para a hospedagem

Até este estágio, fizemos todas as configurações com o usuário root. Mas agora você pode conceder ao programador do seu projeto acesso SSH do usuário diegdev e permitir que ele carregue os arquivos do projeto.

Há três maneiras principais de fazer upload do projeto para o servidor:

  1. fazer upload por meio de protocolos de transferência de arquivos (FTP, FTPS, SFTP);
  2. uso do repositório git;
  3. implantação do projeto usando ferramentas incorporadas no IDE com o qual você está trabalhando.

Usarei o cliente SSH MobaXterm para fazer upload de arquivos; você pode usar, por exemplo, o FileZilla (no modo de conexão SFTP). Na captura de tela, mostrei como fazer upload do arquivo do aplicativo para o servidor com o usuário diegdev usando o MobaXterm.

Como fazer upload de um site python para o servidor.

Meu projeto contém 2 arquivos, os direitos pertencem ao usuário diegdev e estão localizados no diretório /home/diegdev/diegapp:

ls -l /home/diegdev/diegapp

-rw-rw-r-- 1 diegdev diegdev 193 Jun 16 18:25 myapp.py
-rw-rw-r-- 1 diegdev diegdev 109 Jun 13 15:46 requirements.txt

Etapa 6: Configurando o ambiente virtual

Instalamos o módulo venv acima e expliquei para que ele é necessário.

Em seguida, sob o usuário diegdev, vá para o diretório do projeto criado anteriormente e crie um ambiente de projeto virtual.

/home/diegdev/diegapp
python3 -m venv diegappenv

Ativamos o ambiente usando o utilitário de origem. Como você pode ver, a linha de prompt do bash mudou; o nome do ambiente virtual Python criado acima foi adicionado entre parênteses.

diegdev@wiki:~/diegapp$ source diegappenv/bin/activate
(diegappenv) diegdev@wiki:~/diegapp$

Para sair deste modo, use o comando deactivate após inseri-lo, qualquer comando Python usará o ambiente Python do sistema novamente. Não esqueça que você precisa executar nosso aplicativo apenas em um ambiente virtual.

deactivate

Etapa 7: Instalar pacotes de dependências requirements.txt

Quando o projeto estiver pronto, o programador deverá ter criado uma lista das dependências do seu projeto e colocado no arquivo requisitos.txt. Se ele não sabe como criar um arquivo requisitos.txt (isso aconteceu na minha prática), envie-lhe um link para este artigo.

Para criar requisitos.txt, use o módulo Freeze. No comando abaixo, especifique o caminho correto para salvar o arquivo. O arquivo requirements.txt agora contém uma lista de todos os pacotes instalados e suas versões que seu projeto usa.

python -m pip freeze > projects/your_project/requirements.txt

Vamos executar o comando para instalar dependências do arquivo requirements.txt:

pip install -r requirements.txt
pip install requirements.txt

Para verificar quais pacotes estão instalados, execute o comando:

(diegappenv) diegdev@wiki:~/diegapp$ python -m pip list
Package      Version
------------ -------
blinker      1.8.2
click        8.1.7
Flask        3.0.3
itsdangerous 2.2.0
Jinja2       3.1.4
MarkupSafe   2.1.5
pip          22.0.2
setuptools   59.6.0
Werkzeug     3.0.3

Etapa 8: Instale os pacotes Gunicorn e Flask

O Gunicorn pode ser instalado em um sistema operacional, mas eu recomendo fortemente a instalação via pip em um ambiente virtual. Em seguida, instale o Gunicorn e o Flask:

(diegappenv) diegdev@wiki:~/diegapp$ pip install gunicorn flask

Etapa 9: Crie um ponto de entrada WSGI

Conteúdo do arquivo myapp.py:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:green'>Hosting Consultant</h1>Leave a review on the site <a href='https://dieg.info' target='_blank'>dieg.info</a>, it will help others!</li>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Digamos que o arquivo principal do seu aplicativo se chame myapp.py e você esteja no mesmo diretório. Vamos testar seu funcionamento diretamente sem o Gunicorn.

(diegappenv) diegdev@wiki:~/diegapp$ python myapp.py

Se não houver erros e você puder abrir sua aplicação no navegador, criaremos um arquivo wsgi.py na raiz do diretório diegapp, que funcionará como ponto de entrada para nossa aplicação flask. É necessário que o servidor Gunicorn se comunique com o aplicativo. Meu wsgi.py contém este código:

from myapp import app

if __name__ == "__main__":
    app.run()

Vamos verificar se o Gunicorn funciona corretamente em conjunto com o aplicativo. Para fazer isso você precisa executar o comando:

(diegappenv) diegdev@wiki:~/diegapp$ gunicorn --bind 0.0.0.0:7777 wsgi:app

Como resultado, devemos receber as seguintes mensagens, e no navegador, ao acessar seu ip e porta 7777, você verá seu site Flask funcionando.

(diegappenv) diegdev@wiki:~/diegapp$ gunicorn --workers 3 --bind 0.0.0.0:7777 wsgi:app
[2024-06-16 21:40:01 +0300] [11395] [INFO] Starting gunicorn 22.0.0
[2024-06-16 21:40:01 +0300] [11395] [INFO] Listening at: http://0.0.0.0:7777 (11395)
[2024-06-16 21:40:01 +0300] [11395] [INFO] Using worker: sync
[2024-06-16 21:40:01 +0300] [11396] [INFO] Booting worker with pid: 11396

Se tudo funcionar, pressione CTRL+C na janela do terminal para parar o gunicorn. Em seguida, prossiga para a próxima etapa.

Abaixo estão algumas informações adicionais sobre como iniciar o servidor web Gunicorn. Chaves de lançamento:

  • A opção -w ou –workers significa o número de trabalhadores. Gunicorn é um servidor web sério projetado para cargas pesadas. É capaz de processar múltiplas solicitações simultaneamente graças à sua arquitetura. Gunicorn possui um processo principal que gerencia um conjunto de processos de trabalho. O processo principal distribui apenas solicitações de clientes do site e os trabalhadores as processam. Um trabalhador não é suficiente para acelerar o Gunicorn ao máximo. Tudo isso se deve ao fato de que o trabalhador sofre interferência de operações de E/S, fazendo com que o Python adormeça e espere por uma resposta. Se houver poucos trabalhadores, o servidor não funciona em capacidade total e, se houver muitos, fica lento. O número de trabalhadores depende dos núcleos do processador e você pode ver seu número usando o utilitário nproc. A documentação do Gunicorn aconselha seguir a seguinte fórmula: N trabalhadores = Número de núcleos x 2 + 1. Ou seja, para um VPS com dois núcleos obtemos 5 trabalhadores. Se o processador tiver 1 núcleo, então, de acordo com a fórmula, teremos 3 trabalhadores.
  • A opção -b ou –bind vincula o Gunicorn a um endereço IP específico do seu VPS e porta. Você também pode executar o servidor web localmente no endereço 127.0.0.1 ou em todas as interfaces de rede de uma só vez até 0.0.0.0.
  • 7777 é o número da porta na qual seu aplicativo está sendo executado. Assim, você deve configurá-lo explicitamente no navegador, por exemplo, se o seu IP no VPS for 10.10.10.10, então no navegador você precisará inserir http://10.10.10.10:7777
  • wsgi é o nome do seu script sem .py e app é o nome da função. Isso dirá ao Gunicorn onde procurar a função que tratará a solicitação do navegador.

Para executar o gunicorn, você também pode usar a opção sock, isso economiza recursos do VPS sem ocupar portas. Mas isso fica a seu critério, neste guia use ip e porta. A linha de lançamento da meia ficará assim:

gunicorn --workers 3 --bind unix:diegapp.sock -m 007 wsgi:app

Para verificar se seu aplicativo está funcionando corretamente, use o utilitário curl:

curl --unix-socket /home/diegdev/diegapp.sock localhost

Etapa 10: configure o Gunicorn para iniciar automaticamente

Configurar o Gunicorn para iniciar automaticamente via systemd está além do escopo deste artigo. Usamos o poder do próprio servidor Gunicorn para rodar em segundo plano.

Vamos iniciá-lo como um daemon usando a tecla D. Também indicaremos que seu aplicativo processa solicitações apenas para o host local (porta 7777) – isso impedirá que invasores obtenham acesso ao nosso servidor.

gunicorn -D --workers 3 --bind 127.0.0.1:7777 wsgi:app

Nada deve aparecer na linha de comando, ao contrário da inicialização normal. Para garantir que o gunicorn esteja funcionando, use o utilitário ps e você verá 4 processos em execução:

ps -ef | grep gunicorn
...
diegdev    11570   11569  0 21:55 ?        00:00:00 /home/diegdev/diegapp/diegappenv/bin/python3 /home/diegdev/diegapp/diegappenv/bin/gunicorn -D --workers 3 --bind 127.0.0.1:7777 wsgi:app
...

Etapa 11: Configurando o proxy Nginx para o aplicativo Flask

Instalar Nginx:

sudo apt install nginx

A seguir, configuramos um domínio virtual, em nosso exemplo dieg.dev.

sudo nano /etc/nginx/sites-available/dieg.dev.conf

O arquivo dieg.dev.conf deve conter no mínimo as seguintes linhas:

server {
    listen 80;
    server_name dieg.dev;

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:7777;
    }
}

A seguir, habilitamos nosso domínio no Nginx criando um link simbólico para o arquivo. Verifique se há erros e reinicie o Nginx.

sudo ln -s /etc/nginx/sites-available/dieg.dev.conf /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Todos! Agora seu aplicativo está disponível para todo o mundo.

Para cumprir os padrões de segurança, é aconselhável instalar um certificado SSL gratuito. A instalação do SSL Let’s Encrypt está além do escopo deste artigo, mas não deve ser um problema para você. Você precisa instalar o programa certbot. Deixe-me dar brevemente os comandos para nosso exemplo com o domínio dieg.dev:

sudo apt install python3-certbot-nginx
sudo certbot --nginx -d dieg.dev

Respondemos às perguntas da última equipe. Como resultado, as configurações do domínio virtual no Nginx serão alteradas, o Nginx será reiniciado automaticamente e você verá um ícone de conexão segura no site do seu navegador.

Conclusão

Você deve entender que a implantação de aplicativos Python requer um conhecimento mais profundo do desenvolvedor do que, por exemplo, hospedagem PHP com um site WordPress. Nem todo suporte técnico do provedor de hospedagem que você escolher se encarregará de executar sua aplicação Python e muito menos de otimizar seu desempenho. No contexto do exemplo acima, o mínimo que precisa ser feito é configurar o Nginx para servir arquivos estáticos, instalar um certificado SSL e determinar o número ideal de trabalhadores para Nginx e Gunicorn dependendo das características do seu VPS/VDS. Para implantar e executar com sucesso seus aplicativos Python, considere usar provedores de hospedagem VPS/VDS comprovados.

Preços para hospedagem Python: Se você pesquisar no Google a pergunta comum sobre o custo de hospedagem de um bot do Telegram em Python que consome 300 MB de RAM, não encontrará uma resposta específica na Internet. Espero que meu artigo tenha lhe dado uma dica de por que não existe tal resposta.

Dmytro Yakovenko
Leave a Reply

Your email address will not be published. Required fields are marked *