# GUÍA DE INSTALACIÓN EN CPANEL

## 1. CREAR BASE DE DATOS POSTGRESQL

### En cPanel:
1. Busca **"PostgreSQL Databases"**
2. Click en **"Create Database"**
3. Nombre: `cler_admin`
4. Click **"Create Database"**

### Crear Usuario:
1. En la misma página, sección **"PostgreSQL Users"**
2. Username: `cler_user`
3. Password: `TU_PASSWORD_SEGURO` (guárdalo)
4. Click **"Create User"**

### Asignar Permisos:
1. Sección **"Add User To Database"**
2. User: `cler_user`
3. Database: `cler_admin`
4. Click **"Add"**
5. Marca **"ALL PRIVILEGES"**
6. Click **"Make Changes"**

### Importar SQL:
1. En cPanel, busca **"phpPgAdmin"** o **"PostgreSQL"**
2. Selecciona la base de datos `cler_admin`
3. Click en **"SQL"**
4. Copia y pega el contenido de `database_complete.sql`
5. Click **"Execute"**

---

## 2. CONFIGURAR CREDENCIALES

### Archivo: `public/api/config.php`

```php
<?php
// CONFIGURACIÓN PARA CPANEL
define('DB_HOST', 'localhost'); // O la IP que te dé cPanel
define('DB_PORT', '5432');
define('DB_NAME', 'cler_admin');
define('DB_USER', 'cler_user');
define('DB_PASS', 'TU_PASSWORD_AQUI'); // El que creaste

// API Key (cámbiala por seguridad)
define('API_KEY', 'GENERA_UNA_CLAVE_ALEATORIA_AQUI');
define('TIMEZONE', 'America/Mexico_City');

date_default_timezone_set(TIMEZONE);

function getDB() {
    try {
        $pdo = new PDO(
            "pgsql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME,
            DB_USER,
            DB_PASS,
            [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false
            ]
        );
        return $pdo;
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['error' => 'Database connection failed']);
        exit;
    }
}

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Content-Type: application/json');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}
?>
```

---

## 3. ESTRUCTURA DE CARPETAS EN CPANEL

### Subir archivos a:
```
public_html/
├── api/
│   ├── config.php (EDITAR CREDENCIALES)
│   ├── auth.php
│   ├── admins.php
│   ├── announcements.php
│   ├── downloads.php
│   ├── feedback.php
│   ├── landing.php
│   ├── roles.php
│   ├── telemetry.php
│   └── E2EEncryption.php
├── css/
│   ├── styles.css
│   └── landing.css
├── js/
│   ├── app.js
│   ├── auth.js
│   ├── announcements.js
│   └── landing.js
├── uploads/ (crear carpeta, permisos 755)
├── assets/
│   └── cler-logo.png
├── index.html
├── landing.html
├── download.html
├── favicon.svg
└── .htaccess
```

---

## 4. CONFIGURAR .htaccess

### Archivo: `public_html/.htaccess`

```apache
# Habilitar rewrite
RewriteEngine On

# Forzar HTTPS (recomendado)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Proteger archivos sensibles
<FilesMatch "^(config\.php|database.*\.sql)$">
    Order allow,deny
    Deny from all
</FilesMatch>

# Permitir acceso a API
<IfModule mod_rewrite.c>
    RewriteRule ^api/(.*)$ api/$1 [L]
</IfModule>

# Comprimir archivos
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule>

# Cache
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
</IfModule>
```

---

## 5. PERMISOS DE CARPETAS

### En cPanel File Manager:
1. Carpeta `uploads/`: **755** (rwxr-xr-x)
2. Archivos PHP: **644** (rw-r--r--)
3. Carpeta `api/`: **755**

---

## 6. CREDENCIALES DE ACCESO

### Admin por defecto:
- **Usuario:** `admin`
- **Password:** `admin123`
- **Email:** `admin@cler.com`

⚠️ **IMPORTANTE:** Cambia la contraseña inmediatamente después del primer login.

### Cambiar password:
```sql
-- En phpPgAdmin, ejecuta:
UPDATE admin_users 
SET password = '$2y$10$NUEVO_HASH_AQUI' 
WHERE username = 'admin';
```

Para generar hash: https://bcrypt-generator.com/

---

## 7. VERIFICAR INSTALACIÓN

### Prueba estas URLs:
1. `https://tudominio.com/landing.html` → Landing page
2. `https://tudominio.com/index.html` → Admin (debe redirigir a landing)
3. `https://tudominio.com/api/telemetry.php?action=stats` → API

---

## 8. CONFIGURAR APP ANDROID

### En la app, configurar:
- **URL Servidor:** `https://tudominio.com`
- Habilitar telemetría
- Guardar

---

## 9. SEGURIDAD ADICIONAL

### Cambiar en `config.php`:
```php
define('API_KEY', 'GENERA_CLAVE_ALEATORIA_64_CARACTERES');
```

### Cambiar en Android y PHP:
```
SHARED_KEY = "GENERA_OTRA_CLAVE_ALEATORIA_32_CARACTERES"
```

### Habilitar SSL:
En cPanel → SSL/TLS → Instalar certificado (Let's Encrypt gratis)

---

## 10. TROUBLESHOOTING

### Error de conexión DB:
- Verifica credenciales en `config.php`
- Verifica que PostgreSQL esté activo en cPanel
- Revisa logs en cPanel → Error Log

### Error 500:
- Revisa permisos de archivos
- Verifica sintaxis PHP
- Revisa error_log en cPanel

### API no responde:
- Verifica `.htaccess`
- Verifica que mod_rewrite esté activo
- Prueba acceso directo: `/api/config.php`

---

## ✅ CHECKLIST FINAL

- [ ] Base de datos creada
- [ ] Usuario PostgreSQL creado
- [ ] SQL importado correctamente
- [ ] `config.php` editado con credenciales
- [ ] Archivos subidos a `public_html/`
- [ ] Carpeta `uploads/` con permisos 755
- [ ] `.htaccess` configurado
- [ ] SSL habilitado
- [ ] Landing page funciona
- [ ] Admin login funciona
- [ ] API responde
- [ ] Password admin cambiado
- [ ] App Android conectada

---

## 🚀 LISTO PARA PRODUCCIÓN
