Saltar a contenido

Guía de Despliegue (Producción)

Esta sección documenta los pasos de infraestructura y comandos necesarios para desplegar IntranetV2 en producción utilizando Waitress (servidor WSGI), NSSM (gestión de servicios) y Nginx (proxy inverso).

[!IMPORTANT] Aviso Importante: Los bloques de configuración y comandos mostrados a continuación corresponden a un ejemplo aplicado en el servidor de QA. Las rutas, puertos, nombres de dominio y certificados SSL están configurados específicamente para dicho entorno. Es estrictamente necesario que revise y ajuste estos valores de acuerdo a la infraestructura real de su servidor antes de ejecutarlos.


Paso 1: Prerrequisitos del Servidor

Antes de inicializar el despliegue, el servidor de aplicaciones Windows Server 2022 debe cumplir con la instalación base de la infraestructura descrita en la sección de Stack:

  1. Nginx: Instalado en C:\nginx\nginx-1.26.3\ (ver Nginx).
  2. NSSM: Instalado en C:\nssm\nssm2.24\ (ver NSSM).
  3. Git: Instalado y configurado en el PATH (ver Git).
  4. Runtimes: Python 3.11.6 instalado globalmente y controladores de Microsoft SQL Server configurados.

Paso 2: Preparación del Código y Entorno

1. Clonar el repositorio en producción Ubíquese en el directorio del servidor de aplicaciones (ej. C:\PROY_PY\) y clone el repositorio:

cd C:\PROY_PY
git clone https://github.com/luis1grupoiai/intranetv2.git
cd intranetv2

2. Crear entorno virtual e instalar dependencias

python -m venv venv
.\venv\Scripts\activate
pip install -r requirements.txt
pip install waitress

3. Configurar variables de entorno (.env) Cree un archivo .env en la raíz del proyecto. Defina los siguientes parámetros de producción obligatorios:

DEBUG=False
SECRET_KEY=su_llave_secreta_de_produccion
DATABASE_URL=mssql://usuario_db:password@servidor_sql/nombre_db
ALLOWED_HOSTS=iaidev.grupo-iai.com.mx
CSRF_TRUSTED_ORIGINS=https://iaidev.grupo-iai.com.mx:333

4. Recolectar archivos estáticos Ejecute la compilación de recursos estáticos:

.\venv\Scripts\python.exe manage.py collectstatic --noinput --settings=config.settings.production

Paso 3: Configurar Servicios con NSSM

Para asegurar que los procesos de Waitress (servidor web) y QCluster (colas de tareas) se ejecuten en segundo plano y se reinicien automáticamente en caso de fallo, se registran como servicios nativos de Windows.

1. Instalar servicios Ejecute desde una terminal con privilegios de administrador:

cd C:\nssm\nssm2.24
.\nssm.exe install Intranetv2
.\nssm.exe install Queues

2. Configurar parámetros en NSSM Configure los servicios utilizando la interfaz gráfica de NSSM (nssm edit <NombreServicio>) bajo las siguientes directivas:

Parámetro Servicio: Intranetv2 Servicio: Queues
Path C:\PROY_PY\intranetv2\venv\Scripts\waitress-serve.exe C:\PROY_PY\intranetv2\venv\Scripts\python.exe
Startup directory C:\PROY_PY\intranetv2 C:\PROY_PY\intranetv2
Arguments --port=8081 --threads=12 config.wsgi:application manage.py qcluster --settings=config.settings.production
Stdout Log C:\nssm\nssm2.24\logs\intranetv2\intranetv2-out.log C:\nssm\nssm2.24\logs\intranetv2\queue_out.log
Stderr Log C:\nssm\nssm2.24\logs\intranetv2\intranetv2-error.log C:\nssm\nssm2.24\logs\intranetv2\queue_error.log

3. Iniciar los servicios

cd C:\nssm\nssm2.24
.\nssm.exe start Intranetv2
.\nssm.exe start Queues

Paso 4: Configurar Nginx

1. Definir Upstream Añada la conexión a Waitress en el archivo global C:\nginx\nginx-1.26.3\conf\conf.d\globals\00-upstreams.conf:

upstream intranet_v2_srv {
    server 127.0.0.1:8081; # Puerto expuesto por Waitress
}

