Publicidad

Como Instalar Flask + Gunicorn + Nginx + Docker + Supervisor


Por Alex el 04/06/2025, Comentar el artículo

Comparte este artículo:      




Flask es un framework de python muy utilizado y muy rápido tanto a la hora de desarrollar como en tiempo de ejecución. Es una buena elección para desarrollar aplicaciones web, en este artículo vamos a ver como configurarlo en un servidor Ubuntu


Antes de empezar a soltar el rollo voy a describir las partes que tiene este artículo, por que es largo, y así tienes una visión amplia de lo que vas a leer. También por si no te gusta, no sigues.

Que vamos a ver en este artículo.

Voy a crear un entorno paso a paso para desarrollar en Flask con Docker utilizando Ubuntu, nginx, supervisor y finalmente Gunicorn:

  • Crear un entorno de desarrollo con docker
    • Creación de un fichero Dockerfile
    • Creación de un fichero docker-compose.yml
    • Creación de los ficheros de nginx y supervisor para desarrollo.

  • Creación del entorno de python para poder construir una aplicación con Flask, por ejemplo un blog. En este artículo solo crearé una página para dejar el entorno en marcha.

    A partir de aquí se pueden utilizar para cualquier proyecto en Flask.

  • Una vez funciones el proyecto en el entorno de desarrollo lo pasaremos a producción, básicamente es cambiar la forma de ejecución de Flask por Gunicorn, porque en desarrollo solo lo hacemos funcionar con Flask


Como siempre dejo el código del proyecto en el repositorio de git.

Este es el repo https://github.com/depruebas/blogFlaskOnlyDocker.git

Lo puedes descargar y así ir repasando lo que comento en el artículo … pero primero …


Requisitos para el proyecto

Como he comentado antes vamos a ver en este artículo cómo funcionan en conjunto una serie de aplicaciones para crear aplicaciones web y ponerla en funcionamiento en un entorno de producción.

En el proyecto va a utilizar:
  • Docker
  • docker-compose
  • Flask
  • nginx
  • supervisor, para iniciar, detener y reiniciar servicios de manera controlada
  • gunicorn, servidor HTTP para aplicaciones Python WSGI que funciona con nginx
  • Ficheros de configuración para supervisor, nginx y gunicorn
Todo lo voy a ir instalando paso a paso para que sea sencillo de seguir y aprender.


Instalar docker para el proyecto

Como vamos a trabajar siempre con un entorno de desarrollo dockerizado necesitas instalar Docker y aplicaciones necesarias para trabajar con Docker.

Bajo esta líneas está lo que hay que instalar para tener Docker funcionando en Linux, para Mac hay que bajarse el .img e instalarlo. Pero aun no lo instales con "las ansias" y lee primero que a lo mejor has de cambiar algo.


sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu noble stable" sudo apt-get update

Esta primera parte de configuración de repositorios y claves con el tiempo puede variar, en el web oficial de docker encontrarás las especificaciones de instalación más actualizadas https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

La que viene si que hay que instalarla como sigue para no dejarse nada porque hay aplicaciones que no están en la documentación oficial arriaba indicada.


sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose docker-compose-plugin python3-setuptools

sudo usermod -aG docker ${USER}
sudo chown $USER /var/run/docker.sock




¿Y donde lo busco? Muy buena pregunta que acabas de hacer … en el siguiente fichero /etc/os-release y tienes que buscar UBUNTU_CODENAME=noble

Ubuntu codename

Aclarado esto ejecutamos el script para instalar docker.

Después de ejecutar estas instrucciones que las puedes poner en un script y ejecutarlo comprobamos que se ha creado correctamente.

Para esto ejecutamos la siguiente instrucción desde el terminal. En Mac también.

docker ps

Y tiene que verse así

docker ps -  muestra contenedores activos

Si no sale esto puedes probar a ejecutar manualmente docker

sudo /etc/init.d/docker start

En Mac se inicializa desde el Docker Desktop

