Despliegue en Microsoft Azure: Flask +
PostgreSQL + Nginx
Objetivo:
Desplegar una aplicación web hecha en Python (Flask), usando PostgreSQL como base de datos y
Nginx como proxy inverso, todo en una máquina virtual Ubuntu en Microsoft Azure .
Requisitos previos
Cuenta en Azure Portal
Tener activa la suscripción gratuita con $200 USD
Tu código listo localmente (el mismo que ya
implementaste en Ubuntu)
Conocimiento básico de terminal Linux
1. Crear una Máquina Virtual en Azure
Paso 1: Ir a "Virtual Machines"
• En Azure Portal → Menú ☰ → Virtual Machines → Crear → Máquina virtual
Paso 2: Configurar los siguientes campos:
Nombre flask-app-server
Región Selecciona algo cerca de ti (ej.Este de EE. UU.)
Imagen Ubuntu Server 22.04 LTS
Tamaño B1s(gratuito dentro del límite gratuito)
Puerto de entrada público HTTP (80)yHTTPS (443)
Autenticación Usa SSH (si trabajas desde Linux/Mac) o Contraseña (si usas Windows)
✅ El tamaño B1s está incluido en el Tier Gratuito de Azure.
Paso 3: Crear la VM
Una vez creada, copia la Dirección IP pública asignada. La usarás para acceder desde internet.
2. Conectar a la VM vía SSH
Desde tu terminal local:
bash
1
ssh usuario@tu_ip_publica
3. Instalar dependencias necesarias
bash
sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv nginx postgresql postgresql-contrib git -y
4. Subir tu código a la VM
Puedes usar Git si tu proyecto está en GitHub/GitLab:
bash
1
2
git clone https://github.com/tuusuario/tuprojecto.git
cd tuproyecto
O subirlo manualmente con scp desde tu PC local:
bash
1
scp -r ./mi_app_web usuario@tu_ip_externa:/home/usuario/
5. Configurar entorno Python
bash
1
2
3
4
cd mi_app_web
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Si no tienes requirements.txt, instala manualmente:
bash
1
pip install flask gunicorn psycopg2-binary
6. Configurar PostgreSQL
bash
1
sudo -u postgres psql
Dentro de psql:
sql
1
2
3
4
5
6
7
CREATE DATABASE tu_basedatos;
CREATE USER tu_usuario WITH PASSWORD 'tu_contraseña';
ALTER ROLE tu_usuario SET client_encoding TO 'utf8';
ALTER ROLE tu_usuario SET default_transaction_isolation TO 'read committed';
ALTER ROLE tu_usuario SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE tu_basedatos TO tu_usuario;
\q
Edite su archivo config.py o app.py con las credenciales correctas.
7. Probar la aplicación con Gunicorn
bash
1
gunicorn --bind 0.0.0.0:5000 app:app
Desde tu navegador visita:
1
http://tu_ip_publica:5000
Presiona Ctrl+C para detener.
8. Configurar Gunicorn como servicio systemd
Crea el archivo:
bash
1
sudo nano /etc/systemd/system/flaskapp.service
Contenido:
ini
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Gunicorn instance for Flask App
After=network.target
[Service]
User=tu_usuario
Group=www-data
WorkingDirectory=/home/tu_usuario/mi_app_web
Environment="PATH=/home/tu_usuario/mi_app_web/venv/bin"
ExecStart=/home/tu_usuario/mi_app_web/venv/bin/gunicorn --workers 3 --bind unix:flaskapp.sock
-m 007 app:app
[Install]
WantedBy=multi-user.target
Guarda y ejecuta:
bash
1
2
3
sudo systemctl daemon-reload
sudo systemctl start flaskapp
sudo systemctl enable flaskapp
9 Configurar Nginx como proxy inverso
bash
1
sudo nano /etc/nginx/sites-available/flaskapp
Contenido:
nginx
1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name tu_ip_publica;
location / {
proxy_pass http://unix:/home/tu_usuario/mi_app_web/flaskapp.sock:/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Activa la configuración:
bash
1
2
3
sudo ln -s /etc/nginx/sites-available/flaskapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
¡Listo!
Ahora puedes acceder a tu aplicación desde cualquier lugar:
1
http://tu_ip_publica
📝 Notas importantes
• Al igual que en GCP, tu IP pública puede cambiar al reiniciar la VM. Para evitarlo, ve a:
• Direcciones IP públicas → Asigna una dirección fija
• Puedes automatizar el proceso con scripts, Docker o incluso usar Azure App Services
(menos flexible pero más rápido)
¿Qué más podemos hacer?
¿Te gustaría ahora?
• Agregar dominio propio y HTTPS con Let's Encrypt
• Usar Azure Database for PostgreSQL (servicio gestionado)
• Hacer respaldos automáticos
• Preparar una guía paso a paso para tus alumnos
Dime cómo quieres seguir
¡Estoy aquí para ayudarte con lo que necesites! 😊
Ahora dejame leer esto
Qwen3-235B-A22B7:53 pm
¡Perfecto! Tómate tu tiempo para revisar la información. Si tienes dudas, necesitas ayuda con algún
paso específico o quieres adaptar esto para tus estudiantes, estaré aquí para ti.
Éxito en tu implementación en Azure ☁️
¡Cuando estés listo, seguimos! 😊