2. Certificados SSL En PowerShell, combine el certificado y la ca-bundle en un archivo de cadena completa (Full Chain):

Get-Content certificate.crt, ca_bundle.crt | Set-Content fullchain.crt

3. Configurar Servidor Virtual Cree el archivo de configuración intranetv2.conf dentro del directorio C:\nginx\nginx-1.26.3\conf\conf.d\servers\django\:

server {
    listen 81;
    server_name iaidev.grupo-iai.com.mx;

    return 301 https://$host:333$request_uri;
}

server {
    listen 333 ssl;
    http2 on;

    server_name iaidev.grupo-iai.com.mx;

    include conf.d/snippets/large_headers.conf;

    client_max_body_size 100M;

    access_log logs/intranet_v2.access.log vhost_combined;
    error_log logs/intranet_v2.error.log warn;

    location /static/ {
        alias C:/PROY_PY/intranetv2/static/;
        include conf.d/snippets/static_cache.conf;
    }

    location /media/ {
        alias C:/PROY_PY/intranetv2/media/;
        include conf.d/snippets/static_cache.conf;
    }

    location /api/ {
        proxy_pass http://intranet_v2_srv;
        include conf.d/snippets/proxy_common.conf;
    }

    location / {
        proxy_pass http://intranet_v2_srv/;
        include conf.d/snippets/proxy_common.conf;
    }
}

4. Recargar Nginx Verifique la sintaxis y recargue el servicio para aplicar los cambios:

cd C:\nginx\nginx-1.26.3
.\nginx.exe -t
.\nginx.exe -s reload

Paso 5: Verificación de Despliegue (Sanity Check)

Para certificar que el despliegue es correcto, realice las siguientes comprobaciones:

1. Estado de Servicios: Abra services.msc en Windows Server y confirme que los servicios Intranet V2 y Queues Intranetv2 están en estado Ejecutando (Running) y configurados en tipo de inicio Automático.

2. Conexión HTTP/HTTPS: Acceda a la URL configurada https://iaidev.grupo-iai.com.mx:333/ desde un navegador web externo y confirme que el sitio web carga y los recursos estáticos (estilos CSS, imágenes) se visualizan correctamente.

3. Logs: Revise que no haya errores de inicio en C:\nssm\nssm2.24\logs\intranetv2\intranetv2-error.log.


Paso 6: Mantenimiento y Actualizaciones

Para subir cambios nuevos al servidor de producción en el día a día:

1. Bajar cambios

git pull

2. Migrar base de datos

.\venv\Scripts\python.exe manage.py migrate --settings=config.settings.production

3. Recolectar estáticos

.\venv\Scripts\python.exe manage.py collectstatic --noinput --settings=config.settings.production

4. Reiniciar Servicios

nssm restart Intranetv2
nssm restart Queues

Paso 7: Diagnóstico de Errores (Logs)

Si el sistema presenta fallas o no responde, revise las salidas de logs del servidor en las siguientes rutas homologadas:

  • Logs del Servidor Web (Nginx):
    • Errores generales de arranque: C:\nginx\nginx-1.26.3\logs\error.log
    • Logs de acceso de Intranet V2: C:\nginx\nginx-1.26.3\logs\intranet_v2.access.log
    • Logs de error de Intranet V2: C:\nginx\nginx-1.26.3\logs\intranet_v2.error.log
  • Logs de Aplicación (Waitress / NSSM):
    • Salida estándar: C:\nssm\nssm2.24\logs\intranetv2\intranetv2-out.log
    • Salida de error: C:\nssm\nssm2.24\logs\intranetv2\intranetv2-error.log
  • Logs del Worker de Colas (QCluster / NSSM):
    • Salida estándar: C:\nssm\nssm2.24\logs\intranetv2\queue_out.log
    • Salida de error: C:\nssm\nssm2.24\logs\intranetv2\queue_error.log
  • Logs Internos de Django:
    • Directorio de logs del proyecto: C:\PROY_PY\intranetv2\logs\ (si se encuentra activo un handler de archivos en los settings de producción).

[!TIP] Gestión de Librerías: Si instala algo nuevo, recuerde actualizar el archivo: pip freeze > requirements.txt (o agrégalo manualmente para mantenerlo limpio).