# 🔍 Análisis Completo: bulk_create_cpanel3.sh

**Ubicación:** `/root/scripts/bulk_create_cpanel3.sh`  
**Servidor:** `72.61.45.136`  
**Modo de uso:** `bulk_create_cpanel3.sh --interactive`

---

## 📋 Resumen Ejecutivo

Este script automatiza la creación de cuentas cPanel con:
- ✅ Creación de cuenta cPanel vía WHM API
- ✅ Configuración de claves SSH
- ✅ Creación de base de datos MySQL
- ✅ Clonado de repositorio Git
- ✅ Instalación de Composer
- ✅ Ejecución de script de setup

**Modos de operación:**
- `--interactive` - Modo interactivo (pregunta datos)
- `--csv FILE` - Modo masivo desde CSV
- `--dry-run` - Simulación sin crear
- `--verbose` - Salida detallada

---

## 🔧 Funciones Principales

### 1. `create_account()` - Crear Cuenta cPanel

**Inputs:**
- `domain` - Dominio del sitio
- `user` - Usuario cPanel (máx 8 caracteres por defecto)
- `pass` - Contraseña (generada si está vacía)
- `plan` - Plan de hosting (default: "default")
- `email` - Email de contacto (default: "admin@example.com")
- `quota` - Cuota en MB (0 = ilimitado)

**Proceso:**
1. Verifica si el usuario ya existe
2. Si es `--dry-run`, solo muestra lo que haría
3. Ejecuta `whmapi1 createacct` para crear la cuenta
4. Guarda credenciales en `/root/credenciales`
5. Configura claves SSH
6. Pregunta si crear base de datos MySQL
7. Pregunta si clonar repositorio

**Outputs:**
- Cuenta cPanel creada
- Credenciales guardadas en `/root/credenciales`
- Registro en `./created_accounts.csv`

---

### 2. `create_mysql_for_new_cpanel_user()` - Crear Base de Datos

**Inputs:**
- `cpanel_user` - Usuario cPanel

**Proceso:**
1. Genera nombres automáticos:
   - Base de datos: `{usuario}_db`
   - Usuario DB: `{usuario}_usr`
   - Contraseña: Generada aleatoriamente (14 caracteres)
2. Crea base de datos vía `uapi Mysql create_database`
3. Crea usuario vía `uapi Mysql create_user`
4. Asigna privilegios ALL vía `uapi Mysql set_privileges_on_database`
5. Guarda credenciales en `/root/credenciales`

**Outputs:**
- Base de datos creada: `{usuario}_db`
- Usuario DB creado: `{usuario}_usr`
- Contraseña generada
- Credenciales guardadas

**Ejemplo de salida:**
```
✅ Base de datos y usuario creados:
   Base: pedroweb_db
   Usuario: pedroweb_usr
   Contraseña: xK9mP2nQ7rT4vW
```

---

### 3. `clone_repo_in_public_html()` - Clonar Repositorio

**Inputs (interactivos):**
- URL del repositorio GitHub
- Nombre de la rama
- ¿Ejecutar script de setup? (s/n)

**Proceso:**
1. Solicita URL del repositorio
2. Clona en `/home/{usuario}/public_html/{repo_name}`
3. Solicita nombre de rama
4. Hace checkout de la rama
5. Si se confirma, ejecuta `setup_cd_project.sh`:
   - Verifica extensiones PHP
   - Instala Composer (si no existe)
   - Ejecuta `composer install`
   - Ejecuta `setup_cd_project.sh`

**Outputs:**
- Repositorio clonado en `public_html`
- Rama configurada
- Composer instalado (si era necesario)
- Script de setup ejecutado (si se confirmó)

---

### 4. `setup_ssh_keys()` - Configurar Claves SSH

**Inputs:**
- `username` - Usuario cPanel

**Proceso:**
1. Busca claves SSH en `/root/.ssh/`:
   - `id_rsa` / `id_rsa.pub`
   - `id_ed25519` / `id_ed25519.pub`
