# Sistema de Q/A, Backup y Rollback para cPanel/WHM

## 📋 Tabla de Contenidos

1. [Sistema de Checklist Q/A](#sistema-de-checklist-qa)
2. [Backup Diario Automático](#backup-diario-automático)
3. [Sistema de Rollback](#sistema-de-rollback)
4. [Implementaciones de Seguridad](#implementaciones-de-seguridad)
5. [Configuración Inicial](#configuración-inicial)
6. [Uso y Ejemplos](#uso-y-ejemplos)

---

## 🧪 Sistema de Checklist Q/A

### Descripción

El sistema de checklist Q/A permite verificar automáticamente el estado de salud de la aplicación web, incluyendo:

- ✅ Verificaciones de seguridad
- ✅ Verificaciones de base de datos
- ✅ Verificaciones de archivos y permisos
- ✅ Verificaciones de configuración
- ✅ Verificaciones de rendimiento
- ✅ Verificaciones de conectividad

### Endpoints Disponibles

#### 1. Página de Administración (Requiere autenticación)

```
GET /cd-system/qa
```

Muestra una interfaz visual con todos los resultados del checklist.

#### 2. API - Resultados Completos

```
GET /cd-system/qa/results?detailed=true
```

Headers requeridos (si no estás autenticado):
```
X-API-Token: tu-token-api
```

Respuesta:
```json
{
    "timestamp": "2024-01-15T12:00:00.000000Z",
    "overall_status": "ok",
    "checks": {
        "security": [...],
        "database": [...],
        "files": [...],
        "configuration": [...],
        "performance": [...],
        "connectivity": [...]
    },
    "summary": {
        "total": 20,
        "passed": 18,
        "failed": 0,
        "warnings": 2
    }
}
```

#### 3. API - Resumen Rápido

```
GET /cd-system/qa/results
```

Retorna solo el resumen sin detalles.

#### 4. API - Verificaciones Específicas

```
POST /cd-system/qa/check
Content-Type: application/json

{
    "categories": ["security", "database"]
}
```

### Configuración

Agregar token de API en `.env`:

```env
QA_API_TOKEN=tu-token-secreto-aqui
```

O en `config/cd-system.php`:

```php
'qa' => [
    'api_token' => env('QA_API_TOKEN', ''),
],
```

### Ejemplo de Uso

```bash
# Verificar estado completo
curl -H "X-API-Token: tu-token" \
     http://tudominio.com/cd-system/qa/results?detailed=true

# Verificar solo seguridad
curl -X POST -H "X-API-Token: tu-token" \
     -H "Content-Type: application/json" \
     -d '{"categories":["security"]}' \
     http://tudominio.com/cd-system/qa/check
```

---

## 💾 Backup Diario Automático

### Descripción

El sistema de backup diario crea respaldos completos de:

- Base de datos MySQL (comprimida)
- Archivos críticos del proyecto
- Configuraciones (.env, site.php, cd-system.php)
- Assets personalizados (logos, favicons, etc.)

### Configuración Inicial

#### 1. Hacer el script ejecutable

```bash
chmod +x scripts/backup-daily-cpanel.sh
chmod +x scripts/setup-backup-cron.sh
```

#### 2. Configurar variables de entorno (opcional)

El script lee automáticamente desde `.env`, pero puedes sobrescribir:

```bash
export CPANEL_USER="usuario_cpanel"
export CPANEL_DOMAIN="tudominio.com"
export DB_NAME="nombre_bd"
export DB_USER="usuario_bd"
export DB_PASS="password_bd"
```

#### 3. Configurar cron job automático

```bash
./scripts/setup-backup-cron.sh
```

Esto configurará un backup diario a las 2:00 AM.

#### 4. Ejecutar backup manual

```bash
./scripts/backup-daily-cpanel.sh
```

### Estructura de Backups

Los backups se guardan en:

```
storage/app/backups/daily/
├── 20240115_020000/
│   ├── backup-info.json
│   ├── database/
│   │   └── nombre_bd_20240115_020000.sql.gz
│   ├── files/
│   │   ├── storage/app/public/
│   │   ├── public/cd-project/img/logos/
│   │   └── ...
│   └── config/
│       ├── .env
│       ├── site.php
│       └── cd-system.php
└── 20240116_020000/
    └── ...
```

### Retención de Backups

Por defecto, el sistema mantiene los últimos **30 días** de backups. Los más antiguos se eliminan automáticamente.

### Información del Backup

Cada backup incluye un archivo `backup-info.json` con:

```json
{
    "timestamp": "20240115_020000",
    "date": "2024-01-15T02:00:00+00:00",
    "cpanel_user": "usuario",
    "cpanel_domain": "tudominio.com",
    "database": {
        "name": "nombre_bd",
        "backup_file": "database/nombre_bd_20240115_020000.sql.gz"
    },
    "backup_type": "daily",
    "version": "abc123def456",
    "size": {
        "database": "5.2M",
        "files": "12.3M",
        "total": "17.5M"
    }
}
```

---

## 🔄 Sistema de Rollback

### Descripción

El sistema de rollback permite restaurar completamente una aplicación web a un estado anterior, incluyendo:

1. Eliminación de cuenta cPanel (opcional)
2. Creación de nueva cuenta cPanel (opcional)
3. Restauración de base de datos
4. Restauración de archivos
5. Configuración de permisos y cache

### Requisitos Previos

#### 1. Configurar WHM API (Opcional pero recomendado)

Para automatizar la creación/eliminación de cuentas cPanel, necesitas:

```bash
export WHM_API_URL="https://tu-servidor-whm:2087"
export WHM_API_TOKEN="tu-token-api-whm"
```

**Cómo obtener el token WHM:**

1. Accede a WHM
2. Ve a **API Tokens** → **Generate Token**
3. Copia el token generado

#### 2. Verificar acceso a MySQL

El script necesita acceso a MySQL para restaurar la base de datos.

### Uso del Rollback

#### 1. Listar backups disponibles

```bash
ls -1td storage/app/backups/daily/*/
```

#### 2. Ejecutar rollback

```bash
./scripts/rollback-cpanel.sh storage/app/backups/daily/20240115_020000
```

#### 3. Rollback forzado (sin confirmación)

```bash
./scripts/rollback-cpanel.sh storage/app/backups/daily/20240115_020000 --force
```

### Proceso de Rollback

El script ejecuta los siguientes pasos:

1. **Backup de Seguridad**: Crea un backup rápido antes del rollback
2. **Eliminación de Cuenta**: Elimina la cuenta cPanel actual (si está configurado)
3. **Creación de Cuenta**: Crea una nueva cuenta cPanel (si está configurado)
4. **Restauración de BD**: Restaura la base de datos desde el backup
5. **Restauración de Archivos**: Restaura archivos críticos y configuraciones
6. **Configuración**: Ajusta permisos y regenera cache

### Verificación Post-Rollback

Después del rollback, ejecuta el checklist Q/A:

```bash
curl http://tudominio.com/cd-system/qa/results
```

---

## 🔒 Implementaciones de Seguridad

### Verificaciones de Seguridad Incluidas

El checklist Q/A verifica automáticamente:

1. **Archivo .env protegido**: Verifica que existe y no está en git
2. **APP_KEY configurado**: Verifica que la clave de aplicación está configurada
3. **Permisos de storage**: Verifica permisos de escritura
4. **Permisos de cache**: Verifica permisos de bootstrap/cache
5. **Modo debug**: Verifica que APP_DEBUG está desactivado en producción
6. **HTTPS**: Verifica conexión HTTPS en producción

### Mejores Prácticas de Seguridad

#### 1. Proteger el Token de API Q/A

```env
# .env
QA_API_TOKEN=genera-un-token-seguro-aqui
```

Generar token seguro:
```bash
openssl rand -base64 32
```

#### 2. Proteger Scripts de Backup

```bash
# Solo el propietario puede leer/escribir
chmod 600 scripts/backup-daily-cpanel.sh
chmod 600 scripts/rollback-cpanel.sh
```

#### 3. Proteger Archivos de Backup

Los backups contienen información sensible. Asegúrate de:

- No subirlos a repositorios públicos
- Usar permisos restrictivos: `chmod 700 storage/app/backups`
- Considerar encriptación para backups sensibles

#### 4. Configurar Firewall

Asegúrate de que solo los servicios necesarios estén expuestos:

```bash
# Ejemplo con UFW (Ubuntu)
ufw allow 22/tcp    # SSH
ufw allow 80/tcp    # HTTP
ufw allow 443/tcp   # HTTPS
ufw enable
```

#### 5. Monitoreo de Logs

Revisa regularmente los logs de seguridad:

```bash
tail -f storage/logs/laravel.log
tail -f storage/logs/backup-cron.log
```

---

## ⚙️ Configuración Inicial

### Paso 1: Instalar Dependencias

```bash
composer install
npm install
```

### Paso 2: Configurar Variables de Entorno

```bash
cp .env.example .env
php artisan key:generate
```

Editar `.env` con tus configuraciones.

### Paso 3: Configurar Base de Datos

```bash
php artisan migrate
php artisan db:seed
```

### Paso 4: Configurar Backups Automáticos

```bash
chmod +x scripts/*.sh
./scripts/setup-backup-cron.sh
```

### Paso 5: Configurar WHM API (Opcional)

```bash
export WHM_API_URL="https://tu-servidor:2087"
export WHM_API_TOKEN="tu-token"
```

Agregar a `.bashrc` o `.zshrc` para persistencia.

### Paso 6: Verificar Instalación

```bash
# Ejecutar checklist Q/A
curl http://tudominio.com/cd-system/qa/results

# Ejecutar backup manual
./scripts/backup-daily-cpanel.sh
```

---

## 📚 Uso y Ejemplos

### Ejemplo 1: Verificación Diaria Automática

Configurar un cron job para verificar el estado cada hora:

```bash
# Agregar a crontab
0 * * * * curl -H "X-API-Token: tu-token" http://tudominio.com/cd-system/qa/results >> /var/log/qa-check.log 2>&1
```

### Ejemplo 2: Backup Antes de Actualización

```bash
# Crear backup antes de actualizar
./scripts/backup-daily-cpanel.sh

# Hacer actualización
git pull origin main
composer install
php artisan migrate

# Verificar que todo funciona
curl http://tudominio.com/cd-system/qa/results

# Si hay problemas, hacer rollback
./scripts/rollback-cpanel.sh storage/app/backups/daily/[backup-mas-reciente]
```

### Ejemplo 3: Restauración de Emergencia

```bash
# 1. Identificar el backup más reciente
ls -1td storage/app/backups/daily/*/ | head -1

# 2. Ejecutar rollback
./scripts/rollback-cpanel.sh storage/app/backups/daily/20240115_020000

# 3. Verificar restauración
curl http://tudominio.com/cd-system/qa/results?detailed=true
```

### Ejemplo 4: Integración con Monitoreo Externo

```bash
#!/bin/bash
# check-health.sh

RESPONSE=$(curl -s -H "X-API-Token: tu-token" \
    http://tudominio.com/cd-system/qa/results)

STATUS=$(echo $RESPONSE | jq -r '.overall_status')

if [ "$STATUS" != "ok" ]; then
    # Enviar alerta
    curl -X POST https://tu-webhook.com/alert \
        -H "Content-Type: application/json" \
        -d "{\"status\": \"$STATUS\", \"details\": $RESPONSE}"
fi
```

---

## 🐛 Solución de Problemas

### Problema: Backup falla por permisos

**Solución:**
```bash
chmod -R 755 storage/app/backups
chown -R usuario:usuario storage/app/backups
```

### Problema: Rollback no puede restaurar BD

**Solución:**
```bash
# Verificar credenciales en .env
grep DB_ .env

# Verificar acceso MySQL
mysql -u usuario -p nombre_bd
```

### Problema: Checklist Q/A retorna 401

**Solución:**
```bash
# Verificar token configurado
grep QA_API_TOKEN .env

# O autenticarse en la aplicación
# Acceder a /cd-system/qa desde el navegador
```

### Problema: Cron job no se ejecuta

**Solución:**
```bash
# Verificar que el cron está activo
crontab -l

# Verificar logs
tail -f storage/logs/backup-cron.log

# Verificar permisos del script
ls -la scripts/backup-daily-cpanel.sh
```

---

## 📝 Notas Adicionales

### Limitaciones

1. **WHM API**: Requiere configuración manual si no tienes acceso WHM API
2. **Espacio en Disco**: Los backups pueden ocupar mucho espacio. Ajusta la retención según necesites
3. **Tiempo de Ejecución**: Backups grandes pueden tardar varios minutos

### Recomendaciones

1. **Backups Remotos**: Considera sincronizar backups a almacenamiento remoto (S3, Google Drive, etc.)
2. **Monitoreo**: Configura alertas cuando el checklist Q/A falle
3. **Pruebas**: Prueba el proceso de rollback en un entorno de desarrollo antes de producción
4. **Documentación**: Mantén documentación actualizada de cada cliente/proyecto

---

## 📞 Soporte

Para problemas o preguntas:

1. Revisa los logs: `storage/logs/`
2. Ejecuta el checklist Q/A: `/cd-system/qa/results`
3. Verifica la documentación de Laravel y cPanel

---

**Última actualización**: Enero 2024

