---
title: "Deploy Django em VPS: Guia Completo"
url: "https://python.dev.br/guias/deploy-django-vps/"
markdown_url: "https://python.dev.br/guias/deploy-django-vps.MD"
description: "Aprenda a fazer deploy de um projeto Django em VPS com Gunicorn, Nginx, PostgreSQL e HTTPS. Configuração completa para produção"
date: "2025-11-24"
author: ""
---

# 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:

```bash
ssh root@seu-ip-do-servidor
```

Atualize o sistema e instale pacotes essenciais:

```bash
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:

```bash
adduser deploy
usermod -aG sudo deploy
su - deploy
```

## Configurando o PostgreSQL

Crie o banco de dados e o usuário:

```bash
sudo -u postgres psql
```

No shell do PostgreSQL:

```sql
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

```bash
cd /home/deploy
git clone https://github.com/seu-usuario/seu-projeto.git
cd seu-projeto
```

### Configurando o ambiente virtual

```bash
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:

```bash
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:

```python
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

```bash
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:

```bash
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`:

```ini
[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:

```bash
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`:

```nginx
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:

```bash
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:

```bash
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:

```bash
sudo certbot renew --dry-run
```

## Configurações de segurança no Django

Atualize o `settings.py` para produção:

```python
# 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

```bash
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:

```bash
#!/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:

```bash
chmod +x deploy.sh
```

Para atualizar, basta executar `./deploy.sh`.

## Monitoramento

Verifique o status dos serviços:

```bash
# 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.

Se o seu projeto exige alta concorrência no backend, considere complementar o Django com microsserviços em <a href="https://golang.com.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'golang.com.br', content: 'deploy-django-vps'})">Go</a> ou <a href="https://rustlang.com.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'rustlang.com.br', content: 'deploy-django-vps'})">Rust</a> para os endpoints mais críticos.
