Notas de Luis

Nivel superior

Flask - 4 - Mi entorno

Instalación nueva aplicación flask en mi entorno

Introduction

Tutorial de Desarrollo de una Aplicación con Flask y Gestión con systemd

Referencias: Flask mega tutorial

Flask + Gunicorn + Reverse proxy + nginx

Previo

Procedimiento Detallado para la Instalación y Configuración en Producción usando el software mostrado en el título.

Se asume que la máquina gimli hace de reverse proxy para boromir que es la máquina de producción donde instalaremos la aplicación.

Se asume que la máquina arwen es la de desarrollo.

Se asume que el dominio a servir es example.com.

Configuración del DNS

Modificar la IP asociada al nombre de dominio que hemos comprado para que apunte al la dirección IP externa de nuestra máquina reverse proxy, en este caso es gimli, con la IP 143.47.54.66.

Esto se debe hacer con el usuario y password que nos haya proporcionado nuestro proveedor de dominio.

Configurar sitio simple en gimli por http

Index.html

Crear el fichero /var/www/example/index.html a partir del existente en Dropbox/Archive/Software/index-en-construccion.html.

Configuración

Se crea el nuevo fichero de configuración de nginx en el directorio /etc/nginx/sites-available/example, similar al que sigue, con el nombre del dominio a atender.

server {
    listen 80;                               # Puerto de escucha
    server_name example.com www.example.com; # Nombre del dominio
    root /var/www/example;               # Directorio raíz del sitio web
    index index.html index.htm;              # Archivos de índice
    location / {
        try_files $uri $uri/ =404;           # Sirve archivos estáticos y
    }                                        # muestra un error 404 si no están
}

Nos situamos en el directorio /etc/nginx/sites-enabled y creamos el enlace para activar el sitio:

ln -s ../sites-available/example .

Confirmamos que la configuración es correcta. Damos reload al servidor.

nginx -t
systemctl reload nginx

Test desde internet

En gimli usamos el siguiente comando para supervisar la prueba de acceso.

