Despliegue de aplicación flask en un servidor LAMP
Vamos a desplegar nuestra aplicación web desarrollada con flask en un servidor LAMP (Linux+Apache2+mysql+python) en un sistema operativo GNU/Linux Ubuntu 16.04.
Configuración del servidor
Después de actualizar los paquetes del sistema:
$ sudo apt-get update
$ sudo apt-get upgrade
Hacemos la instalación del servidor web y del servidor de bases de datos:
$ sudo apt-get install apache2 mysql-server libapache2-mod-wsgi-py3
Configuración de la base de datos
Vamos a crear un usuario y una base de datos con la que vamos a a trabajar:
$ mysql -u root -p
mysql> create database tienda;
mysql> GRANT ALL ON tienda.* TO usuario IDENTIFIED BY 'usuario';
Además vamos a configurar nuestra aplicación para que trabaje con mysql, para ello en el fichero aplicacion\config.py
modificamos el motor de base de datos con el que vamos a trabajar, indicando las credenciales del usuario y la base de datos:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://ususario:usuario@localhost/tienda'
Por último añadimos en el fichero requirements.txt
el paquete que me permite que python trabaje con mysql:
...
PyMySQL==0.7.11
Despliegue de la aplicación:
clonamos la rama lamp
del repositorio: https://github.com/josedom24/tienda_videojuegos.git
, lo hacemos como superusuario en el directorio /var/www/html
:
$ sudo su -
$ cd /var/www/html
$ git clone https://github.com/josedom24/tienda_videojuegos.git -b lamp
Como usuario sin privilegios vamos a crear un entorno virtual, donde vamos a instalar las dependencias de nuestra aplicación:
$ sudo apt-get install python-virtualenv
$ mkdir venv
$ cd venv/
~/venv$ virtualenv -p /usr/bin/python3 flask
~/venv$ source flask/bin/activate
(flask) ~/venv$ pip install -r /var/www/html/tienda_videojuegos/requirements.txt
Creamos las tablas, añadimos los datos de ejemplo y creamos al usuario administrador:
(flask)$ cd /var/www/html/tienda_videojuegos
(flask)$ python3 manage.py create_tables
(flask)$ python3 manage.py add_data_tables
(flask)$ python3 manage.py create_admin
En el directorio /var/www/html/tienda_viedojuegos
hemos creado nuestra aplicación WSGI en el fichero app.wsgi
, donde activamos el entorno virtual que hemos creado:
import sys
sys.path.insert(0, '/var/www/html/tienda_videojuegos')
activate_this = '/home/ubuntu/venv/flask/bin/activate_this.py'
with open(activate_this) as file_:
exec(file_.read(), dict(__file__=activate_this))
from aplicacion.app import app as application
Por último configuramos apache2 modificando el virtualhost del fichero ˋ/etc/apache2/sites-available/000-default.confˋ:
...
DocumentRoot /var/www/html/tienda_videojuegos/aplicacion
WSGIDaemonProcess tienda user=www-data group=www-data threads=5
WSGIScriptAlias / /var/www/html/tienda_videojuegos/app.wsgi
<Directory /var/www/html/tienda_videojuegos/aplicacion>
WSGIProcessGroup tienda
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
...
Donde definimos el proceso WSGI con la directiva WSGIDaemonProcess
e indicamos el fichero donde se encuentra la aplicación WSGI con la directiva WSGISrctiptAlias
, además de dar los permisos de acceso necesarios.
Terminamos reiniciando el servidor:
$ sudo systemctl restart apache2
Y probamos el acceso a la aplicación: