Guia

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

4 min de leitura

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.