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