# AsaIT CRM · Instalación en VPS cPanel/WHM

Este paquete conserva empresas, inventario y fichas técnicas, contratos, visitas, mantenimiento preventivo/correctivo con checklist, evidencias, informes individuales y mensuales en PDF, acceso de clientes y contraseñas de equipos cifradas.

Es una instalación independiente: usa PHP y MySQL del VPS y acceso con correo/contraseña propios. No requiere WordPress, Joomla, Node.js, npm o Composer en el servidor. El frontend ya está compilado. La instalación empieza vacía; la demostración es ficticia y vive solo en el navegador. No se importaron datos del CRM alojado en ChatGPT.

## 1. Crear el subdominio

En cPanel → Dominios → Crear un nuevo dominio, escribe `gestion.asait.com.mx`, desmarca compartir la raíz del dominio principal y usa `public_html/gestion` como raíz del documento. Conserva el sitio principal de AsaIT en su carpeta actual.

En el proveedor DNS que administra asait.com.mx, crea o ajusta solamente el registro A de `gestion` hacia la IP pública de tu VPS. Si existe un AAAA para ese mismo subdominio, debe apuntar a la IPv6 correcta del VPS o retirarse si no lo usas. No cambies MX ni los registros del correo.

Espera a que el DNS resuelva y activa SSL/AutoSSL en cPanel → SSL/TLS Status. La aplicación exige HTTPS en producción.

## 2. Seleccionar PHP para este subdominio

En MultiPHP Manager selecciona solamente gestion.asait.com.mx y asigna PHP 8.3 o 8.4 actualizado. El mínimo del instalador es PHP 8.2. No cambies la versión de otros dominios.

Extensiones necesarias: PDO MySQL, OpenSSL, mbstring, fileinfo, session y JSON. En MultiPHP INI Editor para este subdominio establece:

- upload_max_filesize = 6M
- post_max_size = 8M
- memory_limit = 128M o superior
- display_errors = Off
- log_errors = On

Apache o LiteSpeed debe permitir `.htaccess`. El API usa api.php de forma directa; las reglas también añaden cabeceras de protección y navegación de la interfaz. No se incluye configuración para Nginx sin Apache: habría que adaptarla si tu VPS usa ese escenario.

## 3. Subir las carpetas a su lugar

Abre el Administrador de archivos de cPanel y entra a tu carpeta de usuario, por ejemplo `/home/USUARIOCPANEL`, un nivel por encima de `public_html`. Sube y extrae el ZIP ahí en una carpeta temporal; después mueve sus dos carpetas de instalación a estas rutas exactas:

- `public_html/gestion/`: aquí va el CONTENIDO de la carpeta pública del paquete, incluidos index.html, api.php, asait.png, assets y el archivo oculto .htaccess.
- `asait-crm-private/`: aquí va la carpeta privada completa, al lado de public_html; jamás dentro de public_html.

Resultado esperado:

    /home/USUARIOCPANEL/public_html/gestion/index.html
    /home/USUARIOCPANEL/public_html/gestion/api.php
    /home/USUARIOCPANEL/asait-crm-private/app.php
    /home/USUARIOCPANEL/asait-crm-private/install.php

No subas el ZIP, código fuente de desarrollo, documentos, copias de configuración o respaldos a la carpeta pública. Activa “Mostrar archivos ocultos” en el administrador para comprobar .htaccess.

`api.php` busca automáticamente la carpeta privada dos niveles por encima de la carpeta gestion. Si cambias esa estructura debes ajustar esa ruta en api.php. La ruta /home puede ser distinta en tu servidor; la relación entre carpetas debe ser la misma.

Si public_html/gestion ya contiene otro sistema, respáldalo y usa una carpeta nueva antes de continuar. No mezcles instalaciones.

## 4. Crear la base de datos

En cPanel → Asistente de bases de datos MySQL / Database Wizard, crea una base nueva exclusiva del CRM y un usuario MySQL. Asocia el usuario a esa base con todos los privilegios de ESA base. Anota los nombres completos, incluido el prefijo que añade cPanel. No uses la base de WordPress, Joomla u otra aplicación.

No importes schema.sql a mano: el instalador se encarga de crear las tablas. Debe comenzar vacía.

## 5. Ejecutar el instalador

Abre Terminal de cPanel o SSH como el usuario propietario de la cuenta, no como root. No pegues contraseñas en el chat ni las pongas en comandos. Con PHP 8.3 de EasyApache la orden habitual es:

    /opt/cpanel/ea-php83/root/usr/bin/php "$HOME/asait-crm-private/install.php"

