Deploy de aplicações Django em produção: checklist completo
Checklist completo de deploy Django: segurança, banco, arquivos estáticos e Gunicorn
Subir um projeto Django em produção envolve mais do que fazer upload dos arquivos. Banco de dados, variáveis de ambiente, arquivos estáticos, segurança — cada item faltando pode derrubar a aplicação ou expor dados dos seus usuários. Este checklist cobre tudo que você precisa verificar antes de ir ao ar.
1. DEBUG = False e SECRET_KEY no ambiente
Nunca, em hipótese alguma, suba DEBUG=True para produção. Com debug ativo, um erro expõe o código-fonte, variáveis de ambiente e estrutura do banco para qualquer pessoa na internet.
# settings.py
import os
DEBUG = os.getenv("DEBUG", "False") == "True"
SECRET_KEY = os.getenv("SECRET_KEY") # nunca hardcode
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")
Gere uma SECRET_KEY segura com: python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
2. Banco de dados: PostgreSQL
pip install psycopg2-binary dj-database-url
import dj_database_url
DATABASES = {
"default": dj_database_url.config(
default=os.getenv("DATABASE_URL"),
conn_max_age=600, # reutiliza conexões por 10 min
conn_health_checks=True # descarta conexões mortas
)
}
3. Arquivos estáticos com Whitenoise
pip install whitenoise
# settings.py
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware", # logo abaixo de Security
...
]
STORAGES = {
"staticfiles": {
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage"
},
...
}
# Antes de subir o código
python manage.py collectstatic --noinput
4. Migrations em produção
Nunca rode makemigrations em produção — só migrate. Migrations devem ser geradas localmente, commitadas no repositório e aplicadas no deploy.
# No pipeline de deploy (Render, Railway, Vercel build command):
python manage.py migrate --noinput
5. Checklist de segurança
O Django tem um comando que verifica os principais pontos de segurança:
python manage.py check --deploy
As configurações que ele valida:
SECURE_HSTS_SECONDS = 31536000 # força HTTPS por 1 ano
SECURE_SSL_REDIRECT = True # redireciona HTTP → HTTPS
SESSION_COOKIE_SECURE = True # cookie só via HTTPS
CSRF_COOKIE_SECURE = True # idem para CSRF
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = "DENY"
6. Servindo a aplicação: Gunicorn
O servidor de desenvolvimento manage.py runserver não aguenta carga real. Em produção, use Gunicorn:
pip install gunicorn
gunicorn config.wsgi:application \
--workers 3 \
--bind 0.0.0.0:8000 \
--log-level info
Regra de bolso para workers: 2 × CPUs + 1. Em serviços com 1 CPU, use 3.
7. Variáveis de ambiente por plataforma
| Plataforma | Como configurar |
|---|---|
| Vercel | Settings → Environment Variables |
| Render | Dashboard → Environment → Add Variable |
| Railway | Project → Variables |
| VPS (Linux) | /etc/environment ou arquivo .env com systemd |
8. Logs e monitoramento
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"console": {"class": "logging.StreamHandler"},
},
"root": {
"handlers": ["console"],
"level": "WARNING",
},
"loggers": {
"django": {
"handlers": ["console"],
"level": os.getenv("DJANGO_LOG_LEVEL", "ERROR"),
"propagate": False,
},
},
}
Checklist final antes do go-live
- ☐
DEBUG=Falseconfirmado no ambiente de produção - ☐
SECRET_KEYgerada e guardada como variável de ambiente - ☐
ALLOWED_HOSTScom o domínio real - ☐ Banco PostgreSQL configurado com
DATABASE_URL - ☐
migraterodado no ambiente de produção - ☐
collectstaticrodado - ☐
python manage.py check --deploysem erros - ☐ HTTPS ativo no domínio
- ☐ Logs configurados
- ☐ Backup do banco agendado
Com esse checklist em mãos, você tem tudo o que precisa para ir ao ar com segurança. Bom deploy!