# Despliegue en cPanel/WHM con PHP 8.4

Guía de producción para `programa.marketcomunicaciones.com` en AlmaLinux con
cPanel/WHM, Apache y MySQL/MariaDB existentes.

## Estructura recomendada

En el servidor actual, la aplicación se instala en:

```text
/home/marketcom/public_html/programa
```

El dominio debe publicar exclusivamente:

```text
/home/marketcom/public_html/programa/public
```

En **cPanel → Domains → Manage**, configurar el Document Root de
`programa.marketcomunicaciones.com` con esa ruta terminada en `/public`.
Publicar la raíz del repositorio provoca un bucle de reescritura y un error 500
`AH00124: Request exceeded the limit of 10 internal redirects`.

En **cPanel → MultiPHP Manager**, asignar PHP 8.4 al subdominio. cPanel debe
gestionar el VirtualHost y PHP-FPM; no copiar `deploy/apache-programa.conf` a la
configuración global de Apache en este caso.

## Instalación

La ruta habitual de PHP 8.4 en EasyApache es:

```bash
/opt/cpanel/ea-php84/root/usr/bin/php -v
```

Clonar el repositorio privado usando una Deploy Key de solo lectura:

```bash
git clone git@github.com:uruguayito28/programasmarket.git /home/marketcom/public_html/programa
cd /home/marketcom/public_html/programa
```

Instalar Composer si todavía no está disponible:

```bash
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
/opt/cpanel/ea-php84/root/usr/bin/php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm -f /tmp/composer-setup.php
```

Instalar dependencias con PHP 8.4:

```bash
cd /home/marketcom/public_html/programa
COMPOSER_ALLOW_SUPERUSER=1 /opt/cpanel/ea-php84/root/usr/bin/php /usr/local/bin/composer install --no-dev --optimize-autoloader
cp .env.example .env
```

Completar `.env` con `APP_URL`, MySQL y Bunny.net. No guardar `.env` ni claves
en Git.

## Base, administrador e importación

```bash
cd /home/marketcom/public_html/programa
/opt/cpanel/ea-php84/root/usr/bin/php bin/migrate.php
```

Crear el superadministrador sin mostrar la contraseña:

```bash
read -s ADMIN_PASS
/opt/cpanel/ea-php84/root/usr/bin/php bin/create-admin.php "admin@dominio.com" "$ADMIN_PASS" "Administrador"
unset ADMIN_PASS
```

Validar e importar el respaldo MongoDB ubicado fuera del directorio público:

```bash
/opt/cpanel/ea-php84/root/usr/bin/php bin/import-mongo.php /root/programasmarket-backup.json --dry-run
/opt/cpanel/ea-php84/root/usr/bin/php bin/import-mongo.php /root/programasmarket-backup.json
```

## Permisos

Ajustar el propietario al usuario cPanel `marketcom` y permitir escritura solo
en `storage`:

```bash
chown -R marketcom:marketcom /home/marketcom/public_html/programa
find /home/marketcom/public_html/programa -type d -exec chmod 755 {} \;
find /home/marketcom/public_html/programa -type f -exec chmod 644 {} \;
chmod -R 775 /home/marketcom/public_html/programa/storage
```

## Aplicar y comprobar

Si el cambio de dominio se hizo desde cPanel, la configuración se reconstruye
automáticamente. Desde root también se puede validar:

```bash
/usr/local/cpanel/scripts/rebuildhttpdconf
apachectl configtest
/usr/local/cpanel/scripts/restartsrv_httpd
curl -i https://programa.marketcomunicaciones.com/health
```

Resultado esperado:

```json
{"ok":true,"database":"up"}
```

Una respuesta `503` con `database: down` indica que Apache/PHP ya funcionan y
que deben revisarse las credenciales MySQL de `.env`.

## Actualizaciones

```bash
cd /home/marketcom/public_html/programa
git pull --ff-only
COMPOSER_ALLOW_SUPERUSER=1 /opt/cpanel/ea-php84/root/usr/bin/php /usr/local/bin/composer install --no-dev --optimize-autoloader
/opt/cpanel/ea-php84/root/usr/bin/php bin/migrate.php
```

El respaldo JSON debe mantenerse fuera de `public`, ya que puede contener datos
sensibles.

## Copias automáticas en Bunny

Con `APP_KEY` y las credenciales Bunny configuradas, agregar este cron desde
**cPanel → Cron Jobs**:

```bash
0 3 * * * cd /home/marketcom/public_html/programa && /opt/cpanel/ea-php84/root/usr/bin/php bin/backup-database.php >> storage/logs/backup.log 2>&1
```

El proceso conserva cinco copias automáticas diarias cifradas. El
superadministrador puede crear, descargar y restaurar copias desde
`/admin/backups`. No cambiar `APP_KEY`, porque se utiliza para cifrarlas.
