DAPW · Tarea
VIAJE-ESTUDIOS:EVALUABLE
Instrucciones
Publica la aplicación de votación del viaje de estudios con Flask, Gunicorn y Nginx. Debes construir la imagen de la aplicación, crear una red de Docker y arrancar los dos contenedores mediante comandos.
Descarga 6-Viaje-estudios-votacion.zip desde los materiales. Incluye el código de Flask, wsgi.py, las dependencias y la plantilla HTML. Tendrás que crear el Dockerfile y la configuración de Nginx.
Antes de empezar: corrección de la plantilla
El ZIP original necesita el ajuste comunicado en clase: mueve la carpeta templates al interior de app, de modo que la plantilla quede en app/templates/index.html.
Para que el código busque la plantilla en esa ubicación, cambia en app.py la inicialización Flask(__name__, template_folder="../templates") por Flask(__name__). Si ya habías construido la imagen, vuelve a construirla y crea de nuevo el contenedor después del cambio.
1. Crear el Dockerfile de la aplicación
Dentro de app/, prepara un Dockerfile con estos requisitos:
- Utiliza la imagen base
python:3.14.0-alpine3.22. - Establece
/appcomo directorio de trabajo. - Instala las dependencias de
requirements.txtsin caché y copia el código, incluida la carpetatemplates. - Declara el puerto
8000. - Arranca Gunicorn escuchando en
0.0.0.0:8000y cargandowsgi:app. El comando de referencia esgunicorn -b 0.0.0.0:8000 wsgi:app.
2. Construir la imagen
Construye la imagen desde la carpeta app/ y asígnale el nombre viaje-estudios. Comprueba que la construcción termina correctamente.
3. Crear la red
Crea una red de Docker llamada webnet. Los dos contenedores deberán conectarse a ella para comunicarse por su nombre.
4. Arrancar Flask con Gunicorn
Ejecuta la imagen viaje-estudios en un contenedor llamado fiesta_app, conectado a webnet. El puerto 8000 se utilizará dentro de la red; el acceso desde el navegador se hará a través de Nginx.
Revisa docker logs fiesta_app y comprueba que Gunicorn está escuchando en el puerto indicado.
5. Configurar y arrancar Nginx
Crea el archivo nginx/default.conf con la configuración de un proxy inverso:
- Escucha en el puerto
80y utilizaserver_name app.localhost;. - Reenvía las peticiones de
/ahttp://fiesta_app:8000. - Envía las cabeceras
Host,X-Real-IP,X-Forwarded-ForyX-Forwarded-Proto.
Arranca un contenedor llamado nginx_proxy con la imagen nginx:1.27-alpine, conectado a webnet. Publica el puerto 8080 del equipo hacia el 80 del contenedor y monta tu archivo de configuración en /etc/nginx/conf.d/default.conf en modo de solo lectura.
6. Comprobar el funcionamiento
- Abre
http://localhost:8080/y comprueba que puedes votar y que se actualizan los resultados. - Consulta
http://localhost:8080/health: debe responder con{"status":"ok"}. - Si aparece un error
502, revisa los nombres de los contenedores, su conexión awebnety la dirección del proxy. Si la página no responde, revisa el mapeo8080:80y los logs.
Entrega
Adjunta el enlace a tu repositorio de GitHub con el proyecto y un README.md que incluya:
- Los comandos utilizados en los seis pasos, en el orden necesario para reproducir la práctica.
- Una captura de la aplicación funcionando en
http://localhost:8080/. - Una explicación de entre tres y cinco líneas sobre por qué el acceso público pasa por Nginx y cuál es su función delante de Flask y Gunicorn.
Evaluación
- Dockerfile y arranque con Gunicorn: 3 puntos.
- Red de Docker y ejecución de los contenedores: 2 puntos.
- Nginx como proxy inverso: 3 puntos.
- README, captura y explicación: 2 puntos.
Ampliación opcional, hasta 2 puntos: añade dos cabeceras de seguridad en Nginx, por ejemplo X-Content-Type-Options, X-Frame-Options o Referrer-Policy.