# Despliegue en WHM/cPanel

## 1. Dominios y document roots

En la cuenta cPanel de `ventasimparables.co`, configura:

| Host | Document root | Función |
|---|---|---|
| `ventasimparables.co` | ruta del repositorio + `/frontend` | Web comercial y SPA |
| `api.ventasimparables.co` | ruta del repositorio + `/backend/public` | API JSON |

Activa AutoSSL para ambos hosts y fuerza HTTPS.

## 2. PHP

En MultiPHP Manager, asigna PHP 8.3 a `api.ventasimparables.co`. Habilita `pdo_mysql`, `json`, `openssl`, `mbstring` y `fileinfo`.

El frontend no requiere PHP.

## 3. Variables

Copia `.env.example` a `.env` fuera del document root público. En producción:

- `APP_ENV=production`
- `APP_DEBUG=false`
- `APP_URL=https://api.ventasimparables.co`
- `APP_ALLOWED_ORIGINS=https://ventasimparables.co`
- `COOKIE_SECURE=true`
- `COOKIE_DOMAIN=.ventasimparables.co`
- usa secretos aleatorios distintos para `APP_KEY` y `AUTH_OTP_PEPPER`
- configura las credenciales MySQL, email, IA y pasarela

Para habilitar el primer checkout mediante enlaces seguros de una pasarela:

- `BILLING_PROVIDER=hosted_link`
- completa `BILLING_CHECKOUT_URL_{PLAN}_{MONEDA}` con URLs HTTPS vigentes

Mientras el proveedor esté `unconfigured`, la API conserva la selección del usuario y bloquea el pago con un error explícito; nunca simula una transacción.

Nunca confirmes `.env` en Git.

## 4. Base de datos

Ejecuta en orden:

```bash
mysql -u USUARIO -p BASE < database/migrations/0001_core.sql
mysql -u USUARIO -p BASE < database/migrations/0002_identity_billing.sql
```

## 5. Configuración del frontend

Confirma en `frontend/assets/js/config.js`:

```js
export const runtimeConfig = Object.freeze({
  apiBaseUrl: 'https://api.ventasimparables.co/api/v1',
});
```

## 6. Verificación

1. `GET https://api.ventasimparables.co/api/v1/health`
2. Abrir `https://ventasimparables.co`
3. Probar solicitud y verificación OTP.
4. Confirmar que el borrador del Studio persiste después de cerrar sesión y volver a entrar.
5. Confirmar que una ruta interna recargada, por ejemplo `/precios`, regresa `frontend/index.html`.
6. Confirmar que la respuesta API nunca contiene HTML.
7. Probar el checkout en la pasarela sandbox y su retorno antes de publicar URLs productivas.
8. Ejecutar `./scripts/check.sh`.

## 7. Rollback

Despliega por tags. Mantén el tag anterior y un dump previo a cada migración. El rollback de código no sustituye una migración compensatoria de base de datos.