2. Copia claves a `/home/{usuario}/.ssh/`
3. Crea `authorized_keys` con las claves públicas
4. Establece permisos correctos:
   - `.ssh/` → 700
   - Claves privadas → 600
   - Claves públicas → 644
   - `authorized_keys` → 600

**Outputs:**
- Claves SSH configuradas para acceso sin contraseña
- Permisos correctos establecidos

---

### 5. `install_composer()` - Instalar Composer

**Inputs:**
- `username` - Usuario cPanel

**Proceso:**
1. Verifica si Composer existe en `~/.local/bin/composer`
2. Si no existe:
   - Descarga instalador de Composer
   - Instala en `~/.local/bin/composer`
3. Verifica extensión PHP `fileinfo`
4. Muestra versión de Composer

**Outputs:**
- Composer instalado en `~/.local/bin/composer`
- Advertencia si `fileinfo` no está habilitada

---

### 6. `enable_php_extensions()` - Advertencia de Extensiones

**Inputs:**
- `username` - Usuario cPanel

**Proceso:**
- Solo muestra mensaje informativo sobre habilitar extensiones PHP en cPanel

**Nota:** Esta función solo informa, no configura automáticamente.

---

## 🔄 Flujo Completo en Modo Interactivo

### Paso 1: Solicitar Datos
```
Dominio: ejemplo.com
Usuario (máx 8 caracteres): ejemplo
Contraseña (dejar vacío para generar): [Enter]
Plan (default): [Enter]
Email contacto (admin@example.com): [Enter]
Cuota (MB, 0=ilimitado): [Enter]
```

### Paso 2: Crear Cuenta
- Ejecuta `whmapi1 createacct`
- Guarda credenciales
- Configura SSH

### Paso 3: Crear Base de Datos (Opcional)
```
¿Querés crear la base de datos MySQL para ejemplo? (s/n): s
```
- Crea BD: `ejemplo_db`
- Crea usuario: `ejemplo_usr`
- Genera contraseña
- Guarda credenciales

### Paso 4: Clonar Repositorio (Opcional)
```
¿Querés clonar un repositorio en public_html? (s/n): s
🔗 Ingresá el link del repositorio de GitHub: https://github.com/LACOMPANIADIGITAL/ejemplo.git
🔍 Ingresá el nombre de la rama que querés usar: cd-system
⚙️  ¿Querés correr el script de setup? (s/n): s
```
- Clona repositorio
- Hace checkout de rama
- Instala Composer
- Ejecuta `setup_cd_project.sh`

### Paso 5: Continuar o Finalizar
```
¿Deseás crear otra cuenta? (s/n): n
```

---

## 📊 Archivos Generados

### 1. `/root/credenciales`
Contiene todas las credenciales generadas:
```
Cuenta cPanel: ejemplo
Contraseña: xK9mP2nQ7rT4vW
Base de datos: ejemplo_db
Usuario DB: ejemplo_usr
Contraseña DB: yZ8nQ3mR6sT9uV
```

### 2. `./created_accounts.csv`
CSV con cuentas creadas:
```csv
domain,username,password,plan,email,quota
ejemplo.com,ejemplo,xK9mP2nQ7rT4vW,default,admin@example.com,0
```

### 3. `./bulk_create_cpanel.log`
Log de todas las operaciones con timestamps.

---

## 🔗 Integración con Scripts Locales

### Conexión con `create-new-project.sh`

**Flujo esperado:**
1. **VPS:** `bulk_create_cpanel3.sh --interactive`
   - Crea cuenta cPanel
   - Crea base de datos
   - Clona repositorio (si se confirma)
   - Ejecuta setup (si se confirma)

2. **Local:** `create-new-project.sh`
   - Crea directorio local
   - Clona desde cd-system
   - Configura Git

3. **Local:** `setup_cd_project.sh`
   - Configura .env
   - Instala dependencias
   - Ejecuta migraciones

**Información que se necesita del VPS:**
- Nombre de usuario cPanel
- Nombre de base de datos
- Usuario de base de datos
- Contraseña de base de datos
- URL del repositorio (si ya se clonó)

