Avançado 15 min de leitura 01/09/2026

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

PlataformaComo configurar
VercelSettings → Environment Variables
RenderDashboard → Environment → Add Variable
RailwayProject → 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=False confirmado no ambiente de produção
  • SECRET_KEY gerada e guardada como variável de ambiente
  • ALLOWED_HOSTS com o domínio real
  • ☐ Banco PostgreSQL configurado com DATABASE_URL
  • migrate rodado no ambiente de produção
  • collectstatic rodado
  • python manage.py check --deploy sem 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!