<!-- 34 -->
<!-- apache ambiente virtual con venv -->
<p>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:</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code class="code_lightMode">cd /var/www/
</code></pre>

<p>Clonamos el proyecto a desplegar</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true" class="code_lightMode"># 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
</code></pre>

<p>
  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:
</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true" class="code_lightMode"># 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
</code></pre>
<p>
  Dentro del proyecto, asegúrate de que exista un archivo con la extensión .wsgi, cuyo contenido debe ser similar al
  siguiente, considera: <br>
<ul>
  <li>Nombre del proyecto.</li>
  <li><a class="link" data-bs-toggle="modal" data-bs-target="#python_version">Versión de Python.</a></li>
</ul>

</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true" class="code_lightMode"># 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
</code></pre>

<p>
  Nos movemos al directorio de configuración de Apache:
</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code class="code_lightMode">cd /etc/apache2/sites-available/
</code></pre>

<p>
  Creamos el archivo de configuración con extensión .conf
</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true" class="code_lightMode"># ejemplo
sudo nano ejemplo.com.conf
</code></pre>

<p>
  Dentro del archivo debemos incluir una configuración similar a la siguiente. Consideraciones:
<ul>
  <li>Ruta de tu proyecto</li>
  <li>Nombre del proceso: Debe ser único y no repetirse en futuros proyectos, o el servicio de Apache se detendrá
    (app-ejemplo).
  </li>
  <li><a class="link" data-bs-toggle="modal" data-bs-target="#linux_num_hilos">Hilos del procesador [threads=6].</a>
  </li>
</ul>
</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true" class="code_lightMode"># Se recomienda NO usar el puerto 80 por seguridad.
# Si decides usar otro puerto, asegúrate de abrirlo en el firewall.
Listen 8084

&lt;VirtualHost *:8084&gt;
	ServerAdmin tu-email@email.com
	ServerName ejemplo.com
	ServerAlias ejemplo.com
	DocumentRoot &sol;var&sol;www&sol;ejemplo.com
	
	WSGIDaemonProcess app-ejemplo user=www-data group=www-data threads=6 python-home=&sol;var&sol;www&sol;ejemplo.com&sol;.venv
	WSGIScriptAlias &sol; &sol;var&sol;www&sol;ejemplo.com&sol;ejemplo.com.wsgi
	
	# dentro de tu proyecto debe existir la carpeta log para que dentro de esa se almacenen los logs
	ErrorLog &sol;var&sol;www&sol;ejemplo.com&sol;log&sol;error.log
	CustomLog &sol;var&sol;www&sol;ejemplo.com&sol;log&sol;access.log combined
	
	&lt;Directory &sol;var&sol;www&sol;ejemplo.com&gt;
		WSGIProcessGroup app-ejemplo
		WSGIApplicationGroup %{GLOBAL}
		#Order deny,allow
		Require all granted
	&lt;&sol;Directory&gt;
	
&lt;&sol;VirtualHost&gt;
</code></pre>
<p>Para verificar la sintaxis del archivo de configuración, ejecuta:</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code>sudo apachectl configtest
# si todo esta bien deberas ver el mensaje: Syntax OK
</code></pre>

<p>Para aplicar los cambios, recarga el servicio de Apache:</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code>sudo systemctl reload apache2</code></pre>

<p>Finalmente, abre un navegador y coloca la IP del servidor de Apache. Si configuraste un puerto diferente al 80, debes
  indicarlo:</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code contenteditable="true">192.160.11.35:8084</code></pre>

<p>Si al recargar Apache aparecen errores o el sitio no carga en el navegador, revisa los logs de Apache o los del
  proyecto:</p>
<pre><i class="bi bi-copy"> Copiar código</i>
<code># Logs de Apache
sudo journalctl -u apache2 --no-pager --lines=50
	
# Logs del proyecto Flask
cat /var/www/ejemplo.com/log/error.log</code></pre>

<div class="alert alert-info" role="alert">
  <span><i class="bi bi-pen-fill"></i> Recomendación:</span>
  <p>El en repositorio de Git guarda los archivos de configuración <b>.wsgi</b> y <b>.conf</b> para que no los estes
    creando cada vez que
    despliegas cambios dentro del proyecto.</p>
</div>