tail -f /var/log/nginx/*.log

Entrar con el navegador al dominio http://example.com. También al subdominio http://www.example.com. Si muestra la página de en construcción, pues estupendo.

Configurar https

Obtener certificado de letsencrypt

Para usar https debemos tener un certificado y configurar el servidor nginx para usarlo.

Esto se hace en un sólo paso con la utilidad de letsencrypt.

certbot -d example.com --nginx

Con esto se habrá modificado el de configuración de nginx para redirigir el tráfico por el puerto 80 al puerto 443. http a https.

Hay que confirmar que el certificado se renueva automráZZZZticamente.

Test desde internet

Ahora podemos probar con el navegador nuevamente las direcciones del sitio de ejemplo por ambos protocolos.

Configurar sitio simple en boromir por http

Index.html

Crear el directorio /var/www/example. Poner permiso de rwx al grupo, para que el usuario ubuntu pueda actualizar.

Crear el fichero /var/www/example/index.html a partir del existente en Dropbox/Archive/Software/index-en-construccion.html.

Poner alguna nota diferenciadora para que se distinga del de gimli.

Configuración

Se crea el nuevo fichero de configuración de nginx en el directorio /etc/nginx/sites-available/example, similar al que sigue, con el nombre del dominio a atender.

server {
    listen 80;                               # Puerto de escucha
    server_name example.com www.example.com; # Nombre del dominio
    root /var/www/example;               # Directorio raíz del sitio web
    index index.html index.htm;              # Archivos de índice
    location / {
        try_files $uri $uri/ =404;           # Sirve archivos estáticos y
    }                                        # muestra un error 404 si no están
}

Nos situamos en el directorio /etc/nginx/sites-enabled y creamos el enlace para activar el sitio:

ln -s ../sites-available/example .

Confirmamos que la configuración es correcta. Damos reload al servidor.

nginx -t
systemctl reload nginx

Modificar /etc/hosts en gimli

Incluir en la configuración la dirección interna de boromir para que gimli pueda redirigirle el tráfico. Es también necesario porque boromir atiende muchas peticiones de muchos dominios distintos, así que las peticiones no pueden venir por ip, sino por dominio.

10.0.0.210  example.com

Test desde la red local

En gimli usamos el siguiente comando para supervisar la prueba de acceso.

tail -f /var/log/nginx/*.log

Desde gimli (en otra terminal) usar wget para descargar la página index.html de nuestro nuevo sitio web desde boromir.

wget http://example.com
wget http://www.example.com

Redirigir trafico que llega por https a gimli hacia boromir por http

Modificar la configuración de nginx

Básicamente consiste en sustituir la sección location / por las sentencias que siguen, para reenviar todo el tráfico que llegue por el dominio en cuestión hacia la máquina boromir (en conjunción con el fichero /etc/hosts).

location / {
    limit_except GET HEAD POST {deny all;}
    expires -1;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://example.com;
}

Confirmamos que la configuración es correcta. Damos reload al servidor.

nginx -t
systemctl reload nginx

Test desde internet.

Volvemos al navegador y accedemos a http://example.com o https://example.com y debería salirnos la página de indice que hemos preparado en boromir.

Configurar aplicación flask de test en boromir

Crear aplicación de test

Crear el fichero app.py en el directorio /var/www/example/ de boromir, con el siguiente contenido.

====== app.py ======
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello, World! This is a test Flask application.'
if __name__ == '__main__':
    app.run()

Crear el fichero wsgi.py en el mismo directorio, con este contenido:

====== wsgi.py ======
from app import app as application
application.config['ENV'] = 'production'
application.config['DEBUG'] = False

Preparar entorno

Instalar venv y crear el directorio venv donde se instalarán las librerías y los binarios del entorno.

apt-get install python3-venv
cd /var/www/example
python3 -m venv venv

Instalar las librerías python básicas

source venv/bin/activate
pip install Flask gunicorn

Prueba simple

Vamos a comprobar que funciona la aplicación con gunicorn, antes del siguiente paso.

source venv/bin/activate
gunicorn -w 4 -b 127.0.0.1:8000 app:app
gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application

Ajuste

Pasa todo el directorio al usuario www-data. Además hay que asegurarse que el directorio /var/www/example tiene permisos de escritura y ejecución para el grupo.

chown www-data:www-data -R * 
chmod g+rwx /var/www/example

Crear el servicio para systemd usando Gunicorn

Editamos el fichero /etc/systemd/system/example.service y le añadimos el siguiente contenido, cambiando example por el nombre de nuestro dominio.

[Unit]
====== specifies metadata and dependencies ======
Description=Gunicorn instance to serve example
After=network.target
====== tells the init system to only start this after the networking target has been ======
====== reached. We will give our regular user account ownership of the process since ======
====== it owns all of the relevant files ======
[Service]
====== Service specify the user and group under which our process will run. ======
User=www-data
====== give group ownership to the www-data group so that Nginx can communicate ======
====== easily with the Gunicorn processes. ======
Group=www-data
====== We'll then map out the working directory and set the PATH environmental ======
====== variable so that the init system knows where our the executables for the ======
====== process are located (within our virtual environment). ======
WorkingDirectory=/var/www/example/
Environment="PATH=/var/www/example/venv/bin"
====== Environment="CONFIG=config-example" ======
====== We'll then specify the commanded to start the service ======
ExecStart=/var/www/example/venv/bin/gunicorn --workers 3 --bind unix:/var/www/example/example.sock -m 007 wsgi:application
====== This will tell systemd what to link this service to if we enable it to start ======
====== at boot. We want this service to start when the regular multi-user system is ======
====== up and running: ======
[Install]
WantedBy=multi-user.target

Habilitar y iniciar el servicio

sudo systemctl enable example.service
sudo systemctl start example.service

Instalar app buena

Usar el script deploy de las otras aplicaciones. También se encuentra en Dropbox/Attic/Software. Adaptarlo a las necesidades del proyecto en curso.

Después de ejecutar el deploy se debe poder probar con el navegador.

Crear test de aplicación (se ejecuta en gandalf)

Usar uno de los scripts check//ewe, check//arocha etc. Crear uno nuevo y adaptarlo al proyecto en curso. Debe configurarse en el crontab para ejecutar cada hora en modo normal y una vez al día en modo Diario.

El modo normal solo envía mensaje a ntfy si hay errores. El modo Diario envía mensaje siempre, para que al menos una vez al día llegue un mensaje de que el sistema está funcionando.

Revisión scripts de backup

Revisar el script backup-data del directorio /home/ubuntu/copias, para que se incluya la información del proyecto en curso.

computing/web/flask_app_4.txt · Última modificación: por 127.0.0.1