# Guía de Despliegue en Apache 2.4 (Windows)

Esta guía detalla los pasos para publicar la aplicación web de diferencias y ajustes de Aloha en un servidor de producción que utilice **Apache 2.4** y el motor WSGI de producción **Waitress** para Windows.

---

## Estrategia de Despliegue: Proxy Reverso
Dado que las aplicaciones de Python/Flask requieren un intérprete de Python activo y establecen conexiones de base de datos permanentes a través de pyodbc, la forma estándar, más segura y de mejor rendimiento para ejecutarlas en Windows detrás de Apache 2.4 es un **Proxy Reverso**:
1. La aplicación Flask se ejecuta en segundo plano como un servicio de Windows usando **Waitress** en un puerto interno (por ejemplo, el puerto `5000`).
2. **Apache 2.4** recibe las solicitudes en el puerto estándar `80` (o `443` HTTPS) y las redirige internamente a la aplicación de Python.

Hemos adaptado el código del frontend (`index.html` y `app.js`) para usar **rutas relativas**. Esto significa que la aplicación funcionará de forma inmediata tanto si la publicas en la raíz del servidor como en una subcarpeta (por ejemplo: `http://servidor/diferencias_aloha/`).

---

## Requisitos Previos en el Servidor de Producción

1. **Python 3.13** (o similar) instalado. Asegúrate de marcar la casilla *"Add Python to PATH"* durante la instalación.
2. **Origen de Datos ODBC**: El DSN del sistema llamado `aloha` debe estar correctamente configurado en la herramienta "Orígenes de datos ODBC (64 bits)" en Windows, apuntando a la base de datos `RPJALOHA`.
3. **NSSM (Non-Sucking Service Manager)**: Una herramienta gratuita y estándar para convertir cualquier script de Python en un servicio de Windows. Descárgala de [nssm.cc](https://nssm.cc/).

---

## Paso 1: Copiar los Archivos a `htdocs`

1. Copia toda la carpeta del proyecto `Diferencias_aloha` dentro del directorio `htdocs` de tu servidor Apache. Por ejemplo:
   `C:\Apache24\htdocs\diferencias_aloha\`

La estructura en el servidor destino debe quedar así:
```text
C:\Apache24\htdocs\diferencias_aloha\
  ├── app.py
  ├── run_production.py
  ├── requirements.txt
  ├── GNDTNDR (1).dbf
  ├── templates/
  │    └── index.html
  └── static/
       ├── style.css
       └── app.js
```

---

## Paso 2: Instalar Dependencias en el Servidor

Abre una terminal de PowerShell como Administrador, navega a la carpeta de la aplicación y ejecuta:
```powershell
cd C:\Apache24\htdocs\diferencias_aloha
pip install -r requirements.txt
```
*Esto instalará `Flask`, `pyodbc` (con rueda precompilada), `dbf`, `dbfread` y el servidor de producción `waitress`.*

---

## Paso 3: Configurar NSSM para Correr el Servicio de Windows

Para asegurar que la aplicación Python se ejecute siempre en segundo plano y se inicie automáticamente con el sistema, configúrala como un servicio:

1. Descarga y extrae `nssm.exe` (selecciona la carpeta `win64`).
2. Abre la consola de comandos (cmd) como Administrador y ejecuta:
   ```cmd
   C:\ruta\donde\extraiste\nssm.exe install aloha_reportes
   ```
3. Se abrirá una interfaz gráfica de NSSM. Rellena los campos con los siguientes valores:
   - **Path**: Ruta a tu ejecutable de Python (por ejemplo, `C:\Users\TuUsuario\AppData\Local\Programs\Python\Python313\python.exe` o `C:\Program Files\Python313\python.exe`). Puedes obtenerla escribiendo `where python` en la consola.
   - **Startup directory**: `C:\Apache24\htdocs\diferencias_aloha`
   - **Arguments**: `run_production.py`
4. Ve a la pestaña **Details** y pon:
   - **Display name**: `Servicio Reportes Aloha`
   - **Startup type**: `Automatic`
5. Haz clic en **Install service**.
6. Inicia el servicio desde la consola de Windows (`Start-Service aloha_reportes` en PowerShell) o desde la ventana de servicios de Windows (`services.msc`).

---

## Paso 4: Configurar Apache 2.4 como Proxy Reverso

Ahora configuraremos Apache para redirigir el tráfico del exterior hacia nuestra aplicación que corre en segundo plano en el puerto `5000`.

1. Abre el archivo de configuración de tu Apache: `C:\Apache24\conf\httpd.conf`
2. Busca y asegúrate de descomentar (quitar el `#` al principio) las siguientes líneas para habilitar los módulos de proxy:
   ```apache
   LoadModule proxy_module modules/mod_proxy.so
   LoadModule proxy_http_module modules/mod_proxy_http.so
   ```
3. Al final del archivo (o dentro del VirtualHost correspondiente si usas dominios), agrega las siguientes directivas para crear la ruta de la aplicación:
   ```apache
   # Redirección obligatoria para asegurar la barra diagonal al final (evita que fallen los estilos y JS)
   RedirectMatch 301 ^/diferencias_aloha$ /diferencias_aloha/

   # Configuración de proxy para Diferencias Aloha (notar la barra diagonal al final de las rutas)
   ProxyPass /diferencias_aloha/ http://127.0.0.1:5000/
   ProxyPassReverse /diferencias_aloha/ http://127.0.0.1:5000/
   
   # Opcional: configurar tiempos de espera para consultas SQL muy pesadas
   ProxyTimeout 300
   ```
4. Guarda el archivo y reinicia el servicio de Apache 2.4:
   ```cmd
   httpd -k restart
   ```

---

## Paso 5: Probar el Despliegue

Abre tu navegador desde cualquier computadora conectada a la red del servidor y accede a:
👉 **`http://ip-del-servidor/diferencias_aloha/`**

La página cargará el panel de control. El cliente JS buscará los endpoints relativos como `/diferencias_aloha/api/stores`, lo cual Apache redirigirá transparentemente a tu servidor Waitress de Python.

---

## Seguridad y Protocolos de Robustez Aplicados

Se han implementado y liberado controles de seguridad robustos (alineados con el estándar OWASP) para asegurar que la aplicación cumpla con las políticas de producción en entornos corporativos:

1. **Prevención de Inyecciones SQL**: 
   - Las consultas directas a SQL Server están parametrizadas al 100% utilizando marcadores de posición (`?`).
   - Se añadió un validador estricto de entradas en el backend que rechaza solicitudes si el `store_id` no es estrictamente numérico o si el formato de la fecha no cumple el formato regex `^\d{4}-\d{2}-\d{2}$` (YYYY-MM-DD).
2. **Mitigación de Vulnerabilidades HTTP (Seguridad de Cabeceras)**:
   - Se incorporó la cabecera **`Content-Security-Policy` (CSP)** restrictiva para evitar la inyección de scripts externos dañinos.
   - Cabecera **`X-Frame-Options: DENY`** para evitar ataques de secuestro de clic (Clickjacking).
   - Cabecera **`X-Content-Type-Options: nosniff`** para evitar ataques de adivinación de tipo MIME (MIME Sniffing).
   - Cabecera **`X-XSS-Protection`** activa en modo bloqueo y política segura de Referrers.
3. **Seguridad contra Cross-Site Scripting (XSS)**:
   - Toda información dinámica traída desde el backend o las respuestas de la base de datos se sanitizan en el navegador mediante una función de escape de caracteres HTML antes de ser inyectada en el DOM.
4. **Validación de Carga de Archivos**:
   - Al procesar el DBF, se valida que la extensión sea exclusivamente `.dbf` y se guarda bajo un nombre estático estricto para evitar ataques de Directory Traversal o ejecución remota de código.

---

## Resolución de Problemas: Error DSN aloha (Círculo Rojo)

Si al desplegar la aplicación visualizas el mensaje **"Error DSN aloha"** en rojo en la esquina superior derecha, esto indica que el servidor web de Python no pudo establecer la conexión ODBC con SQL Server. Sigue estos pasos para solucionarlo:

1. **Revisa la Arquitectura**:
   - Si tu Apache y tu Python se ejecutan como procesos de **64 bits**, debes crear el DSN de sistema en el Administrador de Orígenes de Datos ODBC de **64 bits** (`odbcad32.exe` en `C:\Windows\System32`). Si son de 32 bits, debes crearlo en la herramienta de 32 bits (`C:\Windows\SysWOW64\odbcad32.exe`).
2. **Revisa las Credenciales del DSN**:
   - Asegúrate de que el DSN de sistema se llame exactamente `aloha`.
   - Si utilizas autenticación de SQL Server, asegúrate de que el usuario `rpjaloha` tenga la contraseña correcta `KkeL7by%&!!OO`.
3. **Alternativa (Conexión sin DSN Físico / String Directo)**:
   - Si no quieres configurar el DSN de sistema de forma manual, puedes configurar la variable de entorno `ODBC_CONN_STR` en tu servidor o sistema para que se conecte directamente usando el controlador ODBC de SQL Server sin requerir que crees el DSN en el Panel de Control.
   - Ejemplo de cadena de conexión directa para Windows:
     `Driver={ODBC Driver 17 for SQL Server};Server=IP_O_NOMBRE_SERVIDOR_SQL;Database=RPJALOHA;Uid=rpjaloha;Pwd=KkeL7by%&!!OO;`