Una vez hecho esto, instaladas las herramientas de docker creamos el proyecto.


Crear el entorno de desarrollo con docker.

Para esto crea un directorio donde quieras, por ejemplo en el escritorio mismo, yo lo he llamado blogFlask.

Lo mejor y para ir más rápido dentro del directorio blogFlask clona el proyecto blogFlaskOnlyDocker

git clone https://github.com/depruebas/blogFlaskOnlyDocker.git

Ahora abre el proyecto con un editor de texto, yo utilizo Visual Studio Code, para ver los archivos que contiene.

Para crear el entorno de desarrollo con un servidor Ubuntu Server + nginx necesitamos los siguientes ficheros que puedes ver en el proyecto que has descargado:

  • docker/Dockerfile, define el entorno de desarrollo con Ubuntu Server e instalar aplicaciones necesarias para trabajar como nginx, supervisor, etc.
  • docker/config/nginx.conf, fichero de configuración de nginx para ver el proyecto web desde http
  • docker/config/supervisord.conf, fichero de configuración para arrancar y parar diferentes servicios, en este caso nginx y Flask
  • docker-compose.yml, fichero desde donde se inicia el entorno y donde definimos puertos, redes, rutas
  • docker/Makefile, para ejecutar comandos docker de forma sencilla.
Los ficheros están comentados para que se pueda seguir fácilmente lo que se está haciendo. Para crear el entorno se hace con la instrucción

docker-compose up -d

Dentro del directorio nginx pero aún no pruebes esto porque está todo automatizado en un fichero Makefile que ahora te explico.

En el raiz del directorio hay un fichero Makefile con las instrucciones para ejecutar los contenedores de la siguiente manera::

  • make start arranca los contenedores, ahora solo hay uno, el de nginx, pero podría haber más.
  • make stop para los contenedores
  • make down para y destruye los contenedores.
  • make web, entra dentro del contenedor web, en el servidor que ha creado y se puede trabajar como con un servidor Ubuntu. Donde más adelante instalaremos Flask.
  • make build reconstruye los contenedores. Build se tiene que hacer siempre que se modifique el fichero Dockerfile o ficheros de configuración. Y después hacer un make start para arrancarlos.

Para ejecutar por primera vez el entorno entras en el directorio dockers (../blogFlask/blogFlaskOnlyDocker/dockers/) y ejecuta estos dos comandos uno detrás de otro.

make build
make start

Si todo funciona correctamente después de make start podéis mirar los dockers con el comando:

docker ps



docker ps -  muestra contenedores activos

Si algo falla y aquí no se muestra nada y aparece vacío como cuando se instaló docker, ejecuta el comando

docker ps -a

Que muestra los dockers que están parados, si está ahí es posible que haya dado algún error, entonces, mirar el log

docker logs CONTAINER ID

Y te dirá que error puede estar ocurriendo en la creación del contenedor o la ejecución de los servicios.

También revisa que no tengas otros contenedores en ejecución que entren en conflicto, como por ejemplo puertos.

Si todo ha funcionado bien y el contenedor está en marcha poner esta url en el navegador:

Comprobamos en el navegador que la url del proyecto funciona


Configuración una aplicación Flask.

Ahora que tenemos el entorno funcionando entra dentro del servidor web con el comando

make web

para trabajar con la consola del servidor web.

En la consola tendrías que estar en algo como esto:

Secuencia de arranque del contenedor

La imagen es la secuencia completa de arranque del entorno completo make build -> make start -> make web

los ficheros que se ven con ls -l tienen que coincidir con los que hay en el directorio src/

Ahora en este directorio creamos el proyecto python, empezamos creando un entorno virtual

python -m venv venv

Esto crea un directorio llamado venv y ahora tenemos que activarlo para trabajar dentro del entorno de python

source venv/bin/activate

Cuando lo activemos manualmente delante del prompt en el terminal aparece el nombre del entorno

Entorno python activado

