CAPÍTULO 9 · El mismo proyecto llega a Azure
Preparar una entrega que tenga una forma conocida
El proyecto de trabajo contiene elementos que no pertenecen al servidor: el entorno virtual local, archivos temporales y valores privados, entre otros. Copiarlo sin criterio mezcla la aplicación con el contexto del computador. La entrega necesita un inventario deliberado para que podamos reconocer qué estamos publicando.
En el procedimiento del autor preparamos SensorHub con su código y staticfiles, y colocamos requirements.txt tanto dentro como en la raíz de la carpeta de entrega. Ambas copias proceden de la misma fuente. Generamos deploy.zip conservando esa estructura y relacionamos el arranque con la carpeta anidada. Las dependencias de Linux se instalarán en el destino; no enviamos el venv de Windows.
El ZIP es ahora un artefacto que podemos inspeccionar, identificar y conservar. También sabemos qué debe configurarse para usar estáticos ya preparados. Falta transferirlo mediante una operación que realmente publique la aplicación. La primera ruta que revisamos es la que el equipo prefiere en su trabajo: las herramientas avanzadas disponibles en App Service.
Leer esta parte dentro del relato completo →DEL RELATO A LA PRÁCTICA
Vamos a desarrollar esta decisión con su mapa, explicación, código y ejercicio.
LABORATORIO DE CONFIGURACIÓN
Prepara tu estación de despliegue
Cambia el entorno, el servidor y la identidad para comparar sus responsabilidades.

Simulación didáctica. Los valores son ejemplos: no crea recursos, no inicia sesión ni publica archivos. Sin JavaScript, consulta la tabla y los pasos de la lección.
MIRA · CONECTA · COMPRENDE
La maleta del despliegue
Las flechas resumen el recorrido conceptual. Los controles y dependencias se detallan debajo.
Selecciona una pieza para destacar su responsabilidad.
Leer la explicación del mapa
- Commit. Identifica código revisado
- Inventario. Excluye secretos y venv
- ZIP. Conserva raíz correcta
- Hash. Identifica el artefacto
01 / EL PROBLEMA
¿Para qué sirve?
Una carpeta envolvente o un requirements.txt ausente cambia lo que detecta el constructor. El error de importación puede aparecer mucho después del empaquetado.
02 / COMPRENDER
El concepto, explicado
El autor prepara una carpeta de entrega con requirements.txt en la raíz y SensorHub/ dentro. Esta última contiene manage.py, config/, apps/, templates/, static/, staticfiles/ y otra copia de requirements.txt. La copia exterior permite detectar e instalar dependencias; la interior conserva el proyecto autocontenido. Ambas se generan desde el mismo archivo y no se editan por separado.
La disposición habitual de ZIP Deploy pone manage.py y requirements.txt directamente en la raíz. Aquí enseñamos deliberadamente la variante anidada del equipo: necesita un comando de arranque con --chdir SensorHub y estáticos preconstruidos. No agregues además una carpeta contenedora deploy/ al ZIP.
El paquete incluye código y estáticos recolectados, nunca el venv de Windows. Azure construye sus propias dependencias Linux con SCM_DO_BUILD_DURING_DEPLOYMENT=true. En esta variante se fija DISABLE_COLLECTSTATIC=true porque STATIC_ROOT ya viene preparado; no desactives la instalación de dependencias por haber ejecutado collectstatic localmente.
El script incluido scripts/package_deploy.py empaqueta esta academia pública con una lista explícita de componentes. Si lo adaptas a otro proyecto, incorpora todas sus apps y recursos. Rechaza sobrescribir el ZIP anterior y exige staticfiles/staticfiles.json. La revisión de secretos dentro del código sigue siendo responsabilidad del equipo.
No copies db.sqlite3 para convertir la base local en producción. Tras desplegar, aplica las migraciones con la cuenta y entorno apropiados. En esta academia ejecuta además sync_catalog; para un servicio real planifica almacenamiento durable y recuperación. Conserva commit y SHA256 junto al artefacto.
03 / CONSTRUIR
Implementación paso a paso
- Guardar y revisar los cambios en VS Code y Git; identificar el commit de la entrega.
- Ejecutar collectstatic con el backend manifest de producción y comprobar que terminó sin errores.
- Construir deploy.zip con el script o preparar SensorHub/ manualmente. Excluir venv, .env, credenciales y bases locales.
- Copiar requirements.txt desde una sola fuente a la raíz y dentro de SensorHub/.
- Inspeccionar el ZIP y registrar su SHA256; comprobar que no hay una envoltura adicional.
- Configurar --chdir SensorHub, build de dependencias y estáticos preconstruidos en App Service.
04 / APLICAR
Ejemplo en SensorHub
# PowerShell, desde la raíz de esta academia y con el venv activo.
# Preparar las variables requeridas por production.py sin publicarlas.
python manage.py collectstatic --noinput --settings=config.settings.production
if ($LASTEXITCODE -ne 0) { throw "collectstatic falló" }
python scripts/package_deploy.py --output ../deploy.zip
if ($LASTEXITCODE -ne 0) { throw "No se creó el paquete" }
python -m zipfile -l ../deploy.zip
Get-FileHash ../deploy.zip -Algorithm SHA256
# El archivo anterior no se sobrescribe: conserva o mueve el release previo.
# Estructura INTERNA esperada:
# requirements.txt
# SensorHub/manage.py
# SensorHub/requirements.txt
# SensorHub/config/...
# SensorHub/academy/... (o las apps de tu proyecto)
# SensorHub/static/...
# SensorHub/staticfiles/staticfiles.json
# SensorHub/staticfiles/... (incluidos archivos con hash)
# Si ya preparaste MANUALMENTE una carpeta de entrega limpia:
# Desde esa carpeta, sin incluir otra envoltura:
# Compress-Archive -Path .\SensorHub, .\requirements.txt -DestinationPath ..\deploy.zip
# Startup en App Service Linux (WSGI):
# gunicorn --chdir SensorHub config.wsgi:application --bind 0.0.0.0:8000
# Alternativa ASGI, con daphne instalado:
# cd SensorHub && daphne -b 0.0.0.0 -p 8000 config.asgi:applicationCómo leer el ejemplo
- collectstatic prepara los archivos; no instala paquetes en Azure.
- La raíz del ZIP contiene requirements.txt para el build y SensorHub para el código.
- --chdir hace que config sea importable desde la subcarpeta.
- El script es para el proyecto descargado; adapta su lista INCLUDE si cambian las apps.
Error habitual
Copiar solo el ZIP al explorador, o duplicar requirements.txt sin ajustar el arranque, no completa un despliegue.
05 / PRACTICAR
Tu turno
Tu ZIP contiene deploy/SensorHub/config/wsgi.py y arrancas con --chdir SensorHub. ¿Qué revisarías?
Ver solución orientativa
Hay una carpeta envolvente adicional. Genera el ZIP desde el contenido de la carpeta de entrega para dejar SensorHub y requirements.txt en la raíz; después comprueba el listado y el comando de arranque.
06 / VERIFICAR
Cómo sabes que funciona
- El manifiesto y los estáticos recolectados están presentes.
- Las dos copias de requirements.txt coinciden.
- No se incluyeron .env, venv ni la base local.
- El startup apunta a la estructura interna del ZIP.
Para profundizar
Documentación oficial para comprobar configuración, permisos y condiciones vigentes. Revisión del tema: 11 de octubre de 2026.
CONTINUAR LA EXPERIENCIA
El siguiente paso del recorrido:
Herramientas avanzadas: carga manual y ZIP alojado →Continuar en modo relato