Deploy Django em VPS: Guia Completo
Aprenda a fazer deploy de um projeto Django em VPS com Gunicorn, Nginx, PostgreSQL e HTTPS. Configuração completa para produção
Introdução
Fazer o deploy de uma aplicação Django em um servidor VPS (Virtual Private Server) oferece controle total sobre a infraestrutura e geralmente é mais econômico que plataformas como Heroku ou Railway para projetos em produção.
Neste guia, vamos configurar um servidor VPS completo com Ubuntu, PostgreSQL, Gunicorn e Nginx, incluindo certificado HTTPS gratuito com Let’s Encrypt.
Pré-requisitos
- Um servidor VPS com Ubuntu 22.04 ou superior (DigitalOcean, Linode, Vultr, etc.)
- Um domínio apontando para o IP do servidor
- Acesso SSH ao servidor
- Um projeto Django funcional localmente
Preparando o servidor
Conecte-se ao servidor via SSH:
ssh root@seu-ip-do-servidor
Atualize o sistema e instale pacotes essenciais:
apt update && apt upgrade -y
apt install -y python3-pip python3-venv python3-dev \
postgresql postgresql-contrib nginx \
certbot python3-certbot-nginx \
git supervisor
Criando um usuário para a aplicação
Nunca rode aplicações como root. Crie um usuário dedicado:
adduser deploy
usermod -aG sudo deploy
su - deploy
Configurando o PostgreSQL
Crie o banco de dados e o usuário:
sudo -u postgres psql
No shell do PostgreSQL:
CREATE DATABASE meu_projeto;
CREATE USER meu_usuario WITH PASSWORD 'senha_segura_aqui';
ALTER ROLE meu_usuario SET client_encoding TO 'utf8';
ALTER ROLE meu_usuario SET default_transaction_isolation TO 'read committed';
ALTER ROLE meu_usuario SET timezone TO 'America/Sao_Paulo';
GRANT ALL PRIVILEGES ON DATABASE meu_projeto TO meu_usuario;
\q
Clonando o projeto
cd /home/deploy
git clone https://github.com/seu-usuario/seu-projeto.git
cd seu-projeto
Configurando o ambiente virtual
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
pip install gunicorn psycopg2-binary
Variáveis de ambiente
Crie o arquivo .env na raiz do projeto:
SECRET_KEY=sua-chave-secreta-muito-longa-e-aleatoria
DEBUG=False
ALLOWED_HOSTS=seu-dominio.com.br,www.seu-dominio.com.br
DATABASE_URL=postgresql://meu_usuario:senha_segura_aqui@localhost:5432/meu_projeto
No settings.py, use a biblioteca python-decouple ou django-environ para carregar as variáveis:
from decouple import config
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])
Migrações e arquivos estáticos
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py createsuperuser
Configurando o Gunicorn
O Gunicorn é o servidor WSGI que vai rodar a aplicação Django. Teste primeiro manualmente:
gunicorn --bind 0.0.0.0:8000 config.wsgi:application
Se funcionar, configure o Supervisor para mantê-lo rodando como serviço. Crie o arquivo /etc/supervisor/conf.d/meu_projeto.conf:
[program:meu_projeto]
command=/home/deploy/seu-projeto/venv/bin/gunicorn --workers 3 --bind unix:/home/deploy/seu-projeto/gunicorn.sock config.wsgi:application
directory=/home/deploy/seu-projeto
user=deploy
autostart=true
autorestart=true
stderr_logfile=/var/log/meu_projeto/error.log
stdout_logfile=/var/log/meu_projeto/access.log
Crie a pasta de logs e inicie o serviço:
sudo mkdir -p /var/log/meu_projeto
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start meu_projeto
O número de workers recomendado é (2 x numero_de_cpus) + 1. Para um servidor com 1 CPU, use 3 workers.
Configurando o Nginx
O Nginx funciona como proxy reverso, recebendo requisições HTTP e encaminhando para o Gunicorn. Crie o arquivo /etc/nginx/sites-available/meu_projeto:
server {
listen 80;
server_name seu-dominio.com.br www.seu-dominio.com.br;
location /static/ {
alias /home/deploy/seu-projeto/staticfiles/;
}
location /media/ {
alias /home/deploy/seu-projeto/media/;
}
location / {
proxy_pass http://unix:/home/deploy/seu-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;
}
}
Ative o site e teste a configuração:
sudo ln -s /etc/nginx/sites-available/meu_projeto /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Acesse seu domínio no navegador. A aplicação Django deve estar funcionando.
Configurando HTTPS com Let’s Encrypt
O certificado SSL é gratuito e essencial para qualquer site em produção:
sudo certbot --nginx -d seu-dominio.com.br -d www.seu-dominio.com.br
O Certbot configura automaticamente o Nginx para HTTPS e redireciona HTTP para HTTPS. O certificado é renovado automaticamente.
Para verificar a renovação automática:
sudo certbot renew --dry-run
Configurações de segurança no Django
Atualize o settings.py para produção:
# Seguranca
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
Configurando o firewall
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Isso permite apenas SSH (porta 22) e tráfego web (portas 80 e 443).
Atualizando a aplicação
Crie um script deploy.sh para facilitar atualizações:
#!/bin/bash
cd /home/deploy/seu-projeto
git pull origin main
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo supervisorctl restart meu_projeto
echo "Deploy concluido!"
Torne executável:
chmod +x deploy.sh
Para atualizar, basta executar ./deploy.sh.
Monitoramento
Verifique o status dos serviços:
# Status do Gunicorn
sudo supervisorctl status meu_projeto
# Logs de erro
sudo tail -f /var/log/meu_projeto/error.log
# Logs do Nginx
sudo tail -f /var/log/nginx/error.log
Conclusão
O deploy de Django em VPS exige mais configuração manual do que plataformas gerenciadas, mas oferece controle total e custo previsível. Com Gunicorn servindo a aplicação, Nginx como proxy reverso e Let’s Encrypt fornecendo HTTPS gratuito, você tem uma infraestrutura robusta para produção. Lembre-se de manter o servidor atualizado, fazer backups regulares do banco de dados e monitorar os logs para garantir que tudo funcione corretamente.