153 lines
5.7 KiB
HTML

<!-- 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>