---

## ⚠️ Limitaciones y Consideraciones

### 1. Longitud de Usuario
- Máximo 8 caracteres por defecto (configurable en `/var/cpanel/cpanel.config`)
- El script trunca automáticamente si es más largo

### 2. Extensiones PHP
- El script **NO** habilita extensiones PHP automáticamente
- Solo muestra advertencia
- Requiere configuración manual en cPanel

### 3. Composer
- Se instala en `~/.local/bin/composer` (no global)
- Requiere agregar al PATH manualmente o usar ruta completa

### 4. Script de Setup
- Requiere que `setup_cd_project.sh` exista en el repositorio
- Se ejecuta desde `scripts/setup_cd_project.sh`
- Necesita que las extensiones PHP estén habilitadas

### 5. Claves SSH
- Solo copia claves existentes en `/root/.ssh/`
- No genera nuevas claves si no existen

---

## 🎯 Oportunidades de Mejora

### 1. Automatización de Extensiones PHP
**Problema:** Extensiones PHP no se habilitan automáticamente  
**Solución:** Usar `uapi` para habilitar extensiones vía API

### 2. Validación de Repositorio
**Problema:** No valida que el repositorio exista antes de clonar  
**Solución:** Verificar con `git ls-remote` antes de clonar

### 3. Configuración de PATH
**Problema:** Composer instalado pero no en PATH  
**Solución:** Agregar `~/.local/bin` al PATH del usuario

### 4. Validación de Rama
**Problema:** No valida que la rama exista antes de checkout  
**Solución:** Verificar ramas disponibles antes de checkout

### 5. Integración con Scripts Locales
**Problema:** Proceso separado entre VPS y local  
**Solución:** Crear script unificado que coordine ambos procesos

### 6. Guardado de Credenciales
**Problema:** Credenciales en texto plano en `/root/credenciales`  
**Solución:** Encriptar credenciales o usar gestor de secretos

### 7. Validación de Dominio
**Problema:** No valida formato de dominio  
**Solución:** Validar formato antes de crear cuenta

### 8. Retry Logic
**Problema:** Si falla una operación, no hay reintento  
**Solución:** Implementar retry con backoff exponencial

---

## 📝 Ejemplo de Uso Completo

```bash
# Conectarse al servidor
ssh root@72.61.45.136

# Ejecutar script en modo interactivo
cd /root/scripts
./bulk_create_cpanel3.sh --interactive

# Responder preguntas:
# Dominio: ejemplo.com
# Usuario: ejemplo
# Contraseña: [Enter] (genera automáticamente)
# Plan: [Enter] (default)
# Email: [Enter] (admin@example.com)
# Cuota: [Enter] (0 = ilimitado)

# ¿Crear BD? s
# ¿Clonar repo? s
# Repo URL: https://github.com/LACOMPANIADIGITAL/ejemplo.git
# Rama: cd-system
# ¿Ejecutar setup? s

# Ver credenciales
cat /root/credenciales
```

---

## 🔍 Preguntas Clave Respondidas

### ¿Qué información solicita?
- Dominio, usuario, contraseña, plan, email, cuota
- URL del repositorio (si se clona)
- Nombre de rama (si se clona)
- Confirmación para crear BD
- Confirmación para clonar repo
- Confirmación para ejecutar setup

### ¿Qué recursos crea?
- Cuenta cPanel
- Base de datos MySQL
- Usuario de base de datos
- Directorio `public_html/{repo_name}`
- Instalación de Composer

### ¿Qué archivos genera?
- `/root/credenciales` - Credenciales
- `./created_accounts.csv` - Lista de cuentas
- `./bulk_create_cpanel.log` - Log de operaciones

### ¿Cómo se integra con scripts locales?
- El script del VPS puede clonar el repo y ejecutar `setup_cd_project.sh`
- O se puede hacer manualmente desde local después de crear la cuenta

---

**Última actualización:** Noviembre 2024  
**Estado:** ✅ ANÁLISIS COMPLETO

