Hospedando aplicações Python (Django/Flask) com Gunicorn
O servidor de desenvolvimento do Django (runserver) e do Flask não são feitos para produção. O caminho padrão é: Gunicorn executando a aplicação, systemd mantendo-a no ar e Nginx na frente.
1. Prepare o sistema
sudo apt update
sudo apt install python3 python3-venv python3-pip nginx -y
sudo adduser --disabled-password --gecos "" app
sudo -iu app
2. Código e ambiente virtual
git clone https://github.com/sua-empresa/seu-projeto.git ~/projeto
cd ~/projeto
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install gunicorn
3. Configurações de produção
Django
No settings.py (ou via variáveis de ambiente):
DEBUG = False
ALLOWED_HOSTS = ["app.seudominio.com.br"]
STATIC_ROOT = BASE_DIR / "staticfiles"
CSRF_TRUSTED_ORIGINS = ["https://app.seudominio.com.br"]
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
python manage.py migrate
python manage.py collectstatic --noinput
Flask
Garanta que o objeto da aplicação esteja acessível (ex.: app em app.py) e que debug esteja desativado.
4. Teste o Gunicorn
# Django
gunicorn --bind 127.0.0.1:8000 projeto.wsgi:application
# Flask
gunicorn --bind 127.0.0.1:8000 app:app
Número de workers: uma referência comum é (2 × vCPUs) + 1.
5. Serviço systemd
Saia do usuário app e crie /etc/systemd/system/projeto.service:
[Unit]
Description=Gunicorn - Projeto
After=network.target
[Service]
User=app
Group=www-data
WorkingDirectory=/home/app/projeto
EnvironmentFile=/home/app/projeto/.env
ExecStart=/home/app/projeto/.venv/bin/gunicorn \
--workers 3 \
--bind unix:/run/projeto/gunicorn.sock \
--umask 007 \
projeto.wsgi:application
RuntimeDirectory=projeto
Restart=always
[Install]
WantedBy=multi-user.target
(Para Flask, troque projeto.wsgi:application por app:app.)
sudo systemctl daemon-reload
sudo systemctl enable --now projeto
sudo systemctl status projeto
6. Nginx
/etc/nginx/sites-available/projeto:
server {
listen 80;
server_name app.seudominio.com.br;
client_max_body_size 20M;
location /static/ {
alias /home/app/projeto/staticfiles/;
}
location /media/ {
alias /home/app/projeto/media/;
}
location / {
proxy_pass http://unix:/run/projeto/gunicorn.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
O Nginx precisa ler os estáticos: ajuste as permissões da pasta pessoal (ex.: sudo chmod 710 /home/app e sudo usermod -aG app www-data) ou coloque estáticos em /var/www.
sudo ln -s /etc/nginx/sites-available/projeto /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app.seudominio.com.br
7. Tarefas em segundo plano
Para filas (Celery, RQ), crie serviços systemd adicionais para os workers, usando Redis como broker.
8. Atualizações
sudo -iu app
cd ~/projeto && git pull
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
exit
sudo systemctl restart projeto
Conclusão
Gunicorn + systemd + Nginx é uma combinação robusta e testada para Python em produção. Hospede sua aplicação em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.