Con PHP 8.4 sustituye ea-php83 por ea-php84. Si usas otro proveedor de PHP, primero identifica su ruta real. El PHP de la terminal y el del subdominio deben tener las extensiones requeridas.

El instalador pedirá, en la propia terminal:

1. URL: https://gestion.asait.com.mx
2. Host MySQL: normalmente localhost.
3. Nombre completo de base de datos.
4. Usuario MySQL completo y su contraseña.
5. Tu correo y nombre de administrador.
6. Tu nueva contraseña de administrador y confirmación (12 a 72 bytes).

Las contraseñas se introducen sin mostrarlas. El instalador genera la clave de cifrado y config.php con permisos privados. Se niega a instalar sobre una configuración existente o una base que ya contenga tablas.

Si ocurre un error después de crear tablas, no borres una base con datos: revisa el motivo. Para repetir una instalación inicial fallida usa otra base nueva/vacía. Si aparece que no puede ocultar la entrada, ejecuta desde una terminal interactiva que tenga stty disponible.

## 6. Primera entrada y comprobación

Abre https://gestion.asait.com.mx y entra con el correo y contraseña de administrador que acabas de elegir. No hay usuario o contraseña predeterminados.

Registra una empresa real, un equipo y una bitácora de prueba. Comprueba guardar/editar, revelar y ocultar la contraseña del equipo, subir una evidencia y descargar PDF individual y mensual. Publica únicamente la bitácora que deban ver los clientes.

En Accesos → Autorizar cliente, elige su empresa y correo. El CRM mostrará un enlace de activación de uso único, válido durante 48 horas. Compártelo directamente con esa persona; no se envían correos automáticamente. El cliente establece su contraseña y después entra con su correo. Solo podrá consultar su empresa y las bitácoras publicadas; no podrá editar ni ver credenciales, rutas de respaldo o notas internas.

Antes de usarlo con clientes, comprueba también el portal desde una ventana privada con una cuenta de prueba. Revocar bloquea el acceso y las sesiones. Volver a autorizar un correo cierra sus sesiones, invalida su contraseña anterior y genera un enlace nuevo.

## 7. Respaldos y recuperación

Respalda juntos la base MySQL, `asait-crm-private/uploads/` y `asait-crm-private/config.php`. Sin la clave de config.php no se pueden descifrar las contraseñas guardadas. Conserva una copia protegida fuera del VPS. No guardes respaldos dentro de public_html.

Las copias automáticas de cPanel deben incluir los archivos privados de la cuenta y la base de datos. Configura su frecuencia en tu VPS y realiza una prueba de restauración en una cuenta aislada. Este paquete no activa tareas de respaldo automáticamente.

Para cambiar tu contraseña, usa Mi contraseña dentro del CRM. Si olvidaste la del administrador, desde tu terminal ejecuta:

    /opt/cpanel/ea-php83/root/usr/bin/php "$HOME/asait-crm-private/reset-password.php"

La cuenta propietaria del servidor puede restablecer el administrador desde la terminal. Los accesos al VPS/cPanel deben mantenerse privados. Los cambios de contraseña invalidan otras sesiones.

## Problemas frecuentes

- 503 “todavía no está instalado”: falta ejecutar install.php, se colocaron mal las carpetas o PHP no puede leer la carpeta privada.
- 403 por HTTPS: entra con https. El VPS debe terminar TLS en Apache/LiteSpeed. Si hay un proxy inverso, configura su terminación HTTPS antes de usar el CRM; no actives development en producción.
- API 500: verifica credenciales MySQL, extensiones y permisos del propietario. Revisa el log PHP del subdominio. No habilites display_errors al público.
- No sube imágenes: revisa los límites PHP, los permisos de uploads y que sea JPG/PNG/WebP válido de hasta 5 MB.
- No mantiene la sesión: revisa HTTPS, cookies y permisos de la carpeta sessions. La sesión termina tras una hora sin actividad o a las ocho horas de haberse iniciado.

## Alcance de esta entrega

Aplicación preparada para instalar y validar en tu VPS, no instalada remotamente. Sin facturación ni correos de invitación automáticos. Los informes mensuales usan bitácoras publicadas y visitas realizadas del mes elegido; las visitas vinculadas no se suman como trabajos extra. La conformidad es un nombre escrito, no una firma manuscrita.

Fuentes técnicas: documentación oficial de cPanel sobre Dominios y MySQL Database Wizard, y manual oficial de PHP sobre password_hash y OpenSSL. La guía se preparó el 27 de octubre de 2026.
