Para subir un proyecto a Apache HTTP Server que está hecho con Flask y VENV, debemos movernos mediante la terminal a la ruta donde se almacenan los proyectos:
Copiar código
cd /var/www/
Clonamos el proyecto a desplegar
Copiar código
# sudo git clone user_serv@ip.del.serv.git:[puerto_si_no_es_el_22]/ruta/al/repositorio
sudo git clone usr1@192.160.11.29:/home/git_server/repos/ejemplo.com
Una vez clonado el repositorio, nos movemos a la carpeta ejemplo.com, creamos un entorno virtual (VENV) e instalamos todas las dependencias listadas en requirements.txt (esto es una buena práctica). Todo lo anterior debe realizarse con permisos de superusuario:
Copiar código
# Entramos en modo superusuario
sudo su
# Nos cambiamos al directorio del proyecto a desplegar
cd /var/www/ejemplo.com
# Iniciamos una instancia de VENV (entorno virtual)
python3 -m venv .venv
# Activamos el nuevo entorno virtual
source .venv/bin/activate
# Instalamos todas las dependencias necesarias
pip install -r requirements.txt
# Una vez instaladas las dependencias, podemos desactivar el entorno virtual con:
deactivate
# Salimos del modo superusuario
exit
Dentro del proyecto, asegúrate de que exista un archivo con la extensión .wsgi, cuyo contenido debe ser similar al
siguiente, considera:
Copiar código
# 1. sys: Se usa para manipular el entorno del sistema y agregar rutas a sys.path.
import sys
# 2. logging: Se usa para registrar eventos y errores, facilitando la depuración.
import logging
# 3. Ruta de Linux al proyecto Flask
sys.path.insert(0, '/var/www/ejemplo.com')
# 4. Ruta de Linux al entorno virtual (verifica la versión de Python en el servidor)
sys.path.insert(0, '/var/www/ejemplo.com/.venv/lib/python3.11/site-packages')
# 5. Configuración de logs
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
# 6. Importamos la aplicación principal de Flask
from main import app as application
Nos movemos al directorio de configuración de Apache:
Copiar código
cd /etc/apache2/sites-available/
Creamos el archivo de configuración con extensión .conf
Copiar código
# ejemplo
sudo nano ejemplo.com.conf
Dentro del archivo debemos incluir una configuración similar a la siguiente. Consideraciones:
Copiar código
# Se recomienda NO usar el puerto 80 por seguridad.
# Si decides usar otro puerto, asegúrate de abrirlo en el firewall.
Listen 8084
<VirtualHost *:8084>
ServerAdmin tu-email@email.com
ServerName ejemplo.com
ServerAlias ejemplo.com
DocumentRoot /var/www/ejemplo.com
WSGIDaemonProcess app-ejemplo user=www-data group=www-data threads=6 python-home=/var/www/ejemplo.com/.venv
WSGIScriptAlias / /var/www/ejemplo.com/ejemplo.com.wsgi
# dentro de tu proyecto debe existir la carpeta log para que dentro de esa se almacenen los logs
ErrorLog /var/www/ejemplo.com/log/error.log
CustomLog /var/www/ejemplo.com/log/access.log combined
<Directory /var/www/ejemplo.com>
WSGIProcessGroup app-ejemplo
WSGIApplicationGroup %{GLOBAL}
#Order deny,allow
Require all granted
</Directory>
</VirtualHost>
Para verificar la sintaxis del archivo de configuración, ejecuta:
Copiar código
sudo apachectl configtest
# si todo esta bien deberas ver el mensaje: Syntax OK
Para aplicar los cambios, recarga el servicio de Apache:
Copiar código
sudo systemctl reload apache2
Finalmente, abre un navegador y coloca la IP del servidor de Apache. Si configuraste un puerto diferente al 80, debes indicarlo:
Copiar código
192.160.11.35:8084
Si al recargar Apache aparecen errores o el sitio no carga en el navegador, revisa los logs de Apache o los del proyecto:
Copiar código
# Logs de Apache
sudo journalctl -u apache2 --no-pager --lines=50
# Logs del proyecto Flask
cat /var/www/ejemplo.com/log/error.log
El en repositorio de Git guarda los archivos de configuración .wsgi y .conf para que no los estes creando cada vez que despliegas cambios dentro del proyecto.