Deploy de Aplicações Django no Wolke
Overview
Este guia descreve como fazer deploy de aplicações Django no wolke, incluindo configuração de ambiente, base de dados, estáticos, media, Gunicorn, migrações e boas práticas de produção.
About Django
Django é um framework web Python de alto nível que incentiva desenvolvimento rápido e design limpo. Inclui autenticação, ORM, admin e várias funcionalidades “batteries‑included”.
Pré‑requisitos
- Python 3.10+
- Django 4+ (ou 5+)
- Gunicorn
- Git
- Conta wolke
Configuração Inicial no wolke
Para passos comuns a qualquer framework, consulta wolkeSetup.md. O que é específico do Django está detalhado abaixo.
Estrutura Recomendada do Projeto
.
├── manage.py
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── myapp/
│ ├── views.py
│ └── urls.py
├── requirements.txt
└── static/
Exemplo de Aplicação Django
myapp/views.py:
from django.http import JsonResponse
def healthz(request):
return JsonResponse({"status": "ok"})
myapp/urls.py:
from django.urls import path
from .views import healthz
urlpatterns = [
path("healthz/", healthz),
]
myproject/urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("myapp.urls")),
]
requirements.txt (exemplo)
Django>=4.2
Gunicorn>=21.2
django-environ>=0.11
dj-database-url>=2.1
whitenoise>=6.6
psycopg[binary]>=3.1
Configuração do settings.py para Produção
import os
import dj_database_url
DEBUG = os.getenv("DEBUG", "False") == "True"
SECRET_KEY = os.getenv("SECRET_KEY")
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "app.wolke.host").split(",")
CSRF_TRUSTED_ORIGINS = os.getenv("CSRF_TRUSTED_ORIGINS", "https://app.wolke.host").split(",")
DATABASES = {
"default": dj_database_url.config(default=os.getenv("DATABASE_URL"))
}
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware",
# ... outros middlewares
]
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
Variáveis de Ambiente (Django)
Define no painel do wolke:
DJANGO_SETTINGS_MODULESECRET_KEYDEBUG(usarFalseem produção)ALLOWED_HOSTS(ex:app.wolke.host)CSRF_TRUSTED_ORIGINS(ex:https://app.wolke.host)DATABASE_URLREDIS_URL(opcional, cache/Celery)
Exemplo com django-environ
import environ
env = environ.Env()
environ.Env.read_env()
SECRET_KEY = env("SECRET_KEY")
DEBUG = env.bool("DEBUG", default=False)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=["app.wolke.host"])
CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS", default=["https://app.wolke.host"])
DATABASES = {
"default": env.db("DATABASE_URL")
}
Segurança (Checklist)
DEBUG=FalseALLOWED_HOSTSdefinidoCSRF_TRUSTED_ORIGINSdefinidoSECRET_KEYvia variável de ambienteSECURE_SSL_REDIRECT=True(se terminações TLS forem geridas pelo wolke)SESSION_COOKIE_SECURE=TrueeCSRF_COOKIE_SECURE=True
Base de Dados
PostgreSQL (recomendado)
- Define
DATABASE_URL(ex:postgres://user:pass@host:5432/dbname). - Executa migrações após o deploy.
MySQL (opcional)
- Instala driver apropriado (ex:
mysqlclientouPyMySQL). - Define
DATABASE_URLno formato MySQL.
Ficheiros Estáticos
- Usa
collectstaticno build. WhiteNoiseserve estáticos sem configuração extra.
Media Files
- Em produção, recomenda‑se armazenamento externo (S3/MinIO).
- Para persistência, configura um storage backend (ex:
django-storages).
Migrações
Pré‑Deploy Command (recomendado)
Para rodar migrações automaticamente a cada deploy, adiciona este comando no campo Pre‑Deploy Command nas Settings da aplicação (ver imagens):
python manage.py migrate
Health Check
Usa o endpoint /healthz/ e configura o health check no wolke apontando para este caminho.
Logging e Monitorização
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"console": {
"class": "logging.StreamHandler",
}
},
"root": {
"handlers": ["console"],
"level": "INFO",
},
}
Cache (Redis / Memcached)
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": os.getenv("REDIS_URL"),
}
}
Celery (tarefas em background)
- Define
REDIS_URLcomo broker. - Exemplo de comando para worker:
celery -A myproject worker -l info
Se precisares de workers separados, cria um serviço adicional no wolke com esse comando.
Comandos de Deploy
git add .
git commit -m "Deploy Django"
git push origin main
Troubleshooting
Consulta troubleshooting.md para erros comuns.
Links Úteis
- Wolke: https://wolke.host/apps/create
- Django Docs: https://docs.djangoproject.com/