Entrada

Desplegar una aplicación básica

Flask: Desplegar una aplicación básica

Flask es uno de los frameworks más usados para construir APIs y aplicaciones web ligeras en Python. Pero el verdadero desafío no es solo crear la app, sino desplegarla correctamente en producción.

En este post vamos a ver cómo desplegar una app Flask de forma profesional usando Gunicorn + Nginx en un servidor Linux (Ubuntu), y además cómo hacerlo con Docker.

1. Preparar la app Flask

Este es un ejemplo simple:

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hola desde Flask!"

if __name__ == "__main__":
    app.run()

2. Configuración para producción (Gunicorn)

El comando flask run es solo para desarrollo. En producción se usa Gunicorn:

1
2
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app
  • -w 4 = 4 workers
  • app:app = archivo app.py y variable app

3. Servir con Nginx (recomendado)

Instalar Nginx

1
2
sudo apt update
sudo apt install nginx

Configurar Nginx

Crea un archivo:

1
sudo nano /etc/nginx/sites-available/myflask

Y pega:

1
2
3
4
5
6
7
8
9
10
11
12
server {
  listen 80;
  server_name tu-dominio.com;

  location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Luego activa el sitio:

1
2
3
sudo ln -s /etc/nginx/sites-available/myflask /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

4. Ejecutar Flask como servicio (systemd)

Crea un servicio para que la app se inicie automáticamente:

1
sudo nano /etc/systemd/system/flask.service

Pega:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Gunicorn instance to serve Flask app
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/home/usuario/myflask
Environment="PATH=/home/usuario/myflask/venv/bin"
ExecStart=/home/usuario/myflask/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app

[Install]
WantedBy=multi-user.target

Inicia el servicio:

1
2
sudo systemctl start flask
sudo systemctl enable flask

Deploy con Docker 🐳 (opción moderna)

Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]

Build & Run

1
2
docker build -t myflask .
docker run -d -p 8000:8000 myflask

Bonus: SSL con Let’s Encrypt

Una vez con Nginx funcionando:

1
2
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx

Y listo, tu app queda con HTTPS.

Desplegar Flask no es difícil, pero hacerlo bien requiere separar:

  • desarrollo (flask run)
  • producción (Gunicorn + Nginx)

En otros artículos, veremos:

  • un deploy más avanzado (con Docker Compose + CI/CD)
  • un deploy con Railway / Render (más simple)
Esta entrada está licenciada bajo CC BY 4.0 por el autor.