[[start|Nivel superior]] |[[Flask app 3|Parte 3]]|[[Flask app 5|Parte 5]]| ====== 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: [[https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world|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.