Migra los settings de TicketFlow al entorno. Sin solutions.md hasta entregar.
Ejercicio 1 — Auditoría de configuración
- Lista TODA la config de tu proyecto: la que está en settings.py como literal, la que lee de env vars, la que hay en código de vistas/servicios (un
requests.get("https://...")con URL hardcodeada es config escondida). - Clasifica cada una: código (no varía), config sensible (secreto), config no sensible (varía pero no es secreto), y bad config (literal que DEBE variar y está clavada).
- Mueve las bad config al entorno con defaults seguros. El test:
git grep -n "https://" -- '*.py'devuelve solo URLs de documentación.
Ejercicio 2 — settings.py 12-factor
- Convierte tu settings.py a un solo módulo con django-environ (o pydantic-settings): SECRET_KEY/DEBUG/ALLOWED_HOSTS/DATABASE_URL/REDIS_URL del entorno, defaults seguros.
- Escribe el
.env.example(sin valores reales) y el.envde dev (gitignored). Un compañero debe poder clonar y arrancar solo concp.env.example.env+ valores locales. - La prueba de la misma imagen: escribe el Dockerfile (40 lo profundiza) con UNA imagen y arranca 3 contenedores con 3.env. Mismo hash de imagen, tres configs.
Ejercicio 3 — Rotación dual
- Implementa
SECRET_KEYS(lista con nueva + vieja opcional) y haz que el validador de tokens/simplejwt acepte cualquiera de la lista. - Escribe la secuencia de rotación como checklist de 5 pasos con la ventana de tiempo entre el paso 2 (deploy dual) y el 5 (retirar la vieja). ¿Qué pasa con los tokens emitidos con la clave vieja durante la ventana?
- Haz lo mismo para
WEBHOOK_SECRETde la 17 (verificación HMAC acepta clave nueva y vieja).
Ejercicio 4 — Fail-fast
- Añade las validaciones de arranque (SECRET_KEY, ALLOWED_HOSTS, DATABASE_URL obligatorios fuera de DEBUG) con
ImproperlyConfiguredy mensajes que digan QUÉ variable falta y DÓNDE se documenta. - Test de humo:
manage.py check --deploycon entorno de prod fake (vars seteadas en el test) pasa; con DJANGO_DEBUG=true en prod fake, falla con error claro. - Documenta en el README el "triage de arranque": las 3 variables más comunes que faltan y su síntoma exacto al arrancar.
Ejercicio 5 — Config por feature flag
- Añade
FEATURE_WEBHOOKS(bool) yFEATURE_SAGA_V2(bool) como flags de config (no de código): leídos del entorno, default false, usados conif settings.FEATURE_WEBHOOKS:en el servicio. - Escribe el test que corre la misma prueba con flag on y off. ¿Qué gana esto frente a un branch de git por entorno?
Entrega
Pega el settings.py, el.env.example, la checklist de rotación y el test de humo. Después: Lección 28 — Refactorizar sin romper nada.