Creamos un nuevo directorio llamado app donde pondremos el código de la aplicación Flask.

Estructura de directorios proyecto Python

E instalamos Flask en el entorno virtual

pip install Flask

Ahora dentro del directorio app creamos un fichero llamado main.py y dentro ponemos el siguiente código en Python/Flask:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
	return '¡Hola Mundo desde Flask!'

if __name__ == '__main__':
	app.run(debug=True)


En este punto del proyecto desde el explorador de archivos del Visual Studio Code ahora mismo tendrías que tener esto:

Estructura de directorios proyecto desde Visual Studio Code

Si utilizas otro editor de texto el árbol de visionado de archivos tiene que ser similar. Ya tenemos creado el código python y ahora vamos a probarlo.

Primero vamos a mirar qué servicios está ejecutando supervisor

sudo supervisorctl

Servicios de Supervisor

Y tiene que salir algo como en la imagen. Da un error porque cuando arrancamos el contenedor el entorno de python venv no existía, lo hemos creado después

Estos dos servicios que se ven flask_blog y nginx están definidos en el fichero de configuración de supervisord.conf con la etiqueta program:

[program:flask_blog]
...

[program:nginx]
...

Ahora solo hay que reiniciarlo desde supervisor

restart flask_blog

Servicios de Supervisor funcionando correctamente

Ahora hay que borrar la configuración de nginx por defecto

sudo rm /etc/nginx/sites-enabled/default

Que es la que al principio servía los archivos html, para la aplicación flask más adelante se tiene que configurar para que sirva ficheros estáticos.

Y solo queda reiniciar la configuración de nginx.

sudo nginx -t
sudo /etc/init.d/nginx reload

Ahora poniendo la url en el navegador http://127.0.0.1:9082 debería verse algo como esto:

Url serviendo flask el archivo main.py



Paso a producción con Gunicorn.

Y nos queda ver como seria llevarlo a un entorno de producción porque ejecutar el proyecto con Flask esta bien para desarrollar pero en un entorno de producción hay que utilizar un servidor HTTP para aplicaciones web en Python que implementa la interfaz WSGI

En este caso Gunicorn que lo configuraremos en supervisor para que trabaje con nginx y Flask.

Lo primero que hay que hacer es instalarlo, tenemos que asegurarnos que el entorno de desarrollo de python está activado y sino antes activarlo

source /var/www/html/venv/bin/activate
pip install gunicorn

Ahora cambia los datos de configuración de supervisor que esta en dockers/nginx/docker/config/supervisord.conf, en la etiqueta flask_blog por estos:

[program:flask_blog]
command=/var/www/html/venv/bin/gunicorn -w 4 -b 127.0.0.1:8001 main:app
directory=/var/www/html/app
environment=FLASK_ENV="development",PATH="/var/www/html/venv/bin"
autostart=true
autorestart=true

Y para sabe que todo funciona cambia también el texto del fichero main.py que muestra por pantalla.


return '¡Hola Mundo desde Flask 423423!'

Ahora reiniciamos servicios

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart flask_blog



Servicios de Supervisor funcionando correctamente

Podemos ver si gunicorn está funcionando ejecutando

ps aux | grep gunicorn

Si no sale nada es que no funciona bien

Y si ponemos de nuevo la url tiene que salir la bienvenida desde python

Web funcionando correctamente


Conclusión .

No es muy complicado instalar y configurar en un entorno dockerizado Flask + Gunicorn + Nginx y hacerlos funcionar todos juntos, solo hay que seguir unos pequeños pasos para configurarlo todo bien.

Gunicorn no es necesario pero es interesante tenerlo en desarrollo pero es imprescindible tenerlo en producción.

Como recordatorio final, recordar que todos los comandos hay que ejecutarlos dentro del servidor de Ubuntu aunque se puede editar todo el código desde el host con un editor como sublime text o Visual Studio Code.


Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN


ARCHIVO

Publicidad

.